简体   繁体   English

delphi TreeView - 在运行时创建节点

[英]delphi TreeView - create nodes at run-time

Can anybody tell me how to do the following: 谁能告诉我如何做以下事情:

  • Create Nodes 创建节点
  • Enable/Disable Individual Nodes 启用/禁用单个节点

I want to know how to do the above at Application run-time, eg in the Form's OnCreate event. 我想知道如何在Application运行时执行上述操作,例如在Form的OnCreate事件中。

@Remus, here you have an simple example adding nodes. @Remus,这里有一个添加节点的简单示例。

Adding a root Node (level 0) 添加根节点(级别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;

Adding a child Node (level > 0) 添加子节点(级别> 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;

Adding many nodes 添加许多节点

if you wanna add many nodes using a loop or something else you must use BeginUpdate before making the changes to the treeview. 如果您想使用循环或其他东西添加许多节点,则必须在对树视图进行更改之前使用BeginUpdate。 When all changes are complete, call EndUpdate to show the changes on screen. 完成所有更改后,请调用EndUpdate以在屏幕上显示更改。 BeginUpdate and EndUpdate prevent excessive redraws and speed up processing time when nodes are added, deleted, or inserted. 在添加,删除或插入节点时,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;

About disable a node, does not exist any property like that. 关于禁用节点,不存在任何类似的属性。

Adding nodes: 添加节点:

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;

(see also http://msdn.microsoft.com/en-us/library/70w4awc4.aspx ) (另请参阅http://msdn.microsoft.com/en-us/library/70w4awc4.aspx

Disabeling a node 消除节点

As far as I know, there is no way to disable a TreeNode. 据我所知,没有办法禁用TreeNode。 Only thing you could do is intercept the beforeSelect-event and cancel the selection there. 你唯一能做的就是拦截beforeSelect-event并取消那里的选择。 Not so nice. 不太好。

You can disable selection in OnChanging event handler. 您可以在OnChanging事件处理程序中禁用选择。 This is event of TTreeView. 这是TTreeView的事件。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM