最好有列子
谢谢

解决方案 »

  1.   

    procedure TFrame.TreeRefresh;
    var
      node: TTreeNode;
      DocName, code: string;
      p: pcode;
    begin
      tree.Items[1].DeleteChildren;  with Data.ADOQuery do begin
        if Active then Close;
        SQL.Clear;
        SQL.Add('select * from table'
          +'order by Code');
        Open;
        First;
        while not Eof do begin
          code := FieldByName('CODE').asString;
          DocName := FieldByName('_NAME').asString; 
          new(p);
          p.code := code;
          node := tree.Items.AddChildObject(tree.Items[1], DocName, p);
          node.ImageIndex := 13;
          Next;
        end;
        Close;
      end;
    end;仅供参考~~~~~~~~
      

  2.   

    //tv展开
    procedure TZoneSelection.addCounty();
      var
        newNode : TTreeNode;
    begin
        qryTemp.Active := false;
        qryTemp.First;
        while qryTown.Eof = false do
        begin
            newNode := tv.Items.AddChild(tv.Items.Item[0],qryTown.FieldByName('NAME').AsString);
            newNode.date := qryTown.FieldByName('id').AsInteger;
            newNode.StateIndex := 0;
            newNode.HasChildren := true;
            qryTemp.Next;
        end;
    end;
      

  3.   

    給你個例子!
    procedure Tda.xlmcClick(Sender: TObject);
    var
        nodecel : array[0..10] of TtreeNode;
        sqlstr,s1,s2:string;
        tempstr :array[0..10] of string;
        tempBoolean :array[0..10] of Boolean;
        Nodetitle :TtreeNode;
    begin
        if (xlmc.text='') or (wz.text='') then begin
            
            exit;
        end;
        screen.Cursor:=crHourGlass;
        if Sender<>cmdok then
            key.Text:='0';
        TreeView1.Items.Clear;
        TreeView1.Items.BeginUpdate;
        new(nodeid);
        dispose(nodeid);
        nodecel[0] := TreeView1.Items.AddFirst (nil, xlmc.text);
        nodecel[0].ImageIndex := 0;
        nodecel[0].SelectedIndex := 3;
        if wz.text<>'全部' then
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,id from  绿化档案 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' and 位置='''+wz.text+''' order by 首桩号,首桩米,尾桩号,尾桩米'
        else
            sqlstr:='select 首桩号,首桩米,尾桩号,尾桩米,绿化档案.位置,id from 绿化档案 INNER JOIN lib_位置 ON 绿化档案.位置 = lib_位置.位置 where 道路='''+copy(xlmc.text,1,pos(':',xlmc.text)-1)+''' order by 首桩号,首桩米,尾桩号,尾桩米,lib_位置.序号';
        ADODataSet1.commandtext:=sqlstr;
        ADODataSet1.open;
        while not ADODataSet1.eof  do
        begin
            tempBoolean[1]:=false;
            s1:=ADODataSet1.FieldByName('首桩号').AsString;
            s2:=ADODataSet1.FieldByName('首桩米').AsString;
            if ADODataSet1.FieldByName('首桩米').asinteger=0 then
                sqlstr:= s1
            else
                if ADODataSet1.FieldByName('首桩米').asinteger>0 then
                    sqlstr:= s1 +'(+'+s2+')'
                else
                    sqlstr:= s1 +'('+s2+')';
            sqlstr:= sqlstr+'--';
            s1:=ADODataSet1.FieldByName('尾桩号').AsString;
            s2:=ADODataSet1.FieldByName('尾桩米').AsString;
            if ADODataSet1.FieldByName('尾桩米').asinteger=0 then
                sqlstr:= sqlstr+s1
            else
                if ADODataSet1.FieldByName('尾桩米').asinteger>0 then
                    sqlstr:= sqlstr+s1 +'(+'+s2+')'
                else
                    sqlstr:= sqlstr+s1 +'('+s2+')';
            if wz.text='全部' then
                begin
                if (tempstr[1] <>sqlstr) then
                    begin
                    tempstr[1] :=sqlstr;
                    nodecel[1] := TreeView1.Items.AddChild(nodecel[0], tempstr[1]);
                    nodecel[1].ImageIndex := 1;
                    nodecel[1].SelectedIndex := 3;
                    end;
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[1], ADODataSet1.FieldByName('位置').AsString,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end
            else
                begin
                if (tempstr[1] <>sqlstr) then
                new(nodeid); nodeid^:=ADODataSet1.FieldByName('id').asinteger;
                Nodetitle :=TreeView1.Items.AddChildObject(nodecel[0], sqlstr,nodeid);
                Nodetitle.ImageIndex := 2;
                Nodetitle.SelectedIndex := 3;
                end;
            ADODataSet1.Next;
        end;
        nodecel[0].Expanded := True;
        ADODataSet1.close;
        ADODataSet1.CursorLocation:=clUseClient;
        ADODataSet1.CursorType:=ctDynamic;
        ADODataSet1.LockType:=ltOptimistic;
        TreeView1.Items.endUpdate;
        screen.Cursor:=crDefault;
    end;
      

  4.   

    在每个添加节点的时候,new()一个指针,然后通过AddChildObject或AddObject来实现节点的data数据保存
    至于递归过程的写法,我有一个,
    http://expert.csdn.net/Expert/topic/1719/1719886.xml?temp=.6894342
      

  5.   


    其实很简单的,
    一般,在data中都是记录ID
    给你一小段
    var 
      ObjectID :Integer;
       while not ADOQ2.Eof do
        begin
          ObjectID :=ADOQ2.FieldByName('ID').AsInteger;
          P :=Pointer(ObjectID);
          with Nodes.AddChild(Node, ADOQ2.FieldByName('ModelName').AsString) do
          begin
            Data :=P;
            ImageIndex :=2;
          end;
          ADOQ2.Next;
        end;
      

  6.   

    我这里也有个例子。嘻嘻,还带有填充树。
    type
      ParamGroupNode = ^TParamGroupNode;
      TParamGroupNode = Record
        sSysDataID: string;
        sSysDataGroup: string;
      end;
    -----------------------------procedure TFrmSysBaseDataList.FormShow(Sender: TObject);
    var
      TVNode: ParamGroupNode;
      Node: TTreeNode;
    begin
      inherited;
      SQL := 'select * from SysDatalist';  CDSFillTree.Close;
      CDSFillTree.CommandText := 'select Distinct sSysDataGroup,sSysDataID from SysDatalist';
      CDSFillTree.Open;
      CDSFillTree.First;
      while not CDSFillTree.Eof do
      begin
        New(TVNode);
        TVNode.sSysDataId := CDSFillTree.FieldValues['sSysDataId'];
        TVNode.sSysDataGroup := CDSFillTree.FieldValues['sSysDataGroup'];
        Node := DataListTreeView.Items.AddObject(nil, TVNode.sSysDataGroup, TTreeNode(TVNode));
        CDSFillTree.Next;
        Node.ImageIndex := 0;
        Node.SelectedIndex := 1;
      end;
      CDSFillTree.Close;
      Node := DataListTreeView.Items[0];
      DataListTreeView.Select(Node);
      CDSSysDataList.Filtered := False;
      CDSSysDataList.Filter := 'sSysDataId = ''' + ParamGroupNode(Node.Data).sSysDataID + '''';
      CDSSysDataList.Filtered := True;
    end;
      

  7.   

    大家的都对!
    俺想说一点儿!New的结构体指针在窗体destory时别忘了要Dispose掉哦!
      

  8.   

    我上周刚研究过了,不过代码不在这里
    type
      TXxxx = record
        a : string[10];
        b : string[16];
      end;
    var
      tt : ^TXxxx;for i := 0 to 100 do
    begin
      getmem(tt, 26);
      tmpnode := TreeList.AddChild(nil, 'hello');
      tmpnode.data := tt;
    end;
    不能释放tt