简单问题:如何动态创建treeview的父节点及其多重子节点?100分20分钟结账!

解决方案 »

  1.   

    //添加根结点
    begin
    Node:= treeview1.items.addchild(nil,'hello');
    //子节点
    treeview1.items.addchild(node,'hello1');
    Node1:= treeview1.items.addchild(nil,'hello');
    treeview1.items.AddChild(treeview1.Items.ITEM[1],'hello2');
    treeview1.items.AddChild(treeview1.Items.ITEM[1],'hello3');
    treeview1.items.AddChild(treeview1.Items.ITEM[2],'hello4');
      

  2.   

    var
      xx,xxx:TTreeNode;循环执行:
    xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx:
    循环执行:
    xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
      

  3.   

    看明白下面的过程,您的treeview水平也可以算中等了
    复制,移动TreeView节点 
     --------------------------------------------------------------------------------
     procedure AddSubTree(DestTree: TTreeView; SourceNode, DestNode: TTreeNode; AddState: Boolean);
    var
      TempNode, TempNode1: TTreeNode;
      I : integer;
    begin
      TempNode := DestNode;  with DestTree do begin
        if Not (AddState) then TempNode := Items.AddChild(DestNode, sourceNode.Text);
        if SourceNode.HasChildren then begin
          for I := 0 to SourceNode.Count-1 do begin
            if I>0 then
                TempNode := Items.AddChild(TempNode.Parent, SourceNode.Item[I].Text)
            else
                TempNode := Items.AddChild(TempNode, SourceNode.Item[I].Text);
            AddSubTree(DestTree, SourceNode.Item[I], TempNode, True);
          end;
        end;
      end;
    end;procedure MoveSubTreeView(SourceTreeView, DestTreeView: TTreeView; Keep: Boolean);
    var
      TempLevel, TempIndex : integer;
      I, J : integer;
      TempNode : array of TTreeNode;
      TempNode1 : TTreeNode;
      Yes_No : Boolean;
      OldOnChanging, OldOnChanging1 : TTVChangingEvent;
      OldOnChange, OldOnChange1 : TTVChangedEvent;
      IsSelected : TTreeNode;
    begin
      OldOnChanging := DestTreeView.OnChanging;
      DestTreeView.OnChanging := Nil;
      OldOnChange := DestTreeView.OnChange;
      DestTreeView.OnChange := Nil;
      OldOnChanging1 := SourceTreeView.OnChanging;
      SourceTreeView.OnChanging := Nil;
      OldOnChange1 := SourceTreeView.OnChange;
      SourceTreeView.OnChange := Nil;  IsSelected := SourceTreeView.Selected;
      TempLevel := SourceTreeView.Selected.Level;
      setlength(TempNode, TempLevel+1);
      Yes_No := False;
      TempNode1 := Nil;  TempIndex := FindNode(DestTreeView, SourceTreeView.Selected.Text);
      if TempIndex>-1 then begin
        DestTreeView.Items[TempIndex].Delete;
      end;  with SourceTreeView do begin
        TempNode[TempLevel] := Selected;
        if TempLevel>0 then
          for I := TempLevel-1 downto 0 do begin
            TempNode[I] := TempNode[I+1].Parent;
          end;
      end;  with DestTreeView.Items do begin
        if Count>0 then begin
          for I := TempLevel downto 0 do
            for J := Count-1 downto 0 do begin
              if (TempNode[I].Text=DestTreeView.Items[J].Text) and (TempNode1=Nil) then begin
                if I=Templevel then Yes_no := True;
                TempNode1 := DestTreeView.Items[J];
              end;
            end;
        end;    if TempNode1=Nil then
          for I := 0 to TempLevel-1 do begin
            TempNode1 := AddChild(TempNode1, TempNode[I].Text);
          end
        else
          for I := TempNode1.Level+1 to TempLevel-1 do begin
            TempNode1 := AddChild(TempNode1, TempNode[I].Text);
          end;
      end;
          AddSubTree(DestTreeView, IsSelected, TempNode1, False);//Yes_No);
      if (Not (Keep)) then begin
        if (IsSelected.Parent<>Nil) and (IsSelected.Parent.Count<1) then
            IsSelected.Parent.Delete
        else
            IsSelected.Delete;
      end;  DestTreeView.SortType := stData;  DestTreeView.OnChanging := OldOnChanging;
      DestTreeView.OnChange := OldOnChange;
      SourceTreeView.OnChanging := OldOnChanging1;
      SourceTreeView.OnChange := OldOnChange1;
    end; 
      

  4.   

    给你看我写的一个过程,应该不难看懂吧!可以支持多层!
    {绘制树:
    QryObj:查询控件名称;MyTreeView:树型控件名;SQL:查询语句;
    Field:主字段;Index:图片索引
    }
    procedure DrawTree(ChildQryObj,GrandsonQryObj:TADOQuery;MyTreeView:TTreeView;LayerNum,MainIndex,ChildIndex,GrandsonIndex:Integer;ChildSQL,GrandsonSQL,ChildField,ChildGrandsonField,GrandsonField:string);
    var
      MainNode,ChildNode,GrandsonNode,lnNode:TTreeNode;
    begin
      with MyTreeView.Items do
      begin
        Clear;
        MainNode:=add(nil,'信息名称列表');
        MainNode.ImageIndex:=MainIndex;
        MainNode.SelectedIndex:=MainIndex;
        DateSelect(ChildQryObj,ChildSQL);
      while not ChildQryObj.Eof do
        begin
           ChildNode:= AddChild(MainNode,ChildQryObj.fieldbyname(''+ChildField+'').AsString);
            ChildNode.ImageIndex:=ChildIndex;
            ChildNode.SelectedIndex :=ChildIndex;
            if LayerNum>2 then
             begin
             DateSelect(GrandsonQryObj,GrandsonSQL+''''+ChildNode.Text+'''');
               while not GrandsonQryObj.Eof do
                begin
              GrandsonNode:=AddChild(ChildNode,GrandsonQryObj.fieldbyname(''+GrandsonField+'').AsString );
              GrandsonNode.ImageIndex :=GrandsonIndex;
              GrandsonNode.SelectedIndex :=GrandsonIndex;
              GrandsonQryObj.Next;
                end;
            lnNode := GetFirstNode;
           while not (lnNode = nil) do
            begin
           lnNode.Expand(true);
           lnNode := lnNode.GetNextSibling;
            end;
             end;
            ChildQryObj.Next;
          end;
        end;
      end;
      

  5.   

    var
      xx,xxx:TTreeNode;循环执行:
    xx:=TreeView1.Items.AddChild(nil,yy);//xx为该父节点点,yy为父节点的显示字符串针对某个父接点xx:
    循环执行:
    xxx:=TreeView1.AddChild(xx,yyy);//xxx为该子节点,yyy为子节点的显示字符串依次类推
      

  6.   

    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;