With ATree do
    begin
        Node:=Items.AddChild(nil,'上海证券交易所');
            ANode:=Items.AddChild(Node,'上海指数');
            New(P); P^.Value:=0;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'上海A股');
            New(P); P^.Value:=1;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'上海B股');
            New(P); P^.Value:=2;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'上海基金');
            New(P); P^.Value:=3;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'上海债券');
            New(P); P^.Value:=4;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
        Node.ImageIndex:=5; Node.SelectedIndex:=5;
        Node:=Items.AddChild(nil,'深圳证券交易所');
            ANode:=Items.AddChild(Node,'深圳指数');
            New(P); P^.Value:=5;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'深圳A股');
            New(P); P^.Value:=6;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'深圳B股');
            New(P); P^.Value:=7;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'深圳基金');
            New(P); P^.Value:=8;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
            ANode:=Items.AddChild(Node,'深圳债券');
            New(P); P^.Value:=9;  P.ValueType:=isMarket;  ANOde.Data:=P;
            ANode.ImageIndex:=6;  ANode.SelectedIndex:=6;
        Node.ImageIndex:=5; Node.SelectedIndex:=5;
        Node:=Items.AddChild(nil,'分类板块');
        Node.ImageIndex:=10; Node.SelectedIndex:=10;
   end;

