我有实际的例子,不过很大的,晚上有时间回去整理一下
我的email:[email protected]
我把思想先告诉你
有没有子结点
if TreeView1.Selected.HasChildren then
有没有父结点
if TreeView1.Selected.Parent=nil then
其实你可以把整个数建成一个表:
parent  child1_relative child_no       ...child2  child3
 1       1               3
 2       2               4
 2       2               53是1的孩子,4,5是1的孩子,1,2都是父亲结点          

解决方案 »

  1.   

    我找到我当年的sql语句了,就是针对treeview所建的数据库,你可以参考一下:
    CREATE TABLE "tree"("ID" VARCHAR2(10), "树层" VARCHAR2(5),"字段名" VARCHAR2(30),"节点号" VARCHAR2(10),"父节点号" VARCHAR2(5))TABLESPACE "CYNTHIA";
    insert into "tree" values('0','0','市场管理','1','0');
    insert into "tree" values('0','1','承包申请表','2','1');
    insert into "tree" values('0','1','申请分承包方名录','3','1');
    insert into "tree" values('0','1','承包方考核评分','4','1');
    insert into "tree" values('0','1','入网队伍资质审查','5','1');
    insert into "tree" values('0','1','合格份承包方名录','6','1');
    insert into "tree" values('0','1','技术服务项目计划','7','1');
    insert into "tree" values('0','1','分承包方工程实施','8','1');
    insert into "tree" values('0','1','技术服务质量反馈','9','1');
    nsert into "tree" values('0','1','勘探合同','10','1');
    insert into "tree" values('0','0','综合管理','11','0');
    insert into "tree" values('0','1','石油地质专业委员','12','11');
    insert into "tree" values('0','1','石油学会会员','13','11');
    insert into "tree" values('0','1','石油学会工作计划','14','11');
    insert into "tree" values('0','1','专业队伍对外服务','15','11');
    insert into "tree" values('0','1','专业队伍状况','16','11');
    insert into "tree" values('0','0','装备管理','17','0');
    insert into "tree" values('0','1','设备情况统计表','18','17');
    insert into "tree" values('0','1','队伍装备规划','19','17');
    insert into "tree" values('0','1','计划执行计划','20','17');
    insert into "tree" values('0','1','主要软件汇总表','21','17');
    insert into "tree" values('0','0','质量管理','22','0');
    insert into "tree" values('0','1','监督人员汇总表','23','22');
    insert into "tree" values('0','1','总监考核表','24','22');
    insert into "tree" values('0','1','监督考核表','25','22');
    insert into "tree" values('0','1','探井交接表','26','22');
    insert into "tree" values('0','1','指标汇总表','27','22');
    insert into "tree" values('0','1','监督统计表','28','22');
    insert into "tree" values('0',1'','购制明细表','29','22');
    insert into "tree" values('0','0','技术发展管理','30','0');
    insert into "tree" values('0','1','现状汇总','31','30');
    insert into "tree" values('0','1','实例汇总','32','30');
    insert into "tree" values('0','1','需求汇总','33','30');
    insert into "tree" values('0','1','情况汇总','34','30');说明:数层为0代表是父亲结点,1为子结点。在父结点号中,父亲结点为0,子结点为父亲结点号
      

  2.   

    如果还是不十分清楚的话,那就email to me
    我回去整理出一个实例送你。
      

  3.   

    表结构
    ID
    PID 父ID
    Layer 层次
    Name 名字
    HasChild
      

  4.   

    procedure TFrameTree.LoadTree(treeDB:TDBDataSet);//初始化树
    //initial tree when main form create
    var
      curID,nodeTxt:string;
      level,chindex,cnode,num:integer;
      mynode:array[0..6] of TTreenode;
    begin
    //初始化变量
      Screen.Cursor:=crHourGlass;
      tree.Enabled:=True;
      tree.Items.Clear;
      level:=0 ;
      num:=1;
      tree.items.clear;
      //设置根节点
      mynode[level]:=tree.items.add(Tree.Topitem,cTreeRootTxt);
      mynode[level].ImageIndex:=1;
      //遍历数据表,利用编码字段记录排序规律,依次添加节点
      with treeDB do
        begin
         try
           if not Active then
             open;
           first;
           while not Eof do
             begin
               curID:=trim(FieldByName('dwbm').AsString);
               nodeTxt:=curID+'-'+trim(FieldByName('dwqc').AsString);
               level:=GetNodeLevel(cTreeCodeFormat,curID);
               //返回代码的层次数
               if level>0 then
                 begin
                 //添加下一节点时,用添加子节点的方法可轻松实现节点间层次关系
               //注:这里的父节点是用当前节点的上一级节点mycode[level-1]
                   mynode[level]:=tree.items.addchild(mynode[level-1],nodeTxt);
                   if level>4 then
                     mynode[level].ImageIndex:=3
                   else
                     mynode[level].ImageIndex:=1;
                  // mynode[level].tag:=curID;
                 end;
               next;
             end;
         finally;
           close;
         End;
        mynode[0].expand(False);
        Screen.Cursor:=crDefault;
        end;
    end;
      

  5.   

    我也要一个例子,刚学Delphi还要做项目,做TreeView不会谢谢.
    Email:[email protected]
      

  6.   

    你可以把TreeView中要显示的东西建一个表(如Table1),右边界面的东西建一个表(如Table2)。
    table1中的必要字段:LongID(类型:char)。该字段是记录的每一个接点的编号。它包含两部分:1)父接点;2)接点唯一标示号。如:000001,表示父接点为000,该接点的唯一标示号为001(两部分长度必须一致,根接点代码设为“   000”,000前面是三个空格)。
    为Form1的OnCreate事件添加代码:
    procedure TForm1.FormCreate(Sender: TObject);
    var p:Pstr;Node:TTreeNode;
    begin
    with Table1,Treeview1 do
    begin
    open;
    first;
    new(p);{为指针p分配内存}
    p^:=FieldByName(′LongID′).AsString;
    Node:=Items.AddChildObject(nil,FieldByName(′Text′).AsString,p);
    if HasSubInDbf(Node) then Items.AddChildObject(Node,′ ′,nil);{有子节点则加一个空子节点}
    end;
    end;
    HasSubInDbf为自定义函数,自变量为Node,检查节点Node有无子节点,有则返回True,反之返回False,并在TForm1的类定义里加入原型声明(其它自定义函数的原型也在TForm1的类定义里声明,不另作解释),函数代码如下:
    function TForm1.HasSubInDbf(Node:TTreeNode):Boolean;
    begin
    with Table1 do
    begin
    Table1.FindNearest([copy(Pstr(Node.Data)^,4,3)+′000′]);
    result:=copy(FieldByName(′LongID′).AsString,1,3)=copy(Pstr(Node.Data)^,4,3);{如数据库里当前记录的LongID字段内容的前3位和节点Node的Data的后3位相同,则Node应该有子节点}
    end;
    end;
    为TreeView1控件的OnDeletion事件添加代码,需要指出的是,不仅调用Delete方法可以触发OnDeletion事件,而且当树控件本身被释放前,也触发OnDeletion事件,所以,在此处加入dispose(node.data)会很“安全”:
    procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
    Dispose(Node.Data);{释放节点数据内存}
    end;
    为Add1选单项的OnClick事件添加代码如下:
    procedure TForm1.Add1Click(Sender: TObject);
    var p:pstr;Tmpstr:string;i:integer;
    begin
    try
    StrToInt(Edit2.Text);
    Tmpstr:=Edit2.Text;{注:在实用中,必须用更好的方法来产生ID}
    except;
    ShowMessage(′重新输入Edit2的内容′);
    abort;
    end;
    with TreeView1 do
    begin
    new(p);
    p^:=copy(Pstr(Selected.Data)^,4,3)+TmpStr;
    Items.AddChildObject(Selected,Edit1.Text,p);
    end;
    with Table1 do{ 在数据库里添加记录 }
    begin
    Append;
    FieldByName(′Text′).AsString:=Edit1.text;
    FieldByName(′LongID′).AsString:=p^;
    Post;
    end;
    TmpStr:=inttostr(strtoint(TmpStr)+1);
    for i:=length(TmpStr) to 2 do TmpStr:=′0′+TmpStr;
    Edit2.Text:=TmpStr;
    end;
    为Del1菜单项的OnClick事件添加代码如下:
    procedure TForm1.Del1Click(Sender: TObject);
    var DelList:TStringList;LongID,NSubLongID:string;
    begin
    DelList:=TStringList.create;
    DelList.Sorted:=True;
    DelList.Add(Pstr(TreeView1.Selected.Data)^);
    while DelList.Count>0 do
    begin
    LongID:=DelList.Strings[0];
    DelList.Delete(0);
    Table1.SetKey;
    Table1.FieldByName(′LongID′).AsString:=LongID;
    if Table1.GotoKey then Table1.Delete;
    if HasSubInDbf(TreeView1.Selected) then
    begin
    NSubLongID:=Table1.FieldByName(′LongID′).AsString;
    while (copy(NSubLongID,1,3)=copy(LongID,4,3))and(not Table1.Eof) do
    begin
    dellist.Add(NSubLongId);
    Table1.Next;
    NSubLongId:=Table1.FieldByName(′LongID′).AsString;
    end;
    end;
    end;
    DelList.Free;
    TreeView1.Items.Delete(TreeView1.Selected);
    end;
    为TreeView1的OnExpanding事件添加代码:
    procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
    var AllowExpansion: Boolean);
    var TmpNode:TTreeNode;NSubLongID:String;p:Pstr;bm:TBookMark;
    begin
    with Table1,TreeView1 do
    begin
    Items.BeginUpdate;
    SetKey;
    FieldByName(′LongID′).AsString:=Pstr(Node.Data)^;
    if not GotoKey then Items.Delete(Node)
    else
    begin
    TmpNode:=Node.GetFirstChild;
    if (TmpNode.Text=′ ′)and(TmpNode.Data=nil) then
    begin
    TmpNode.Delete;
    if HasSubInDbf(Node) then
    begin
    NSubLongID:=FieldByName(′LongID′).AsString;
    while (copy(NSubLongID,1,3)=copy(Pstr(Node.Data)^,4,3))and(not Eof) do
    begin
    new(p);
    p^:=FieldByName(′LongID′).AsString;
    bm:=GetBookMark;
    TmpNode:=Items.AddChildObject(Node,FieldByName(′Text′).AsString,p);
    if HasSubInDbf(TmpNode) then Items.AddChildObject(TmpNode,′ ′,nil);
    GotoBookMark(bm);
    FreeBookMark(bm);
    Next;
    NSubLongId:=FieldByName(′LongID′).AsString;
    end; end; end;
    end;
    Items.EndUpdate;
    end;
    end;
      

  7.   

    你是实例只是保存了左边的信息:代码如下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
        procedure AddClass(AId:integer;FatherNode:TTreeNode);//添加分类过程
        procedure AddDataToDB(CurrNode,FatherNode:TTreeNode);//添加实际数据到数据库
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
    var
        QryTmp:TADOQuery;
        myNode:TTreeNode;
        myLabel:TLabel;
    begin
        QryTmp:=TADOQuery.Create(self);
        QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
        QryTmp.SQL.Add('select * from tb1');
        QryTmp.SQL.Add('where FatherId='+inttostr(AId));
        QryTmp.Open;
        while not QryTmp.Eof do
        begin
            myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);        //创建标签,caption存放各分支的AutoId表识
            myLabel:=TLabel.Create(self);
            myLabel.Visible:=false;
            myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
            myNode.Data:=myLabel;        AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
            QryTmp.Next;//什么是递归调用过程,有什么作用啊?
        end;
        QryTmp.Free;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        AddClass(0,nil);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
        strName:string;
        myNode:TTreeNode;
    begin
        strName:=inputbox('新增','请输入分类名称:  ','');
        strName:=trim(strName);
        if strName='' then
            exit;
        myNode:=treeview1.Items.Add(treeview1.Selected,strName);
        if assigned(treeview1.Selected) then
            AddDataToDB(myNode,treeview1.Selected.Parent)
        else
            AddDataToDB(myNode,nil);
        myNode.selected:=true;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
        strName:string;
        myNode:TTreeNode;
    begin
        strName:=inputbox('新增','请输入分类名称:  ','');
        strName:=trim(strName);
        if strName='' then
            exit;
        myNode:=treeview1.Items.AddChild(treeview1.Selected,strName);
        AddDataToDB(myNode,treeview1.Selected);
        myNode.selected:=true;
    end;procedure TForm1.AddDataToDB(CurrNode,FatherNode: TTreeNode);
    var
        myLabel:TLabel;
        QryTmp:TADOQuery;
        AId:integer;
    begin
        if not assigned(FatherNode) then//assingned()是什么作用
            AId:=0
        else if not assigned(FatherNode.Data) then
            AId:=0
        else
            AId:=strtoint(TLabel(FatherNode.Data).caption);
        QryTmp:=TADOQuery.Create(self);
        QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
        QryTmp.SQL.Add('select * from tb1');
        QryTmp.SQL.Add('where FatherId='+inttostr(AId));
        QryTmp.Open;
        QryTmp.Append;
        QryTmp['FatherId']:=AId;
        QryTmp['CName']:=CurrNode.Text;
        QryTmp.Post;    //创建记录currNode的AutoId表识标
        myLabel:=TLabel.Create(self);
        myLabel.Visible:=False;
        MyLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
        CurrNode.Data:=myLabel;
        
        QryTmp.Free;
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
        QryTmp:TADOQuery;
    begin
        if not assigned(treeview1.Selected) then
            exit;
        if application.MessageBox('是否删除分类及下级分类?','提示',mb_yesno+mb_iconquestion)=idno then
            exit;
        //删除下级别分类
        QryTmp:=TADOQuery.Create(self);
        QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
        QryTmp.SQL.Add('delete * from tb1');
        QryTmp.SQL.Add('where FatherId='+TLabel(Treeview1.Selected.data).Caption);
        QryTmp.ExecSQL;
        QryTmp.SQL.Clear;
        QryTmp.SQL.Add('delete * from tb1');
        QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
        QryTmp.ExecSQL;
        Treeview1.Selected.Delete;
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
        QryTmp:TADOQuery;
        strName:string;
    begin
        if not assigned(treeview1.Selected) then
            exit;
        strName:=inputbox('更改','请输入新的名称: ','');
        strName:=trim(strName);
        if strName='' then
            exit;
        //删除下级别分类
        QryTmp:=TADOQuery.Create(self);
        QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
        QryTmp.SQL.Add('update tb1 set CName='+''''+strName+'''');
        QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
        QryTmp.ExecSQL;
        Treeview1.Selected.Text:=strName;
    end;end.我结合HitomiWP(理想国度)的贴试一试.
      

  8.   

    我最近也在做TREEVIEW,挺多的,自己想了一些,但还有一些没解决,能否MAIL给我一个实例,参考一下,多谢!!!!   [email protected]
      

  9.   

    高度关注!拜托,MAIL给我一个实例[email protected]
    thanks!!
      

  10.   

    正好有一个现成的例子,
    [email protected]
      

  11.   

    给我也来一份[email protected]
      

  12.   

    我觉得以上方法有点烦,我有一个TREE控件,你可以去看看。很简单的。http://expert.csdn.net/Expert/topic/2259/2259840.xml?temp=.3159754
    直接下载请到:
    http://www.myjinsui.com/down/sort.asp?classid=9
      

  13.   

    楼上的,你有FOR D7 的吗?没有,不有也罢!!