unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, ComCtrls, StdCtrls, Grids, DBGrids;type
Tnodedata=Record
  flag:string;
  f_name:string;
  Fid:string;
 end;
 PNodeData = ^TNodeData;  TForm1 = class(TForm)
    Button1: TButton;
    TreeView1: TTreeView;
    ADOQuery1: TADOQuery;
    conn: TADOConnection;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    Procedure Buildtree(Node: TTreeNode; PN: PNodeData);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
Procedure Tform1.Buildtree(Node: TTreeNode; PN: PNodeData);
var adoQuery: TADOQuery;
  nNode: TTreeNode;
  PNode: PNodeData;
begin
try
   adoQuery := TADOQuery.Create(nil);
   adoQuery.Connection := conn;
   adoQuery.SQL.Text := 'Select * from main_db where flag='''+pn^.flag+'''and Fid='''+Pn^.Fid+'''';
    adoQuery.Open;
    adoQuery.First;
    while adoQuery.Eof = False do
    begin
      New(PNode);
      PNode^.flag := adoQuery.FieldByName('flag').AsString;
      PNode^.f_name := adoQuery.FieldByName('F_name').AsString;
      Pnode^.Fid:=adoquery.fieldbyname('Fid').AsString;
      nNode := Treeview1.Items.AddChildObject(Node, PNode^.f_name, PNode);
      buildtree(nNode, PNode);
      adoQuery.Next;
    end;
  finally
    adoQuery.Free;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Pnode:PNodeData;
begin
new(Pnode);
Pnode^.flag:='1';
Pnode^.f_name:='123';
Pnode^.Fid:='世界';
buildtree(Treeview1.Items[0], PNode);
dispose(pnode);
end;end.
数据库结构如下
flag  F-name  fid(对应父节点)
1       世界     树根
2       中国     世界
3       河南省   中国
2       美国     世界
1       法国     世界
4       郑州     河南省
5       新郑     郑州




帮我看看为什么不能建树

解决方案 »

  1.   

    //1用  Dev Express,DBTree//2,算法 unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        Button1: TButton;
        ADOQuery1: TADOQuery;
        Button2: TButton;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TreeView1: TTreeView;
        TabSheet2: TTabSheet;
        DataSource1: TDataSource;
        ADOQuery1ID: TAutoIncField;
        ADOQuery1ParentID: TIntegerField;
        ADOQuery1Name: TWideStringField;
        DBGrid1: TDBGrid;
        Memo1: TMemo;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure FillTreeView(TreeView: TTreeView);
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);
    begin
      Close;
    end;procedure TForm1.FillTreeView(TreeView: TTreeView);
      procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
      var
        mLocalName: string;
        TreeNode: TTreeNode;
        Ads_Tmp: TADODataSet;
      begin
        ADS_Tmp := TADODataSet.Create(Self);
        ADS_Tmp.Connection := ADOConnection1;
        with ADS_Tmp do
        try
          Close;
          CommandText := 'Select * from Type Where ParentID =' + FNodeName;
          Open;
          First;
          while not Eof do
          begin
            mLocalName := FieldbyName('ID').Asstring;
            TreeNode := TreeView.Items.AddChild(Node, FieldByName('Name').AsString);
            CreateSubTree(mLocalName, TreeNode); // 此处循环递归
            Next;
          end;
        finally
          ADS_Tmp.Free;
        end;
      end;
    begin
      TreeView.Items.BeginUpdate;
      TreeView.Items.Clear;
      with TreeView.Items.Add(nil, '所有目录') do
      begin
        ImageIndex := 1;
        SelectedIndex := 1;
      end;
      CreateSubTree('0', TreeView.Items[0]);
      TreeView.Items.EndUpdate;
      TreeView.Items[1].Selected := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      FillTreeView(TreeView1);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ADOQuery1.Close;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADOQuery1.Open;
    end;end.