数据库里有个表叫sale_dq 里面的结构如下
 dq_dqbh     dq_dqmc          dq_level
  01         中国                 1
  0102       北京                 2
  010205     北京朝阳区           3
  010206     北京东城区           3
  010207     北京西城区           3
  0103       上海                 2
  0103       台湾                 2
  010301     台南                 3
  020202     台北                 3
  ....       .....               ....
现在我在form1里有一个treeview1,我要在form1 ONSHOW的时候这个树就要出来。(通过dq_dqbh来分辨节点间的父子关系)我用的控件还有ADOConnection1 和ADOQuery1,请高手帮我提供详细的代码让小辈学习学习,必将全体投地以示感谢!!![请不要转帖其他的帖子给我看,因为搜索功能我也会~~~ (:] 第一个给出正确代码的70分重谢!!!如觉不够可另开帖再重分感谢`~

解决方案 »

  1.   

    unit frmFunctionLookUnit;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls,DBTables, ImgList, DB, DBClient;
    const
      cTreeCodeFormat='122222'; //编码格式。
      cTreeMaxLevel=6;
      cTreeRootTxt='地区名称' ;
    type
      TfrmFunctionLook = class(TForm)
        tree: TTreeView;
        ImageListTree: TImageList;
        treeDB:TADOQuery;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure treeClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        procedure LoadTree(treeDB:TClientDataSet);//初始化树
        procedure UpdateTree(curNode:TTreenode;nodeTxt:string;state:string);//更新树
        function  GetNodeLevel(sFormat,sCode:string):integer;//得到结点Level
      end;var
      frmFunctionLook: TfrmFunctionLook;
      gNodelevel:     integer;  // 树节点层次
      gNodeID:        String;  // 树节点ID
      gNode:          ttreenode; //当前节点
    implementationuses PublicDMUnit;{$R *.dfm}procedure TfrmFunctionLook.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      Action:=caFree;
    end;function TfrmFunctionLook.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;procedure TfrmFunctionLook.LoadTree(treeDB:TClientDataSet);
    //initial tree when main form create
    var
        curID,nodeTxt:string;
        level,chindex,cnode,num:integer;
        mynode:array[0..6] of TTreenode;
    begin
    //ini value
        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('dq_dqbh').AsString);
             nodeTxt:=trim(FieldByName('dq_dqmc').AsString);
             level:=GetNodeLevel(cTreeCodeFormat,curID);
             if level>0 then
             begin
               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;procedure TfrmFunctionLook.UpdateTree(curNode: TTreenode; nodeTxt,
      state: string);
    begin
      if  state='add'   then
        begin
          curNode:=tree.items.addchild(curNode,nodeTxt);
          curNode.ImageIndex:=2;
        end;
      if state='del' then  curNode.delete;
      if state='edi' then  curNode.Text:=nodeTxt;
    end;procedure TfrmFunctionLook.treeClick(Sender: TObject);
    vartemp,recID:string;
    n,m:integer;
    curLevel:integer;
    begin
     { gNode:=tree.selected;
      n:=Pos('-', gNode.text)-1 ;
      recID:=Copy(gNode.text,1,n);
      gNodeID:=recID;  if   gNode.text<>'地区名称' then
      begin
       if   recID<>'' then
       begin
        //Locate table record
        with treeDB do
        begin
          Open;
          active:=true;
          FindNearest([recID]);
        end;
        //set TField.EditMask
        curLevel:= GetNodeLevel(cTreeCodeFormat,recID)+1;
       end
      else
      curLevel:= 1;
      end;
      gNodelevel:=curLevel;
    end;procedure TfrmFunctionLook.FormShow(Sender: TObject);
    begin
      treeDB.Open;
      LoadTree(treeDB);
    end;end.
    这是我从我的程序中考出来的,已经调试通过,你可以对照看看
      

  2.   

    function TForm1.LoadCode(crTbl:TDBDataSet):Integer;    var NowID,sName,ShowTxt:String;    i,Level:Integer;    MyNode:array[0..6]of TTreeNode;//保存各级节点,最长支持6级(重点)    begin    Screen.Cursor:=crHourGlass;    Level:=0;    With crTbl do    begin     try     if not Active then Open;    First;     tvwCode.Items.Clear;     //以下是增加第一项    MyNode[Level]:=tvwCode.Items.Add(tvwCode.TopItem,SFirstNodeTxt);    MyNode[Level].ImageIndex:=0;    MyNode[Level].SelectedIndex:=0;     //以上是增加第一项    While Not Eof do     begin    NowID:=Trim(FieldByName(‘aCode').AsString);    ShowTxt:=NowID+‘ '+FieldByName(‘aName').AsString;    Level:=GetLevel(SCodeFormat,NowID); //返回代码的级数     //以下是增加子项     //以下用上一级节点为父节点添加子节点     if Level>0 then//确保代码符合标准     begin    MyNode[Level]:=tvwCode.Items.AddChild(MyNode[Level-1],ShowTxt);    MyNode[Level].ImageIndex:=1;    MyNode[Level].SelectedIndex:=2;    end;     //以上是增加子项    Next;    end;    finally    Close;    end;    end;    MyNode[0].Expand(False);//将首节点展开    Screen.Cursor:=crDefault;    end;    //以上函数将Code.db表中的科目代码和科目代码名称显示出来    //下面函数的功能是返回一代码的级数,参数sFormat传递科目代码结构;    //参数sCode传递某一科目代码    function TForm1.GetLevel(sFormat,sCode:String):Integer;    var i,Level,iLen:Integer;    begin    Level:=-1;//如果代码不符合标准,则返回-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;    //上面函数的功能是返回一代码的级数    procedure TForm1.FormCreate(Sender: TObject);    begin     with tblCode do     begin    DatabaseName:=ParamStr(1); //使tblCode的DatabaseName指向应用程序所在的路径    TableName:=‘Code.DB';     //指向数据表Code.DB    Open;    IndexFieldNames:=‘aCode'; //按字段aCode排序(不要漏掉)     end;    LoadCode(tblCode);    end;    procedure TForm1.btnCloseClick(Sender: TObject);    begin    Close;    end;
    效率很高的一个算法
    给你参考
    给分吧
      

  3.   

    hehe,等我验证了就给分。通过了再开帖子散分
      

  4.   

    luckyboy97(幸运男孩)  你要是象lmj2003(西才) 那样用我的数据库字段来写代码就好了
     你要是象lmj2003(西才)  你真是太伟大了不管能不能通过都要感谢
      

  5.   

    可以参考:
    机械工业出版社
    刘艺
    《Delphi 6 企业级解决方案及应用剖析》
    第四部分 电子商务货物配送系统解决方案及应用剖析
    第15章 代码维护模块
    15.4 使用Treeview导航表数据(Page 517-519)
    引用书中原话:“我们这里使用的是基于编码结构的高效算法,程序短小精悍,运行效率很高,特此向读者推荐。”
    具体代码最好自己写,这样有利于提高自己实际动手能力。
      

  6.   

    这是我使用 luckyboy97(幸运男孩) 的算法,调试出来的一个,你自己看看,我调试是通过了的unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        ADOQuery1: TADOQuery;
        BtnMakeTree: TButton;
        procedure BtnMakeTreeClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}Const
      SFirstNodeTxt ='销售地区列表';function LoadCode(crTbl:TADOQuery;tvwCode : TTreeview):Integer;    var NowID,sName,ShowTxt:String;    i,Level:Integer;    MyNode:array[0..6]of TTreeNode;//保存各级节点,最长支持6级(重点)    begin    Screen.Cursor:=crHourGlass;    Level:=0;    With crTbl do    begin     try     if not Active then Open;    First;     tvwCode.Items.Clear;     //以下是增加第一项    MyNode[Level]:=tvwCode.Items.Add(tvwCode.TopItem,SFirstNodeTxt);    MyNode[Level].ImageIndex:=0;    MyNode[Level].SelectedIndex:=0;     //以上是增加第一项    While Not Eof do     begin    NowID:=Trim(FieldByName('dq_dqbh').AsString);    ShowTxt:=NowID+' '+FieldByName('dq_dqmc').AsString;    Level:=FieldByName('dq_Level').AsInteger; //返回代码的级数     //以下是增加子项     //以下用上一级节点为父节点添加子节点     if Level>0 then//确保代码符合标准     begin    MyNode[Level]:=tvwCode.Items.AddChild(MyNode[Level-1],ShowTxt);    MyNode[Level].ImageIndex:=1;    MyNode[Level].SelectedIndex:=2;    end;     //以上是增加子项    Next;    end;    finally    Close;    end;    end;    MyNode[0].Expand(False);//将首节点展开    Screen.Cursor:=crDefault;    end;procedure TForm1.BtnMakeTreeClick(Sender: TObject);
    var
      ConnStr : String;
    begin  ConnStr :='Provider=SQLOLEDB.1;Persist Security Info=True;';
      ConnStr := ConnStr + 'Password=dfasd;';      //把dfasd 换成你登陆数据库的密码
      ConnStr := ConnStr + 'User ID=ApsuiteUser;'; //把ApsuiteUser换成你登陆数据库的用户名
      ConnStr := ConnStr + 'Initial Catalog=DBapsuite;'; //把DBApsuite换成你的数据库名
      ConnStr := ConnStr + 'Data Source=192.1.1.129';  //把192.1.1.129换成你的数据库IP
      ADOQuery1.ConnectionString :=ConnStr;
      ADOQuery1.SQL.Clear ;
      ADOQuery1.SQL.Add('select * from sale_dq   order by dq_dqbh asc   ');
      LoadCode(ADOQuery1,TreeView1)
    end;end.