目录树(50分)

  • 主题发起人 主题发起人 kai
  • 开始时间 开始时间
K

kai

Unregistered / Unconfirmed
GUEST, unregistred user!
各位下下,请问如何用目录树的形式列一个数据库结构,
我--儿子--孙子--子子孙孙一层层无穷尽也?
 
你的说明太笼统了吧?不过我正在做一个这样的东东
(但没做成控件,只是在程序里头用)
一言而蔽之:在数据库里头放一个Parent字段,指向父亲,
再在程序中运用递归,一层一层加进去就行了。
 
我的一个程序中的代码片段,希望对你有帮助。

procedure tform1.address;
var
mynode,mynode1,mynode2,mynode3,mynode4:ttreenode;
begin
mynode:=treeview1.Items.Add(nil,'我的家');
mynode1:=treeview1.Items.Addchild(mynode,'亲朋好友');
mynode1.ImageIndex:=4;
mynode3:=treeview1.items.addchild(mynode,'碟片管理');
mynode3.ImageIndex:=5;
table1.First;
while not table1.EOF do
begin
mynode2:=treeview1.items.addchild(mynode1,table1.fieldbyname('typename').asstring);
mynode2.ImageIndex:=3;
table1.Next;
end;
table3.First;
while not table3.EOF do
begin
mynode4:=treeview1.items.addchild(mynode3,table3.fieldbyname('typename').asstring);
mynode4.ImageIndex:=6;
table3.Next;
end;
end;
 
cj和茶叶蛋,请叙其详
 
cj和茶叶蛋,请叙其详
 
// 关于rPoint的指针定义
PPoint = ^rPoint;
// 用来定义从PointTable数据库表中获取数据的格式
rPoint = record
// 知识点序列号
id : Integer;
// 知识点标题
Title : String;
// 标注知识点的层次
Layer : Integer;
// 标注知识点的父知识点
OwnerID : Integer;
// 标注是否为终极知识点
EndPoint : Boolean;
// 指针,指向子结点
Children : PPoint;
// 指针,指向下一个兄弟结点
Brother : PPoint;
end;

PPointList = ^rPointList;
rPointList = record
ID : Integer;
IsLeaf : Boolean;
end;
procedure TFormMain.ReallyFillOutLine( APointList : TList;
AParentTreeNode : TTreeNode;
//AParentPosition : Integer;
ALayer : Integer );
var
Counter : Integer;
selfTree : TTreeNode;
Point : PPoint;
List : PPointList;
begin
for counter := 0 to APointList.Count - 1 do
begin
Point := APointList.Items[ Counter ];
if Point^.Layer = ALayer then
begin
New( List );
List^.ID := Point^.id;
List^.IsLeaf := Point^.EndPoint;
AOutLineList.Add( List );

selfTree := TreeLeft.Items.AddChild( AParentTreeNode, Point^.Title );
if Point^.EndPoint then
selfTree.SelectedIndex := 3
else
selfTree.SelectedIndex := 4;
selfTree.StateIndex := Point^.id;
if not Point^.EndPoint then
begin
ReallyFillOutLine( APointList, selfTree, ALayer + 1 );
end;
end;
end;
end;
这时我的代码,还没有系统地调试,用了用,感觉没问题,就甩开了。
(不好意思,一开始用Outline做的,做到一半才想起来应该用Tree做。)
 
对库有要求,需要唯一标识字段ID和父节点字段ParentID.
最好用DBtreeView,一则速度快,二则有原码.
请查收信箱DBtree这就给你寄过去.
 
uu:
dbtreeview没有收到,热切盼望,dbtreeview是for D4的吗?

email:
wenkaish@public.zj.js.cn
 
Kai:
不好意思,这几天我才收263的信,方知你未收到DBtree,再发给你
请收好.
 
我觉得不要用递归,速度太慢.我正写一个程序,显示方法和你一样.我用的是Treeview.你可以在 Treeview 中先显示根节点.当点中该节点的时候在将
子节点加上去.如此反复.速度要快的多.但有个缺点,就是该节点在从未选中
过以前.前面的+号看不见,不知道他有没有子节点.你如果需要源程序的话,我下次
会给你发过去,我这一台机器太慢了.
 
我又回来了.
我的数据库结构是: 节点,父节点;
假设数据库名称为:我的家族;
procedure Tform.FormCreate(Sender: TObject);
begin
query1.close;
query1.sql.clear;
query1.sql.add('select 父节点 from 我的家族 where 父节点 not in (select 节点 from 我的家族)');
query1.open;
if query1.recordcount = 0 then exit;
query1.first;
Treeview.Items.beginUpdate;

while query1.eof=false then
begin
Treeview.Items.Add(nil,query1.fieldvalues[‘父节点’]);
Query1.next;
End;

Treeview.Items.EndUpdate;
end;

procedure Tform. TreeviewDblClick(TreeView: TTreeView;
Node: TTreeNode; Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
if treeview.Selected = nil then exit;
if treeview.selected.haschild =false then
begin
query1.close;
query1.sql.Clear;
query1.sql.Add('Select 节点 from 我的家族 where [父节点]='''+treeview.Selected.Text+'''');
query1.open;
if query1.recordcount <> 0 then
begin
Query1.first;
Treeview.Items.BeginUpdate;
while not Query1.eof do
begin
Treeview.Items.AddChild(treeview.Selected, query1.fieldvalues[节点]);
Query1.next;
end;
treeview.Items.endUpdate;
end;
end;
end;
以上代码是从我的程序中截取下来的有改动,我没运行,但思路就是这样.
 
多人接受答案了。
 
后退
顶部