Сейчас расскажу как я добавляю узлы в TVirtualStringTree. То есть попробуем добавить узлы, затем первыми в родительском, последним в родительском. То есть здесь в данном компоненте TVirtualStringTree есть небольшой нюанс, тут не получится как TTreeView сразу добавить и чтобы данные отображались, тут еще необходимо самому предусмотреть отображение самих узлов, а точнее их название (имена), если этого не предусмотреть, то при добавления эти имена все время будут одни и теже — Node. Да с первого взгляда кажется, что очень не удобно, но это компонент по своей функциональности намного отличается от похожего стандартного компонента. Я пользовался последний версией данных компонентов — это 4.8.6, которую я поставил на Delphi 2010, так как была необходимость в одном проекте использовать Ribbon Controls. Так, что если установите на Delphi 7, например, то ничего страшного тут я не вижу.
При добавление узлов, я буду использовать указатели, вот как я указатель описал
type
TNameNode=^TName;
TName=record
NameNode:WideString;
end;
При инициализации компонента, например, при создании формы необходимо задать размер узлов, это делается следующим образом
procedure TForm1.FormCreate(Sender: TObject);
begin
VirtualStringTree1.NodeDataSize:=SizeOf(NewNode);
end;
Да, но это только в том случае, если мы добавляем узлы с помощью указателей. Для добавления узлов существует метод AddChild, а также InsertNode, но они естественно разные, так как второй указывает куда дочерний узел добавлять
- в начало родительского узла
- в конец родительского узла
Далее на событие OnClick TButton - для добавления узла, я написал следующий код
procedure TForm1.Button1Click(Sender: TObject);
begin
Node:=VirtualStringTree1.AddChild(VirtualStringTree1.FocusedNode);
NewNode:=VirtualStringTree1.GetNodeData(Node);
NewNode^.NameNode:=IntToStr(count);
inc(count);
end;
То есть просто с помощью AddChild - добавляю, а FocusedNode - означает то, что добавит в тот узел, который выделен в текущий момент. Перед добавлением узла, мы получаем его размер.
Для добавления узлов в родительский в начало списка или в конец списка также используются еще и дополнительно идентификаторы, это
- amAddChildFirst — добавляет в начало родительского узла
- amAddChildLast — добавляет в конец родительского узла
Для добавления в начало родительского узла я написал следующий код
procedure TForm1.Button2Click(Sender: TObject);
begin
Node:=VirtualStringTree1.InsertNode(VirtualStringTree1.FocusedNode,amAddChildFirst);
NewNode:=VirtualStringTree1.GetNodeData(Node);
NewNode^.NameNode:=IntToStr(count);
inc(count);
end;
То есть почти тоже самое, что и простое добавление. При таком добавлении Caption ваших узлов будут — Node. А в нашем случае как показано в коде, они должны быть числовыми (постепенно увеличиваться). Для этого в TVirtualStringTree существует событие, которое предназначено для отрисовки нужных имен наших узлов — это OnGetText. На данной событие мы пишем следующий код
procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
begin
NewNode:=Sender.GetNodeData(Node);
case Column of
0:CellText:=NewNode^.NameNode;
end;
end;
То есть мы получаем размер добавляемого нашего узла и в первой колонке отображаем его. Да я забыл совсем сказать, что необходимо еще создать колонки, в которых отображать данные, для этого двойным щелчком по TVirtualStringTree мыши и появится окно, в котором необходимо нажать на кнопку добавить и там можно написать свое имя и настроить данную колонку, вот теперь в первой (нулевой) колонке у нас будет отображаться нужный нам текст.
Исходники, скомпилированные в Delphi 2010 качаем тут
Сам компонент можно скачать с сайта разработчика
Автор статьи - Andrey53
Метки: TVirtualStringTRree, VirtualStringTree, дерево данных, деревья