解决方案 »

  1.   

    前面加
    type
      TTreeData=Record
        Value:      Integer;
        ValueType:  TValueType;
      end;
    var
        Ln: TTreeNode;
        P:  ^TTreeData;
      

  2.   

    还有
      TValueType=(IsBlock,IsExpr,IsMarket,IsMainMap);
      

  3.   

    [email protected]我这的Treeview东西多了,生成子树时特别慢,有好的方法吗?谢谢!
      

  4.   

    Q_find .Close;
    Q_find .SQL.Clear ;
    Q_find .SQL.Add('select * from GSJGGL order by DWDM');
    Q_find .Prepare ;
    Q_find .Open;  Q_find.First;
      Frame_YGDA1.TreeV_GSJG.Items.Clear;
      with Frame_YGDA1 do
       with Q_find do
        while not Q_find .eof do //生成目录
        begin
         if length(Q_find .Fields[0].AsString)=2 then  //代码为2位——一级单位(公司)
            node[1]:=TreeV_GSJG.Items.AddChild(nil,'['+Fields[0].asstring+'] '+Fields[1].asstring);
         if length(d_table.Q_find .Fields[0].AsString)=4 then  //代码为4位——二级单位(各分厂)
            node[2]:=TreeV_GSJG.Items.AddChild(node[1],'['+Fields[0].asstring+'] '+Fields[1].asstring);
         if length(d_table.Q_find .Fields[0].AsString)=6 then  //代码为6位 ——三级单位(处、部门)
            node[3]:=TreeV_GSJG.Items.AddChild(node[2],'['+Fields[0].asstring+'] '+Fields[1].asstring);
         if length(d_table.Q_find .Fields[0].AsString)=8 then  //代码为8位 ——四级单位(科室、车间)
            node[4]:=TreeV_GSJG.Items.AddChild(node[3],'['+Fields[0].asstring+'] '+Fields[1].asstring);
         d_table.Q_find .Next ;
        end;
      

  5.   

    看看我這個TreeView,要的話發給你:
    http://www.csdn.net/cnshare/soft/12/12436.shtm
      

  6.   

    我还是比较喜欢juky_liu(比尔.丐痴) 的。谢谢几位好心的程序员高手了。。
    我先试试!试过后定加分!
    :)
      

  7.   

    这个函数的可以把任何菜单,不管多少级,不管是主菜单还是弹出菜单,根据菜单的从属关系转化显示到treeview中去,大家试试就知道了,很有用,特别是权限控制的时候
    写的很急,变量名没有取的很规范,大家可以自己改改unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Menus, ComCtrls;type
    TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    TreeView1: TTreeView;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    N41: TMenuItem;
    N111: TMenuItem;
    N121: TMenuItem;
    N131: TMenuItem;
    N141: TMenuItem;
    N1311: TMenuItem;
    N1321: TMenuItem;
    N13111: TMenuItem;
    N13121: TMenuItem;
    N13131: TMenuItem;
    N211: TMenuItem;
    N221: TMenuItem;
    N411: TMenuItem;
    N421: TMenuItem;
    N4111: TMenuItem;
    N431: TMenuItem;
    N441: TMenuItem;
    N451: TMenuItem;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    procedure MenuToTree(m: TMenuItem; tn: TTreeNode; t: TTreeView);var
    Form1: TForm1;implementation{$R *.dfm}procedure MenuToTree(m: TMenuItem; tn: TTreeNode; t: TTreeView);
    var
    i: integer;
    node: TTreeNode;
    begin
    for i := 0 to m.Count - 1 do
    begin
    node := t.Items.AddChild(tn, m.Items[i].Caption);
    MenuToTree(m.Items[i], node, t);
    end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    MenuToTree(MainMenu1.Items, nil, TreeView1);
    end;end.
      

  8.   

    我程序里的一段,不知你能否理解(TREEVIEW建树):
    procedure TMDIChild.LoadTreeView;
    var
      strsql,tid:string;
    begin
      try    DataModule3.ADOTable3.open;
        DataModule3.ADOTable3.Locate('DTname',RzComboBox1.Text,[lopartialkey]);
        tid:=inttostr(DataModule3.ADOTable3.FieldByName('id').value);
        strsql:='select * from T where TypeID='+tid;
        DQ.Active :=false;
        DQ.SQL.Clear ;
        DQ.SQL.Add(strsql);
        DQ.Active :=true;
        DQ.Filtered :=true;
        DQ.Filter := 'Parent=0';
        U_DiGui(0,RzTreeView1.TopItem );//从当前0层开始递归建树
      except
        showmessage('字典里没有数据!');
      end;
    end;
    procedure TMDIChild.U_DiGui(parentID:Cardinal;ParentNode:TTreeNode);
    var
      tmpTBData:array of TableData;
      i,j:integer;
      tmpNode:TTreeNode;begin
      j:=DQ.RecordCount;
      setlength(tmpTBData,j);//保存递规上一层结点值
      for i:=0 to j-1 do begin
        tmpTBData[i].ID := Cardinal(DQ.fieldbyname('ID').value);
        tmpTBData[i].Name  := DQ.fieldbyname('Name').value;
        tmpTBData[i].ParentID  := Cardinal(DQ.fieldbyname('Parent').value);
        DQ.Next;
      end;
      for i:=0 to j-1 do begin //递规调用建立所有结点
        tmpNode:=RzTreeView1.Items.AddChild(ParentNode,tmpTBData[i].Name);
     //   tmpNode.ImageIndex:=2;
        new(pData);
        pData^.ID:=tmpTBData[i].ID;
        tmpNode.Data:=pData;
        DQ.Filter := 'Parent=' + IntToStr(Integer(tmpTBData[i].ID));
        if DQ.RecordCount >0 then begin
          U_DiGui(tmpTBData[i].ID,tmpNode );
        end;
      end;
    end;
      

  9.   

    juky_liu(比尔.丐痴) ,
    问个小问题:如果你的node[1]或node[2]不存在,length(d_table.Q_find .Fields[0].AsString)=6时怎么办?
      

  10.   

    看看我的TreeView的Item Editor的实现:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls,Menus;type
      TErrorTreeForm = class(TForm)
        ErrorTreeView: TTreeView;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn4: TBitBtn;
        BitBtn3: TBitBtn;
        BitBtn6: TBitBtn;
        Image1: TImage;
        Label1: TLabel;
        LabeledEditName: TEdit;
        Label2: TLabel;
        procedure FormShow(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn4Click(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure BitBtn6Click(Sender: TObject);
        procedure LabeledEditNameKeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure ErrorTreeViewChange(Sender: TObject; Node: TTreeNode);
      private
        { Private declarations }
      public
        NewNode: TTreeNode;
        { Public declarations }
      end;var
      ErrorTreeForm: TErrorTreeForm;implementation{$R *.dfm}procedure TErrorTreeForm.FormShow(Sender: TObject);
    begin
      NewNode:= TTreeNode.Create(Nil);       //
      NewNode:= Nil;                         // 定义NewNode
    end;procedure TErrorTreeForm.BitBtn1Click(Sender: TObject);  //建同级目录
    var
      CurNode: TTreeNode;
    begin
      LabeledEditName.Text:= '';
      if ErrorTreeView.Selected<> nil then
      begin
        CurNode:= ErrorTreeView.Selected;
        NewNode:= ErrorTreeView.Items.AddChild(CurNode.Parent,'');
      end
      else
        NewNode:= ErrorTreeView.Items.AddChild(nil,'');
      NewNode.Selected:= True;
      LabeledEditName.SetFocus;
    end;procedure TErrorTreeForm.BitBtn2Click(Sender: TObject);  //建下级目录
    var
      CurNode: TTreeNode;
    begin
      LabeledEditName.Text:= '';
      if ErrorTreeView.Selected= nil then Exit;
      CurNode:= ErrorTreeView.Selected;
      NewNode:= ErrorTreeView.Items.AddChild(CurNode,'');
      CurNode.Expand(True);
      NewNode.Selected:= True;
      LabeledEditName.SetFocus;
    end;procedure TErrorTreeForm.BitBtn3Click(Sender: TObject);
    begin
      Close;
    end;procedure TErrorTreeForm.BitBtn4Click(Sender: TObject);
    var
      CurNode,TempNode: TTreeNode;
    begin
      LabeledEditName.Text:= '';
      if ErrorTreeView.Selected= nil then Exit;
      CurNode:= ErrorTreeView.Selected;
      if not CurNode.IsFirstNode then           //删除前移动焦点,默认前移
        TempNode:= CurNode.GetPrev
      else
        TempNode:= CurNode.GetNext;
      CurNode.Delete;
      NewNode.Parent.Expand(True);
      NewNode:= TempNode;
    end;procedure TErrorTreeForm.FormCloseQuery(Sender: TObject;
      var CanClose: Boolean);
    begin
      NewNode.Free;         //关闭时释放资源
    end;procedure TErrorTreeForm.BitBtn6Click(Sender: TObject);
    begin
      //故障分类每级用两个字符表示一级,依次累加
    end;procedure TErrorTreeForm.LabeledEditNameKeyUp(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
      if NewNode = nil then Exit;
      NewNode.Text:= LabeledEditName.Text;     //输入时TreeView同时更新
      if key = 13 then                         //回车时TreeView设置焦点
      begin
        NewNode.Selected:= True;
        ErrorTreeView.SetFocus;
      end;
    end;procedure TErrorTreeForm.ErrorTreeViewChange(Sender: TObject;
      Node: TTreeNode);
    begin
      LabeledEditName.Text:= '';
      if ErrorTreeView.Selected= nil then Exit;
      NewNode:= ErrorTreeView.Selected;
      LabeledEditName.SetFocus;
    end;end.
      

  11.   

    const 
    cTreeCodeFormat='44';//编码格式:XXXX XXXX
    cTreeMaxLevel=3;     //最大编码层次
    cTreeRootTxt:='';    //树的根节点名称         
    procedure TForm1.loadTree;  //初始化树
    var curID,nodeTxt:string;
        level,chindex,cnode,num:integer;
        mynode:array[0..3]of TTreenode;
    begin
    Screen.cursor:=crHourGlass;
    Tree.Enabled:=true;
    level=0;
    Tree.items.clear;
    mynode[level]:=Tree.items.add(Tree.topitem,cTreeRootTxt);
    mynode[level].imageIndex:=0;
    //遍历数据表利用编码字记录排序规律,依次添加树节点(注意记录一定要排序)
    with TreeDB do begin
    try 
      if not Active then open;
      first;
      while not eof do begin
      curid:=trim(FieldByName('debj').AsString);
     nodeTxt:=curId+'_'+Trim(FielByName('depx').AsString);
      level:=GetNodeLevel(cTreeCodeFormat,curID);   //取得代码层次数
      if level>0 then begin
      mynode[level]:=Tree.items.addchild(mynode[level-1],nodeTxt);
      mynode[level].imageindex:=1;
      end;
      next;
      end;
     finally;
      close;
    end;
    mynode[0].expand(False);
    Screen.cursor:=crHourGlass;
    end;
    end;Function TForm1.GetNodelevel(sFormat,sCode:string):integer;
    var
    i,level,iLen:integer;
    begin
       Level:=-1;
       iLen:=0;
       if(sFormat<>'')and(sCode<>'')then
         for i:=1 to Length(sFormat)do    //分析编码格式找出当前代码层次
             begin
               iLen:=ilen+StrtoInt(sFormat[i]);
               if Length(sCode)=iLen then 
                  begin
                    level:=i;
                     break;
                     end;
                   end;
                  result:=level;
                end;