关于树Treeview控件的运用。---在线等 ( 积分: 100 )

  • 主题发起人 主题发起人 zhangjensy
  • 开始时间 开始时间
Z

zhangjensy

Unregistered / Unconfirmed
GUEST, unregistred user!
誰能提供高效的樹顯示算法?
1---基本资料
2---布面料
3----帆布
4------[a0001]10n帆布
3----双拼布
3----麻布
4------[a10002]11b麻布
2----部件
3------[b10003]
2----包装物
各個字節點都保存在數據庫中,現在要一個一個顯示出來,我用一個算法,不過很慢,5000條記錄用了差不多1-2分鐘!算法如下:
procedure Tfrm.FmtTree();
var
i,j :integer;
leafList,leafListPlus: TList;
leaf,subNode: TTreeNode;
tv: TTreeView;//引用窗体控件
qry: TADOQuery;//引用窗体控件
begin
//初始化
leafList:=TList.Create;
leafListPlus:=TList.Create;
tv:=tvw1;
tv.Items.Clear;
qry:=qry1;
subNode:=tv.Items.AddChild(nil,'月夜风筝(我)的公司');
leafList.Add(subNode);
//处理
while leafList.Count > 0 do
begin
leafListPlus.Clear;
for i:=0 to leafList.Count-1 do
begin
leaf:=leafList;
if leaf.Level = 0 then
qry.SQL.Text:=Format('select code,name,belong from TB where belong = ''%s''',['--'])
else
qry.SQL.Text:=Format('select code,Name,belong from TB where belong = ''%d''',[leaf.StateIndex]);
qry.Open;
for j:= 0 to qry.RecordCount-1 do
begin
subNode:=tv.Items.AddChild(leaf,qry.FieldByName('name').AsString);
subNode.ImageIndex:=subNode.Level;
subNode.StateIndex:=StrToInt(qry.FieldByName('code').AsString);
leafListPlus.Add(subNode);
qry.Next;
end;
end;
leafList.Assign(leafListPlus);
end;
//清理
tv.FullExpand;
leafListPlus.Free;
leafList.Free;
end;

誰能幫幫我啊!
 
while leafList.Count > 0 do
begin
//这里又有查询,记录多的话,会影响速度
end;
解决办法
一次性把全部需要的记录查询出来,根据关系构建
 
一次性查询出数据
然后使用过滤,可能会快些
if leaf.Level = 0 then
qry.Filter:=Format(belong = ''%s''',['--'])
else
qry.Filter:=Format(belong = ''%d''',[leaf.StateIndex]);
qry.filtered:=true;
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=19709
你可以看一下这个,速度绝对快,数据一次性读出,采用递归方法,比较次数少
 
to weichao9999, 你提供的这个算法也是一下子把所有数据全部读出来,全部创建节点到treeview,速度应该不会相差太多的。建议可以先创建首层节点,并赋予其node.data相关属性,在用户需要获取该节点的子节点的时候,再去数据库中获取子节点数据。
 
to anewed
按照楼主的方法走,可能速度会慢些,如果按照我笔记中的方法,速度绝对没问题。
我的参数表里现在有1425条数据,生成树几乎感觉不到延迟。
如果换成楼主的5000条数据,也不会花费几秒钟的时间
 
to anewed
补充一点,你说的方法只能适合正向使用,不适合反向使用。如果我要是通过数据到树上去定位,那就不好办了
 
有更好的簡單的辦法嗎?
請大家幫忙,現在急著解決這個問題,不然的話麻煩大了啊!
 
不知道你是怎样存的,如果是parent、id、name,level,那只需要在查询时安parent、id做一个排序,然后一个循环就搞定了,只用一次数据库操作。
 
我是按Id,Code,Name,Parent,Level來儲存的,如何能一個循環就搞定啊!請賜教,能把代碼貼出來?
 
我晕了~~看你的代码就知道你是新手,刚刚学编程的。。
你为什么非要一下子把所有的接点都加上去了。
在form的create时,其实你可以先添加 root接点。然后在展开的时候再添加子接点。这样就不会慢了。。。
 
to cf83325
这样好象不行吧!你没有载入子节点,那能展的!
而且这样也好象比较麻烦!
最好是了一次载入,关键是算法重要!
 
to weichao9999
我真是没看懂你的程序,我要的在FORM_SHOW中载入整个树的算法!我是结合QUERY来实现数据库操作的,左边是树,右是输入数据界面,树只是作为一个显示功能!
to cf83325
你这样只是单一实现显示功能,但我想问如果要查找树的某个结点,你如何办呢?
 
大富翁的高手都不線嗎?難道這個問題真的沒有更好的答案?難道就這麼一個問題就難到了所有大俠?我對DFW有點失望!
 
大富翁的高手都不線嗎?難道這個問題真的沒有更好的答案?難道就這麼一個問題就難到了所有大俠?我對DFW有點失望!
 
type
TTemp_List=record
ID :integer;
UserName :string[50];
level :Integer;
fatherID :Integer;
end;
var
Temp_List: array of TTemp_List ;
begin
end;

只有使用数组,处理10000,最多也就5秒之内.
 
to jey
能說詳細一點?Temp_List是什麼東東?
能貼代碼出來?
非常感謝!
 
老天帮帮我啊!
再没人回答就要走人!
请高手再现,分不够可再加!
 
www.2ccc.com上有个TREE的加栽例子,印象中有七种不同方法,效率还是不错的,你下了看看
 
to lyplay2
你用过没有啊!
具体在什么地方,我怎么找不到啊!
能把它贴出来?
 
后退
顶部