代码之家  ›  专栏  ›  技术社区  ›  Remus Rigo

Delphi TreeView-在运行时创建节点

  •  9
  • Remus Rigo  · 技术社区  · 15 年前

    有人能告诉我怎么做吗?

    • 创建节点
    • 启用/禁用单个节点

    我想知道如何在应用程序运行时执行上述操作,例如在表单的onCreate事件中。

    3 回复  |  直到 12 年前
        1
  •  9
  •   Leo user370469    15 年前

    添加节点:

    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 )

    禁用节点

    据我所知,没有办法使树烯酮失效。您唯一能做的就是截获beforeselect事件并在那里取消选择。不太好。

        2
  •  14
  •   RRUZ    15 年前

    @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;
    

    添加多个节点

    如果要使用 循环或其他必须使用的内容 在进行更改之前开始更新 到树视图。当所有更改 完成,调用endupdate显示 屏幕上的更改。开始更新 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;
    

    关于禁用节点,不存在这样的任何属性。

        3
  •  2
  •   sjngm quinti    13 年前

    您可以在onchanging事件处理程序中禁用选择。这是ttreeview事件。

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