递归算法生成商品目录树(50分)

  • 主题发起人 主题发起人 sun.sir
  • 开始时间 开始时间
S

sun.sir

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
我想用数据表Categor(ParentCategoryId,CategoryId,CategoryDesc)和Treeview控件来实现商品目录树!请问实现该目标的最佳途径是用何种方法来实现(即生成树的效率最高!)
下面是我写的一个递归算法!它没有实现我的想法,请哪位大虾来搞定它!并且我在递归中用了二个SQL语句,是否会很影响效率,请协助我进行分析!
兄弟们,我实在是囊中羞涩,只能给本问题50分了!等我发财了,会多多回报你们的!

目标:
+--商品
+--软件
+--S001
| +--S00101
| | +--S0010101
| |--S00102
| +--S0010201
+--S002
|
+--S003
+--S00301

本人的递归算法的结果:
+--商品
+--软件
+--S001
| +--S00101
| | +--S0010101
| |--S00102
|
+--S002
|
+--S003

procedure TCategoryf.DispTree(CatId:integer;Nodex:TTreeNode);
Var MyNode:TTreeNode;
var i:integer;
begin
With AQry1 do
begin
Close;
SQL.clear;
Sql.Add('Select * from Categories where ParentCategoryId='+Inttostr(CatId));
open;
if Recordcount<>0 then Nodex.Selected:=true;
While Not Eof do
begin
tvw.Items.AddChildObject(Tvw.Selected,Fieldbyname('CategoryDesc').asstring);
next;
end;

First;
While not Eof do
begin////
With AQry2 do
begin//
Close;
SQl.clear;
Sql.Add('Select * from Categories where ParentCategoryId='+AQRy1.FieldbyName('CategoryId').asstring);
open;
if recordcount<>0 then DispTree(fieldbyName('ParentCategoryId').asinteger,Tvw.Selected);
end;//
Aqry1.Next;
end;////
end;
end;

调用:DispTree(-1000,Tvw.items[0]) -1000 为顶层目录接点(软件)的ParentCategoryId,Tvw.items[0]表示为('商品')的节点!


 
你对递归的运用有错。
试试下面的代码,我为测试。
procedure TCategoryf.DispTree(CatId:integer;Nodex:TTreeNode);
Var i:integer; Q: TQuery; TNode:TTreeNode;
begin
Q:=TQuery.Create(Self);
try
With Q
do begin
Sql.Add('Select * from Categories where ParentCategoryId='+Inttostr(CatId));
open;
While Not Eof
do begin
TNode:=tvw.Items.AddChild(NodeX,Fieldbyname('CategoryDesc').asstring);
DispTree(Fieldbyname('CategoryID').AsInteger, TNode);
next;
end;
end;
finally
Q.Free;
end;
end;
 
zensst:
用DispTree(-1000,Tvw.items[0])来调用你的函数,
问题还没有解决,生成的商品目录树还是老样子!
当然,你的程序代码写的还是蛮不错的!
另,为何用动态创建控件Q:=TQuery.Create(Self);
是为了提高效率和节省空间吗!谢谢!
Sun Da Guang
 
zensst:
搞定了!
不好意思!我是将你的过程名改名为DispTree1,然后
用DispTree1(-1000,Tvw.items[0])调用!结果你的过程
中有一句DispTree()未改为DispTree1(),故尔未能测试成功!
Good Morning,Thank You Very Much!
动态创建控件Q:=TQuery.Create(Self);的好处我还是
不很明了!
Sun.sir@263.net
 
谢谢 zensst!
 
动态创建只是为了在每个调用中,Q是独立的,相互不影响,没别的意思。
 
后退
顶部