Сейчас расскажу как я добавляю узлы в 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

Метки: , , ,

Оставить комментарий

Вы можете использовать следующие теги:

*