delphi TreeView-создание узлов во время выполнения

может кто-нибудь сказать мне, как сделать следующее:

  • Создать Узлы
  • Включить / Отключить Отдельные Узлы

Я хочу знать, как это сделать во время выполнения приложения, например, в событии OnCreate формы.

3 ответов


добавление узлов:

function FindRootNode(ACaption: String; ATreeView: TTreeView): TTreeNode; 
var LCount: Integer; 
begin 
  result := nil; 
  LCount := 0; 
  while (LCount < ATreeView.Items.Count) and (result = nil) do 
  begin 
    if (ATreeView.Items.Item[LCount].Text = ACaption) and (ATreeView.Items.Item[LCount].Parent = nil) then 
      result := ATreeView.Items.Item[LCount]; 
    inc(LCount); 
  end; 
end;

...

var LDestNode: TTreeNode; 
begin 
  LDestNode := FindRootNode('category', TreeView1); 
  if LDestNode <> nil then 
  begin 
    TreeView1.Items.AddChild(LDestNode, 'node1'); 
    TreeView1.Items.AddChild(LDestNode, 'node2'); 
  end; 
end;

(см. также http://msdn.microsoft.com/en-us/library/70w4awc4.aspx)

Disabeling узле

насколько я знаю, нет способа отключить TreeNode. Единственное, что вы можете сделать, это перехватить событие beforeSelect и отменить выбор там. Не очень хорошо.


@Remus, здесь у вас есть простой пример добавления узлов.

добавление корневого узла (уровень 0)

Var
  Node : TTreeNode;
begin
   //function TTreeNodes.Add(Sibling: TTreeNode; const S: string): TTreeNode;
   Node:=TreeView1.Items.Add(nil,'My Root Node') ;
   Node.ImageIndex:=0;//now you can change any  property of the node
end;

добавление дочернего узла (уровень > 0)

//in this case we add a child node in the current selected node.
    Var
      Node : TTreeNode;
    begin       
       if TreeView1.Selected= nil then exit;       
       Node:=TreeView1.Items.AddChild(TreeView1.Selected,'My Child Node') ;
       Node.ImageIndex:=0;//now you can change any property of the node
    end;

добавление множества узлов

Если вы хотите добавить много узлов, используя loop или что - то еще, что вы должны использовать BeginUpdate перед внесением изменений к TreeView. Когда все изменения завершите, вызовите EndUpdate для показа изменения на экране. BeginUpdate и EndUpdate предотвратить чрезмерные перерисовки и ускорить время обработки, когда узлы добавляются, удаляются или вставляются.

Var
  Node : TTreeNode;
  i    : Integer;
begin
  TreeView1.Items.BeginUpdate;
  try
   for i:=1 to 100 do
   begin
    Node:=TreeView1.Items.Add(nil,'My Root Node '+IntToStr(i)) ;
    Node.ImageIndex:=0;
   end;
  finally
  TreeView1.Items.EndUpdate;
  end;
end;

об отключении узла, не существует никакого свойства, как это.


вы можете отключить выделение в обработчике событий OnChanging. Это событие TTreeView.

procedure TForm.OnChanging(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean);
begin
  AllowChange := CheckSomePropertiesOfNode(Node);
end;