table A
id bh cname lastbh
21 01 银行存款 0
22 02 现金 0
23 0101 中行 01
24 0102 建行 01
25 0201 美圆 02
26 0103 农行 01
27 03 支票 01
28 010101 西江支行 0101
29 010101 三联支行 0102
31      0202    人民币   02
32      0301    期票     03要通过TREEVIEW以树状形式显示出来,显示的结果应该是:
01 银行存款
    0101 中行
         010101 西江支行
         010201 三联支行
    0102 建行    
    0103 农行
02 现金
    0201 美圆
    0202 人民币
03 支票
   0301期票请教各位,如何实现?
谢谢!    
 

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, DB, DBTables, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Q: TQuery;
        TreeV: TTreeView;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure TreeVExpanding(Sender: TObject; Node: TTreeNode;
          var AllowExpansion: Boolean);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var node : TTreeNode;
    begin
        Q.Close;
        Q.DatabaseName := 'D:\' ;
        Q.SQL.Clear;    TreeV.Items.Clear;    Q.SQL.Add( ' select * from TableA ' ) ;
        Q.Open;
        if Q.RecordCount > 0 then
        begin
            while Not Q.Eof do
            begin
                if Length(Q.FieldByName('bh').AsString) = 2  then
                begin
                    node := TreeV.Items.Add(nil,Q.FieldByName('bh').AsString + ' ' + Q.FieldByName('CName').AsString );
                    TreeV.Items.AddChild(node,'') ;
                end;
                Q.Next ;
            end;
        end;end;procedure TForm1.FormCreate(Sender: TObject);
    var t : TTable ;
    begin
        Q := TQuery.Create(nil);    t := TTable.Create(nil);
        t.Close;
        t.TableName := 'D:\tableA.DB' ;
        t.TableType := ttParadox ;    with t.FieldDefs  do
        begin
            Clear;
            Add('id', ftString,   10, False ) ;
            Add('bh', ftString,   20, False ) ;
            Add('CName',ftString, 50, False ) ;
            Add('lastbh',ftString,50, False ) ;
        end;
        t.CreateTable ;
        t.Free;    with TQuery.Create(nil) do
        begin
            Try
                Close;
                DataBaseName := 'D:\' ;
                SQL.Clear;
                SQL.Add( ' insert into tableA values(''21'',''01'',''銀行存款'',''0'') ' ) ;
                ExecSQL;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''22'',''02'',''現金'',''0'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''23'',''0101'',''中行'',''01'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''24'',''0102'',''建行'',''01'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''25'',''0201'',''美元'',''02'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''26'',''0103'',''農行'',''01'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''27'',''03'',''支票'',''01'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''28'',''010101'',''西行支行'',''0101'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''29'',''010102'',''三聯支行'',''0102'') ' ) ;
                ExecSQL ;            SQL.Clear;
                SQL.Add( ' insert into tableA values(''31'',''0202'',''人民幣'',''02'') ' ) ;
                ExecSQL ;            SQL.Clear;            
                SQL.Add( ' insert into tableA values(''32'',''0301'',''期票'',''03'') ' ) ;
                ExecSQL ;
            Finally
                Free;
            end;
        end;
    end;procedure TForm1.TreeVExpanding(Sender: TObject; Node: TTreeNode;
      var AllowExpansion: Boolean);
    var i :integer ;
        node1 : TTreeNode ;
    begin
        Node.DeleteChildren ;    i := Pos(' ',node.Text) - 1 ;
        with TQuery.Create(nil) do
        begin
            Try
                Close;
                DataBaseName := 'D:\' ;
                SQL.Clear;
                SQL.Add( ' select * from TableA ' ) ;
                Open;
                if RecordCount > 0 then
                begin
                    while Not Eof do
                    begin
                        if (i + 2 = Length(FieldByName('bh').AsString ) ) and
                           (Copy(FieldByName('bh').AsString ,1,i) = Copy(Node.Text,1,i) ) then
                        begin
                            node1 := TreeV.Items.AddChild(node,FieldByName('bh').AsString + ' ' + FieldByName('CName').AsString );
                            TreeV.Items.AddChild(node1,'') ;
                        end;                    Next ;
                    end;
                end ;
            Finally
                Free;
            end;
        end;
        
    end;end.我這里不能用SQL,只能用本地DB,不好意思 
      

  2.   

    const
      ID_DEPT = 2;
    var
      nLevel: Integer;
      pNodes: array[0..1023] of TTreeNode;
      lpID, lpName: string;
      TmpSql: string;
    begin
      TmpSql := 'Select bh,cname from tabla order by bh';
      with adoquery1 do
      begin
        close;
        sql.clear;
        sql.add(Tmpsql);
        Open;
      end; 
      TreeView1.Clear;
      pNodes[0] := TreeView1.Add(nil, '所有部门');
      with adoquery1.Recordset do
        while not Eof do
        begin
          lpID := Fields['bh'].Value;
          lpName := Trim(Fields['cname'].Value);
          nLevel := Length(lpID) div ID_DEPT;
          pNodes[nLevel] := TreeView1.AddChild(pNodes[nLevel - 1], lpName);
          MoveNext;
        end;
      

  3.   


    写错了一点点,呵呵
    TreeView1 后面都没带Item
      

  4.   

       function getnodelevel(sformat,scode:string):integer;//获得树深度
       var i,level,ilen:integer;
       begin
           level:=-1;
           ilen:=0;
           if (trim(sformat)<>'') and (trim(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 loadtree(tree:Ttreeview;treedb:Tdbdataset;dwnr,dwbm:string); 
    //treedb可以使用query控件,dwnr可以自己设定如 所有科目,dwbm设定分级如222,
    //使用方法loadtree(treeview1,query1,'所有科目','222')
       var
           curID,nodetxt:string;
           i,level,cnode,num:integer;
           mynode:array[0..6] of Ttreenode; //最深为6级
       begin
          tree.items.clear;
          level:=0;
          tree.items.clear;
         mynode[level]:=tree.items.add(tree.topitem,dwnr);
         with treedb do
         begin
         try
           if not active then open;
           first;
           tree.Items.BeginUpdate;
           for i:=1 to recordcount do
             begin
               curID:=trim(fields[0].asstring);
               nodetxt:=curID+'-'+ trim(fields[1].asstring);
               level:=getnodelevel(dwbm,curID);
               if level>0 then
                 begin
                   mynode[level]:=tree.items.addchild(mynode[level-1],nodetxt);
                 end;
                 next;
               end;
               tree.Items.EndUpdate;
          except
          messagedlg('打开数据表出错,请检查基本设置!',mtwarning,[mbok],0);      
            close;
             end;
           end;
      end;