菜鸟使用treeview遇到了麻烦,使用如下代码,很慢,请高手帮忙!! 还有当我点击一个节点,能知道他是第几层节点吗? pjwanglong2000@sohu.

  • 主题发起人 wanglongb
  • 开始时间
W

wanglongb

Unregistered / Unconfirmed
GUEST, unregistred user!
菜鸟使用treeview遇到了麻烦,使用如下代码,很慢,请高手帮忙!! 还有当我点击一个节点,能知道他是第几层节点吗? pjwanglong2000@sohu.com (160分)<br />var
sql,sql1:string;
tempi: integer;
begin
sql:='select * from wuzibianma_dalei';
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(sql);
adoquery1.open;
while not adoquery1.eof do
begin
tempi := tv.Items.AddChild(tv.topitem,adoquery1.fieldbyname('物资大类').asstring).AbsoluteIndex;
sql1:='select * from wuzibianma_zhonglei where 大类代号=:sf';
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sql1);
adoquery2.Parameters.ParamValues['sf']:=adoquery1.fieldbyname('大类代号').asstring;
adoquery2.open;
while not adoquery2.eof do
begin
//加入中类
tv.Items.AddChild(tv.Items.Item[tempi],adoquery2.fieldbyname('物资中类').asstring);
adoquery2.next;
end;
adoquery1.next;
end;
tv.AutoExpand:=true;
end;
这段代码可以实现在窗体打开时在treeview里显示物资大类,并在物资大类下加入物资中类,但是
因为我的中类很多,打开需要很长时间,能否在打开窗体先只显示物资大类,电击此大类时再在这个大类
下填入物资中类,这样可以节约时间,可是怎么做呢?
 
选读出大类,在每个大类的下面加一个小类;如tempnode
onexpand事件中加入读小类,并删除临时类的节点就OK啦。
 
sql:='select * from wuzibianma_dalei';
adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add(sql);
adoquery1.open;
while not adoquery1.eof do
begin
tempi := tv.Items.AddChild(tv.topitem,adoquery1.fieldbyname('物资大类').asstring).AbsoluteIndex;
sql1:='select * from wuzibianma_zhonglei where 大类代号=:sf';
adoquery1.next;
end;
tv.AutoExpand:=true;
end;

在TreeView.OnChangeed中再处理
begin
adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add(sql1);
adoquery2.Parameters.ParamValues['sf']:=node.Text;
adoquery2.open;
while not adoquery2.eof do
begin
//加入中类
tv.Items.AddChild(tv.Items.Item[tempi],adoquery2.fieldbyname('物资中类').asstring);
adoquery2.next;
end;
end;
 
用结构型数组吧,创建窗体的时候把数据写到数组里面去
用到的时候直接到数组里面去取,比你从数据库取快多了
type
Myrec = record
s1:string;
s2:string;
......
end;
ArrayRec: array of Myrec;
 
TreeView 里的 TreeNode节点,有一个 Data 属性(Pointer)。只能存放一个指针。
你建立这个节点时,可同时建立一个 Record ,把指针写入 Data,
可以保存很多有用的数据。
在destory 事件里,要记得释放这些内存哦。要不会内存。。。呵呵
我给用户做了一个程序,其中有一个树,因为是远程的,东西很多,不能一下读过来(太慢了)
每次用户双击一下节点时,才去读其下面的内容。同时在Record里做记录,如果是读过的,
就不会再去读数据库了,可以大大的节约时间。(有的用户拔号还很慢。我也没什么太好的办法了)
 
还有当我点击一个节点,能知道他是第几层节点吗?

procedure Tmainf.TV_gdwjClick(Sender: TObject);
begin
if TV_gdwj.selected<>nil then
begin
case TV_gdwj.Selected.level of
0: begin 第一层
cds_wsgdwj.Close;
end;
1: begin
end;
2: begin

end;
end;//end of case
end;
end;
 
好好看看帮助吧。
TreeNode.Data 很有用的。你要好好利用一下就可以了。
要不你会累死。哈哈 :)
 
我还是给你发去一段代码把,用ado+access做的
 
多人接受答案了。
 
顶部