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.
fristykily(firstykily):为什么提示:Form1.ADOQuery1Name doesn't have a corresponding component,remove the declaration
procedure TfrmMain.CreateTree; var DWList,KDList,BJList: TStringList; i,j,k: Integer; PNode,DWNode,KDNode,BJNode: TTreeNode; begin TreeView.Items.Clear; ADOQ.Close; DWList:=TStringList.Create; KDList:=TStringList.Create; BJList:=TStringList.Create; try PNode:=TreeView.Items.AddChild(TreeView.Items.GetFirstNode,'班级分布情况'); PNode.ImageIndex:=0; GetBaseData('dwqkb','','',DWList); if DWList.Count>0 then begin for i:=0 to DWList.Count-1 do begin DWNode:=TreeView.Items.AddChild(PNode,DWList[i]); DWNode.ImageIndex:=1; GetBaseData('kdqkb','单位代码',Copy(DWList[i],1,5),KDList); if KDList.Count>0 then begin for j:=0 to KDList.Count-1 do begin KDNode:=TreeView.Items.AddChild(DWNode,KDList[j]); KDNode.ImageIndex:=2; GetBaseData('bjxxb','考点代码',Copy(KDList[j],1,4),BJList); if BJList.Count>0 then begin for k:=0 to BJList.Count-1 do begin BJNode:=TreeView.Items.AddChild(KDNode,BJList[k]); BJNode.ImageIndex:=3; end; end; end; end; end; end; finally DWList.Free; KDList.Free; BJList.Free; end; end;
procedure TMain.CreateTree(QuerySource:TADOQuery;NodeParent:TTreeNode;treeview1:ttreeview); var pstr1, pstr2 : ^string; NodeTemp : TTreeNode; begin pstr1 := NodeParent.Data; with QuerySource do begin close; sql.Clear; sql.Text:='SELECT key,xcode,xname FROM xzdm WHERE parent = ' + '''' + pstr1^ + ''''; open; if isempty then exit; NodeTemp := nil; while not eof do begin new(pstr2); pstr2^ := FieldByName('key').AsString; NodeTemp := TreeView1.Items.AddChildObject(NodeParent, trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr2); Next; end; end; while NodeTemp <> nil do begin CreateTree(QuerySource, NodeTemp,treeview1); NodeTemp := Nodetemp.getPrevSibling; end; end;procedure TMain.RootTree(treeview1:ttreeview); var NodeTemp : TTreeNode; pstr : ^string; Query:TADOQuery; begin Query:=TADOQuery.Create(self); query.Connection:=BgConnection; try Treeview1.Items.BeginUpdate; with query do begin SQL.Text :='select top 1 * from xzdm '; open; if isempty then exit; NodeTemp := nil; while not eof do begin new(pstr); pstr^ := FieldByName('key').AsString; NodeTemp :=treeview1.Items.AddObject(nil, trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr); Next; end; end; while NodeTemp <> nil do begin CreateTree(Query, NodeTemp,treeview1); NodeTemp:=NodeTemp.getPrevSibling; end; treeview1.Items.EndUpdate; finally Query.Free; end; end;
To DelphiBird(爱你等于爱自己): 我把你的代码copy到implementation下面,运行,很多错误: [Error] Unit1.pas(23): ';' expected but '.' found [Error] Unit1.pas(26): Undeclared identifier: 'TTreeNode'
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.
var
DWList,KDList,BJList: TStringList;
i,j,k: Integer;
PNode,DWNode,KDNode,BJNode: TTreeNode;
begin
TreeView.Items.Clear;
ADOQ.Close;
DWList:=TStringList.Create;
KDList:=TStringList.Create;
BJList:=TStringList.Create;
try
PNode:=TreeView.Items.AddChild(TreeView.Items.GetFirstNode,'班级分布情况');
PNode.ImageIndex:=0;
GetBaseData('dwqkb','','',DWList);
if DWList.Count>0 then begin
for i:=0 to DWList.Count-1 do begin
DWNode:=TreeView.Items.AddChild(PNode,DWList[i]);
DWNode.ImageIndex:=1;
GetBaseData('kdqkb','单位代码',Copy(DWList[i],1,5),KDList);
if KDList.Count>0 then begin
for j:=0 to KDList.Count-1 do begin
KDNode:=TreeView.Items.AddChild(DWNode,KDList[j]);
KDNode.ImageIndex:=2;
GetBaseData('bjxxb','考点代码',Copy(KDList[j],1,4),BJList);
if BJList.Count>0 then begin
for k:=0 to BJList.Count-1 do begin
BJNode:=TreeView.Items.AddChild(KDNode,BJList[k]);
BJNode.ImageIndex:=3;
end;
end;
end;
end;
end;
end;
finally
DWList.Free;
KDList.Free;
BJList.Free;
end;
end;
var
pstr1, pstr2 : ^string;
NodeTemp : TTreeNode;
begin
pstr1 := NodeParent.Data;
with QuerySource do
begin
close;
sql.Clear;
sql.Text:='SELECT key,xcode,xname FROM xzdm WHERE parent = ' + '''' + pstr1^ + '''';
open;
if isempty then exit;
NodeTemp := nil;
while not eof do
begin
new(pstr2);
pstr2^ := FieldByName('key').AsString;
NodeTemp := TreeView1.Items.AddChildObject(NodeParent,
trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr2);
Next;
end;
end;
while NodeTemp <> nil do
begin
CreateTree(QuerySource, NodeTemp,treeview1);
NodeTemp := Nodetemp.getPrevSibling;
end;
end;procedure TMain.RootTree(treeview1:ttreeview);
var
NodeTemp : TTreeNode;
pstr : ^string;
Query:TADOQuery;
begin
Query:=TADOQuery.Create(self);
query.Connection:=BgConnection;
try
Treeview1.Items.BeginUpdate;
with query do
begin
SQL.Text :='select top 1 * from xzdm ';
open;
if isempty then exit;
NodeTemp := nil;
while not eof do
begin
new(pstr);
pstr^ := FieldByName('key').AsString;
NodeTemp :=treeview1.Items.AddObject(nil,
trim(FieldByName('xname').AsString)+'('+fieldbyname('xcode').AsString+')', pstr);
Next;
end;
end;
while NodeTemp <> nil do
begin
CreateTree(Query, NodeTemp,treeview1);
NodeTemp:=NodeTemp.getPrevSibling;
end;
treeview1.Items.EndUpdate;
finally
Query.Free;
end;
end;
我把你的代码copy到implementation下面,运行,很多错误:
[Error] Unit1.pas(23): ';' expected but '.' found
[Error] Unit1.pas(26): Undeclared identifier: 'TTreeNode'
ttreenode
没有
use ComCtrls
字段名称 长度 类型
cID 20 varchar
cName 50 varchar
cParentID 20 varchar最主要的就是cParentID,它记录了它的父分类的ID(根结点的ParentID可以用一个特殊值标识),通过这样你就可以很方便的遍历这个数据分类表了。//****************************************************************************//
//把数据库中的分类结构添加到TreeView上.本过程使用递规算法 //
//****************************************************************************//
procedure Tdm_customer.AddDBTotree(tv: tTreeView;ParentNode:tTreeNode; Key: String);
var
aQuery:TClientDataSet;
SQL,displayCaption,ClassCode:String;
i:integer;
treeNode:TTreeNode;
begin
aQuery:=TClientDataSet.Create(nil);
with aQuery do
begin
try
RemoteServer := MainDCOM;
ProviderName := 'dsp_CusClass';
CommandText := Format(SQL_SELECT_CUSTOMERCLASS,[QuotedStr(Trim(key))]);
Open;
for i:=0 to RecordCount-1 do
begin
ClassCode:=fieldByName('cCusClassCode').AsString;
DisplayCaption:=ClassCode+' '+
FieldbyName('vcCusClassName').AsString;
TreeNode:=tv.Items.AddChild(ParentNode,DisplayCaption); AddDBToTree(tv,TreeNode,FieldbyName('cCusClasscode').AsString); Next;
end;
finally
Free;
end;
end;
end;这段代码只是一个样例,不能直接运行。改一下可以。用在这个地方的目的只是说明用这种方法可以解决这个问题。