procedure TForm1.Button1Click(Sender: TObject); var s1,s2:string; node,subnode:TTreeNode; i,j,m,n,m1,m2:integer; begin m1:=0; m2:=0; form1.Table1.Open; form1.Table1.First; i:=form1.Table1.RecordCount; if i>0 then begin for j:=0 to i-1 do begin s1:=form1.Table1.FieldValues['子系统名称']; s2:=form1.Table1.FieldValues['功能名称']; m:=form1.TreeView1.Items.Count; if m>0 then begin for n:=0 to m-1 do begin if form1.TreeView1.Items.Item[n].Text=s1 then begin m1:=m1+1; m2:=n; end; end; if m1=1 then begin subnode:=form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[m2],s2); end else begin node:=form1.TreeView1.Items.Add(nil,s1); subnode:=form1.TreeView1.Items.AddChild(node,s2); end; end else begin node:=form1.TreeView1.Items.Add(nil,s1); subnode:=form1.TreeView1.Items.AddChild(node,s2); end; end; end; end;
procedure TForm1.Button1Click(Sender: TObject); var s1,s2:string; node,subnode:TTreeNode; i,j,m,n,m1,m2:integer; begin m1:=0; m2:=0; form1.Table1.Open; form1.Table1.First; i:=form1.Table1.RecordCount; if i>0 then begin for j:=0 to i-1 do begin s1:=form1.Table1.FieldValues['子系统名称']; s2:=form1.Table1.FieldValues['功能名称']; m:=form1.TreeView1.Items.Count; if m>0 then begin for n:=0 to m-1 do begin if form1.TreeView1.Items.Item[n].Text=s1 then begin m1:=m1+1; m2:=n; end; end; if m1=1 then begin form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[m2],s2); m1:=0; end else begin node:=form1.TreeView1.Items.Add(nil,s1); form1.TreeView1.Items.AddChild(node,s2); end; end else begin node:=form1.TreeView1.Items.Add(nil,s1); form1.TreeView1.Items.AddChild(node,s2); end; form1.Table1.Next; end; end; end;
一个相近结构的例子.//////////////////////////////////////////////////////////// //////////数据库结构: ////////// //////////department: name:部门名称,char ////////// ////////// d_no:部门号,int ////////// //////////worker: name:员工姓名,char ////////// ////////// w_no:员工号,int ////////// ////////// d_no:部门号,int ////////// //////////////////////////////////////////////////////////// /////////////显示效果: ////////// /////////////部门1 ////////// ///////////// 员工1 ////////// ///////////// 员工2 ////////// ///////////// ... ////////// /////////////部门2 ////////// ///////////// 员工1 ////////// ///////////// 员工2 ////////// ///////////// ... ////////// /////////////... ////////// //////////////////////////////////////////////////////////// unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Db, ADODB;type TForm1 = class(TForm) TreeView1: TTreeView; Button1: TButton; ADOQuery1: TADOQuery; //连接department ADOQuery2: TADOQuery; //连接worker Edit1: TEdit; //结点信息 procedure Button1Click(Sender: TObject);//生成树 procedure TreeView1Click(Sender: TObject);//显示结点信息 procedure FormClose(Sender: TObject; var Action: TCloseAction);//释放p_data private { Private declarations } public { Public declarations } end;var Form1: TForm1; p_data:pstring; implementation{$R *.DFM}//生成树 procedure TForm1.Button1Click(Sender: TObject); var fn,sn:ttreenode; //fn:部门结点 sn:员工结点 begin treeview1.Items.BeginUpdate; adoquery1.close; adoquery1.sql.clear; adoquery1.sql.add('select * from department'); adoquery1.open; treeview1.Items.Clear; new(p_data); p_data^:='root'; fn:=treeview1.Items.AddObject(nil,'root',p_data); while not adoquery1.Eof do begin with treeview1.Items do begin new(p_data); p_data^:=adoquery1.fieldbyname('d_no').asstring; sn:=treeview1.Items.AddChildobject(fn,adoquery1.fieldbyname('name').asstring,p_data); adoquery2.close; adoquery2.sql.Clear; adoquery2.sql.add('select * from worker where d_no=:d_no'); adoquery2.Parameters.ParamByName('d_no').value:=p_data^; adoquery2.open; while not adoquery2.Eof do begin new(p_data); p_data^:=adoquery2.fieldbyname('w_no').asstring; treeview1.Items.addchildobject(sn,adoquery2.fieldbyname('name').asstring,p_data); adoquery2.Next; end; end; adoquery1.Next; end; adoquery1.Close; adoquery2.close; treeview1.Items.EndUpdate; end;//显示结点信息 procedure TForm1.TreeView1Click(Sender: TObject); begin if treeview1.Selected=nil then exit; case treeview1.Selected.Level of 1:begin edit1.text:='部门号:'+pstring(treeview1.selected.Data)^; end; 2:begin edit1.text:='工号:'+pstring(treeview1.selected.Data)^; end; end; end; //释放p_data procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if p_data<> nil then Dispose(p_data); end;end.
ADD&ADDCHILD
或者改数据结构+用DXDBTREEVIEW
var
s1,s2:string;
node,subnode:TTreeNode;
i,j,m,n,m1,m2:integer;
begin
m1:=0;
m2:=0;
form1.Table1.Open;
form1.Table1.First;
i:=form1.Table1.RecordCount;
if i>0 then
begin
for j:=0 to i-1 do
begin
s1:=form1.Table1.FieldValues['子系统名称'];
s2:=form1.Table1.FieldValues['功能名称'];
m:=form1.TreeView1.Items.Count;
if m>0 then
begin
for n:=0 to m-1 do
begin
if form1.TreeView1.Items.Item[n].Text=s1 then
begin
m1:=m1+1;
m2:=n;
end;
end;
if m1=1 then
begin
subnode:=form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[m2],s2);
end
else
begin
node:=form1.TreeView1.Items.Add(nil,s1);
subnode:=form1.TreeView1.Items.AddChild(node,s2);
end;
end
else
begin
node:=form1.TreeView1.Items.Add(nil,s1);
subnode:=form1.TreeView1.Items.AddChild(node,s2);
end;
end;
end;
end;
但是使用TreeView也是可以实现的。
首先搜索出所有的‘子系统名称’,将它们一一添加到treeview中,然后将每一个‘子系统名称’在数据表中进行过滤,将搜索到的记录中的‘功能名称’添加到此‘子系统名称’的结点下。
var
s1,s2:string;
node,subnode:TTreeNode;
i,j,m,n,m1,m2:integer;
begin
m1:=0;
m2:=0;
form1.Table1.Open;
form1.Table1.First;
i:=form1.Table1.RecordCount;
if i>0 then
begin
for j:=0 to i-1 do
begin
s1:=form1.Table1.FieldValues['子系统名称'];
s2:=form1.Table1.FieldValues['功能名称'];
m:=form1.TreeView1.Items.Count;
if m>0 then
begin
for n:=0 to m-1 do
begin
if form1.TreeView1.Items.Item[n].Text=s1 then
begin
m1:=m1+1;
m2:=n;
end;
end;
if m1=1 then
begin
form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[m2],s2);
m1:=0;
end
else
begin
node:=form1.TreeView1.Items.Add(nil,s1);
form1.TreeView1.Items.AddChild(node,s2);
end;
end
else
begin
node:=form1.TreeView1.Items.Add(nil,s1);
form1.TreeView1.Items.AddChild(node,s2);
end;
form1.Table1.Next;
end;
end;
end;
//////////数据库结构: //////////
//////////department: name:部门名称,char //////////
////////// d_no:部门号,int //////////
//////////worker: name:员工姓名,char //////////
////////// w_no:员工号,int //////////
////////// d_no:部门号,int //////////
////////////////////////////////////////////////////////////
/////////////显示效果: //////////
/////////////部门1 //////////
///////////// 员工1 //////////
///////////// 员工2 //////////
///////////// ... //////////
/////////////部门2 //////////
///////////// 员工1 //////////
///////////// 员工2 //////////
///////////// ... //////////
/////////////... //////////
////////////////////////////////////////////////////////////
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, Db, ADODB;type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
ADOQuery1: TADOQuery; //连接department
ADOQuery2: TADOQuery; //连接worker
Edit1: TEdit; //结点信息
procedure Button1Click(Sender: TObject);//生成树
procedure TreeView1Click(Sender: TObject);//显示结点信息
procedure FormClose(Sender: TObject; var Action: TCloseAction);//释放p_data
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
p_data:pstring;
implementation{$R *.DFM}//生成树
procedure TForm1.Button1Click(Sender: TObject);
var
fn,sn:ttreenode; //fn:部门结点 sn:员工结点
begin
treeview1.Items.BeginUpdate;
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from department');
adoquery1.open;
treeview1.Items.Clear;
new(p_data);
p_data^:='root';
fn:=treeview1.Items.AddObject(nil,'root',p_data);
while not adoquery1.Eof do
begin
with treeview1.Items do
begin
new(p_data);
p_data^:=adoquery1.fieldbyname('d_no').asstring;
sn:=treeview1.Items.AddChildobject(fn,adoquery1.fieldbyname('name').asstring,p_data); adoquery2.close;
adoquery2.sql.Clear;
adoquery2.sql.add('select * from worker where d_no=:d_no');
adoquery2.Parameters.ParamByName('d_no').value:=p_data^;
adoquery2.open;
while not adoquery2.Eof do
begin
new(p_data);
p_data^:=adoquery2.fieldbyname('w_no').asstring;
treeview1.Items.addchildobject(sn,adoquery2.fieldbyname('name').asstring,p_data);
adoquery2.Next;
end;
end;
adoquery1.Next;
end;
adoquery1.Close;
adoquery2.close;
treeview1.Items.EndUpdate;
end;//显示结点信息
procedure TForm1.TreeView1Click(Sender: TObject);
begin
if treeview1.Selected=nil then exit; case treeview1.Selected.Level of
1:begin
edit1.text:='部门号:'+pstring(treeview1.selected.Data)^;
end;
2:begin
edit1.text:='工号:'+pstring(treeview1.selected.Data)^;
end;
end;
end;
//释放p_data
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if p_data<> nil then Dispose(p_data);
end;end.