由于刚学DELPHI,对树控件不熟。各位大吓,请给个怎么动态加载节点的例子。 希望贴出源代码,感谢了!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      lv1Node: TTreeNode;
    begin
      TreeView1.Items.Add(nil,'Root');
      lv1Node:= TreeView1.Items.AddChild(TreeView1.Items.Item[0],'Level1');
      TreeView1.Items.AddChild(lv1Node, 'Level2_1');
      TreeView1.Items.AddChild(lv1Node, 'Level2_2');
    end;Root
       |
        - Level1
             |
              - Level2-1
             |
              - Level2_2
      

  2.   

    主要函数有两个  type
         PMyRec = ^TMyRec;
         TMyRec = record
          ID:Integer;                 //部门编号
          GetGrandChild:Boolean;  //孙子节点是否已建立
      end;
    {自定义过程,树的重建}
    procedure TPeopleFrm.ResetTree;
    var ParentNode,TheNode:TTreeNode;
        MyDepart:PMyRec;
        strSql:string;
    begin
      TreeDep.Items.Clear;
      with AdoQ_Dep do
      begin
          if Active then Close;
          SQL.Clear;
          Sql.Add('select * from 部门表 where 部门父号=0');
          Open;  end;  //添加部门树根节点
        if AdoQ_Dep.Eof then
        begin
          with AdoQ_DepModify do
          begin
            try
                Close;
                Sql.Clear;
                Sql.Add('Insert into 部门表(部门编号,部门名称,部门简码,部门父号,部门分类串,部门分类) Values (1,''所有部门'',''bumen'',0,''-1-'','' '' ');
                ExecSql;
            finally
                ShowMessage('部门表打开错误!');
            end;
          end;
          AdoQ_Dep.Requery();
        end;
        New(MyDepart);
        MyDepart^.ID :=AdoQ_Dep.fieldByName('部门编号').AsInteger;
        MyDepart^.GetGrandChild:=False;
        parentNode:=TreeDep.Items.AddObject(nil,AdoQ_Dep.FieldByName('部门名称').AsString,myDepart);
        ParentNode.ImageIndex:=0;
        //添加一级子树
        ADOQ_TmpDep.Close;
        ADOQ_TmpDep.Sql.Clear;
        strSql:='select * from 部门表 where 部门父号='+IntToStr(MyDepart^.ID) +' ' ;
        ADOQ_TmpDep.SQL.Add(strSql);
        ADOQ_TmpDep.Open;
        while not ADOQ_TmpDep.Eof do
        begin
            New(MyDepart);
            MyDepart^.ID:=ADOQ_TmpDep.FieldByName('部门编号').AsInteger;
            theNode:=TreeDep.Items.AddChildObjectFirst(ParentNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDepart);
            MyDepart^.GetGrandChild:=false;
            TheNode.ImageIndex:=1;
            TheNode.SelectedIndex:=2;
            ADOQ_TmpDep.Next;
        end;
        AdoQ_Dep.Next;
      ADOQ_TmpDep.Close;
      AdoQ_Dep.Close;
      //先展开一级
      theNode:=TreeDep.Items.GetFirstNode;
      if theNode<>nil then
      begin
        theNode.Selected:=True;
        TheNode.Expand(False);
      end;
    end;{事件:树的expand 事件,
        功能:展开某节点}
    procedure TPeopleFrm.TreeDepExpanded(Sender: TObject; Node: TTreeNode);
    Var
        TheNode, ChildNode: TTreeNode;
        MyDep: PMyRec;
    Begin
        if PMyRec(Node.Data)^.GetGrandChild Then exit; //如果已经建立孙子
        TheNode:=Node.GetFirstChild;
        while TheNode<>nil do
        begin
          ADOQ_TmpDep.Close;
          ADOQ_TmpDep.SQL.Clear;
          ADOQ_TmpDep.SQL.Add('select * from 部门表 where 部门父号='+IntToStr(PMyRec(TheNode.Data)^.Id)+'  ');
          ADOQ_TmpDep.Open;
          ADOQ_TmpDep.First;
          while not ADOQ_TmpDep.Eof do
          begin
            New(MyDep);
            MyDep^.ID:=ADOQ_TmpDep.FieldByName('部门编号').Asinteger;
            MyDep^.GetGrandChild:=False;    //底层为false
            ChildNode:=TreeDep.Items.AddChildObjectFirst(TheNode,ADOQ_TmpDep.FieldByName('部门名称').AsString,MyDep);
            childNode.ImageIndex:=1;
            childNode.SelectedIndex:=2;
            PMyRec(Node.Data)^.GetGrandChild:=True;
            ADOQ_TmpDep.Next;
          end;
          TheNode:=Node.GetNextChild(TheNode);
        end;
        ADOQ_TmpDep.Close;
    end;
    procedure TPeopleFrm.FormShow(Sender: TObject);
    begin
        ResetTree;
        with AdoQ_PeopleDep do
        begin
            Close;
            Filtered:=False;
            Filter:='部门分类串 like ''%-1-%''';
            Filtered:=True;
            Open;
        end;
        SaveOrRestoreDBGridField(False,caption,DBGrid1);
        DBGrid1.PopupMenu.Tag:=9;end;