已知一个表 Data.mdb
"ID" "PID" "FName"
1 0 "福建省"
2 0 "广东省"
3 0 "四川省"
4 1 "福州市"
5 1 "厦门市"
6 1 "泉州市"
7 2 "佛山市"
8 2 "东莞市"
9 2 "广州市"
10 3 "无锡市"
11 3 "常州市"
12 3 "苏州市"现在要用TreeViwe显示出来
福建省
├福州市
├厦门市
├泉州市
广东省
├佛山市
├东莞市
├广州市
江苏省
├无锡市
├常州市
├苏州市一定要用递归方式,求路思。
"ID" "PID" "FName"
1 0 "福建省"
2 0 "广东省"
3 0 "四川省"
4 1 "福州市"
5 1 "厦门市"
6 1 "泉州市"
7 2 "佛山市"
8 2 "东莞市"
9 2 "广州市"
10 3 "无锡市"
11 3 "常州市"
12 3 "苏州市"现在要用TreeViwe显示出来
福建省
├福州市
├厦门市
├泉州市
广东省
├佛山市
├东莞市
├广州市
江苏省
├无锡市
├常州市
├苏州市一定要用递归方式,求路思。
解决方案 »
- if语句的问题,我是delphi初学者。谁能帮我解释下这段话的意思?万分感谢!!!
- 如何将adoquery查询到的数据的某些字段动态添加到fastreport报表中?
- 在LockType为ltBatchOptimistic的AdoQuery中的问题,急。。。。。
- 入门者请教!
- 如何用SQL语句实现,使多条重复的记录,只剩下一条记录,其余的都删掉?
- 怎样让combobox1不能被选择
- 开发TCP服务器的高手来看看 帮小弟一把
- Hook的制作
- sql问题,解决者给高分
- 请教一个问题:如何编写一个位于最最上层的窗口,像oicq那样(我发现它能够位于最最上层)
- vb\delphi\c++\的未来
- 求delphi的数据类型
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, ComCtrls, Grids, DBGrids;type
TForm1 = class(TForm)
TreeView1: TTreeView;
ADOConnection1: TADOConnection;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOQuery1: TADOQuery;
procedure FormCreate(Sender: TObject);
procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
procedure TreeView1Click(Sender: TObject);
private
{ Private declarations }
procedure SQL(strSQL: string; ADOQuery1: TADOQuery);
procedure CreateNode(BootNode: TTreeNode);
public
{ Public declarations }
end; // 定义一个结构体,内容自行添加
NodeData = record
ID, Name: string;
end; PNodeData = ^NodeData;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.SQL(strSQL: string; ADOQuery1: TADOQuery);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(strSQL);
ADOQuery1.Open;
end;procedure TForm1.TreeView1Click(Sender: TObject);
var
strID: string;
begin
//点击节点,获得ID(ID是唯一的)
strID := PNodeData(TreeView1.Selected.Data).ID;
MessageBox(Handle, PChar(strID), '节点的ID', MB_ICONINFORMATION);
if TreeView1.Selected <> nil then
begin
ADOQuery1.Close;
ADOQuery1.SQl.Clear;
if TreeView1.Selected.Level = 0 then
ADOQuery1.SQl.Add('select * from tree')
else
ADOQuery1.SQL.Add('select * from tree where ID like '+QuotedStr(strID)+'');
ADOQuery1.Open;
end
end;procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
Dispose(PNodeData(Node.Data)); //关闭窗口后释放内存
end;procedure TForm1.CreateNode(BootNode: TTreeNode);
var
ADOQuery1: TADOQuery;
strSQL: string;
PChildNode: PNodeData;
ChildNode: TTreeNode;
begin
ADOQuery1 := TADOQuery.Create(nil); // 创建ADOQuery1
try
ADOQuery1.Connection := ADOConnection1; // 连接ADOConnection1(添加的控件)
// 用ID做条件查询记录
strSQL := Format('select * from tree where Name <> ''中华人民共和国'' and parID = %s', [QuotedStr(PNodeData(BootNode.Data)^.ID)]);
SQL(strSQL, ADOQuery1); // 调用
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
New(PChildNode); // 分配内存(记得用完后要释放内存)
PChildNode^.ID := ADOQuery1.FieldByName('ID').AsString; // ID
PChildNode^.Name := ADOQuery1.FieldByName('Name').AsString; // Name
ChildNode := TreeView1.Items.AddChildObject(BootNode, PChildNode^.Name, PChildNode); // 添加子节点
CreateNode(ChildNode); // 开始递归
ChildNode.Data := PChildNode; // 赋给节点的Data属性,里面存着ID、Name
ADOQuery1.Next; // 跳转到下一条记录
end;
finally
FreeAndNil(ADOQuery1); // 用完后释放并置空
end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
BootNode: TTreeNode; // 根节点
PBootNode: PNodeData; // 根节点数据,用于存储ID
begin
New(PBootNode); // 分配内存
PBootNode^.ID := '0';
BootNode := TreeView1.Items.AddObject(nil, '中华人民共和国', PBootNode); // 添加根节点
CreateNode(BootNode); // 开始创建子节点
TreeView1.FullExpand; // 展开所有节点
end;end.
Delphi 2010环境下完好(电脑上只有D5,运行出错)。
这是运行之前,有ADOConnection1、ADOQuery1、DBGrid1、DataSource(这些控件的连接我就不说了)
我也来一个,看这里:http://blog.csdn.net/js0001/article/details/4377154