我的代码如下:
procedure tform3.showtree();
var
pnode1,pnode,curnode:ttreenode;
pcode,code,pname,name:string;
i,count,order:integer;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select a.*,b.* from 物料清单 a, 物料主文件 b');
adoquery1.SQL.Add('where (a.物料编号=b.物料编号)');
adoquery1.SQL.Add('order by a.低层码,a.父项编号');
adoquery1.Open;
while not adoquery1.Eof do
begin
pcode:=adoquery1.fieldbyname('父项编号').AsString;
code:=adoquery1.fieldbyname('物料编号').AsString;
name:=adoquery1.fieldbyname('物料名称').AsString;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select 物料名称 from 物料主文件 where 物料编号='''+pcode+'''');
adoquery2.Open;
pname:=adoquery2.fieldbyname('物料名称').AsString;
count:=treeview1.Items.Count;
for i:=1 to count do
begin
pnode1:=treeview1.Items.Item[i-1];
if (pnode1.Text=pname) then ///////////////问题在这里:这个条件好象不充分?才导致出现我下述的问题?/////////////
begin
//创建子节点
pnode:=treeview1.Items.AddChild(pnode1,name);
pnode.Expanded:=true;
//根据创建顺序储存数据信息
order:=order+1;
mytable[order,1]:=pcode;
mytable[order,2]:=code;
mytable[order,3]:=name;
//储存树节点的节点数据
mynodetable[order]:=pnode; end;
end;
//处理下一条记录
adoquery1.Next;会出现如下的问题:如果在物料主文件里有两个编码不一样的,名称是同样的物料,显示在树上的结构
将会出现如下的问题:例如在物料主文件里有两个组件原料:
物料编号,物料名称
112 我爱你 (注:这个是个组件)
333 我爱你 (注:这个只是个物料)
如果我想在树上显示 物料编号为 333这个物料信息时,它就显示112组件的信息给我,如果如何做才不会出现这种情况?有个高手提示如下:
核心问题根本就不在这里count:=treeview1.Items.Count;pnode1:=treeview1.Items.Item[i-1];pnode:=treeview1.Items.AddChild(pnode1,name);组合起来就出错了。
1、你首先获取了TreeView的总节点数,然后通过此进行循环
2、但是当你插入一个节点后实际上Count已经发生变化,I实际也发生了变化,所以立即进入了死循环状态
3、但是你采用的是Count控制,所以死循环马上跳出了,所以不容易发现解决方案
1、通过while进行控制
while I < TreeView.Items.Count do
2、当找到一个条件插入一个节点后,I值加一
3、另外,你最好通过Data控制数据,否则当物料名称重复的时候就乱套了但我还是不会解决我的上述问题呀?救我呀,Delphi 人!……
procedure tform3.showtree();
var
pnode1,pnode,curnode:ttreenode;
pcode,code,pname,name:string;
i,count,order:integer;
begin
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select a.*,b.* from 物料清单 a, 物料主文件 b');
adoquery1.SQL.Add('where (a.物料编号=b.物料编号)');
adoquery1.SQL.Add('order by a.低层码,a.父项编号');
adoquery1.Open;
while not adoquery1.Eof do
begin
pcode:=adoquery1.fieldbyname('父项编号').AsString;
code:=adoquery1.fieldbyname('物料编号').AsString;
name:=adoquery1.fieldbyname('物料名称').AsString;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select 物料名称 from 物料主文件 where 物料编号='''+pcode+'''');
adoquery2.Open;
pname:=adoquery2.fieldbyname('物料名称').AsString;
count:=treeview1.Items.Count;
for i:=1 to count do
begin
pnode1:=treeview1.Items.Item[i-1];
if (pnode1.Text=pname) then ///////////////问题在这里:这个条件好象不充分?才导致出现我下述的问题?/////////////
begin
//创建子节点
pnode:=treeview1.Items.AddChild(pnode1,name);
pnode.Expanded:=true;
//根据创建顺序储存数据信息
order:=order+1;
mytable[order,1]:=pcode;
mytable[order,2]:=code;
mytable[order,3]:=name;
//储存树节点的节点数据
mynodetable[order]:=pnode; end;
end;
//处理下一条记录
adoquery1.Next;会出现如下的问题:如果在物料主文件里有两个编码不一样的,名称是同样的物料,显示在树上的结构
将会出现如下的问题:例如在物料主文件里有两个组件原料:
物料编号,物料名称
112 我爱你 (注:这个是个组件)
333 我爱你 (注:这个只是个物料)
如果我想在树上显示 物料编号为 333这个物料信息时,它就显示112组件的信息给我,如果如何做才不会出现这种情况?有个高手提示如下:
核心问题根本就不在这里count:=treeview1.Items.Count;pnode1:=treeview1.Items.Item[i-1];pnode:=treeview1.Items.AddChild(pnode1,name);组合起来就出错了。
1、你首先获取了TreeView的总节点数,然后通过此进行循环
2、但是当你插入一个节点后实际上Count已经发生变化,I实际也发生了变化,所以立即进入了死循环状态
3、但是你采用的是Count控制,所以死循环马上跳出了,所以不容易发现解决方案
1、通过while进行控制
while I < TreeView.Items.Count do
2、当找到一个条件插入一个节点后,I值加一
3、另外,你最好通过Data控制数据,否则当物料名称重复的时候就乱套了但我还是不会解决我的上述问题呀?救我呀,Delphi 人!……
解决方案 »
- 在Delphi 如何安全读取Novell 的foxpro数据库?
- oracle8.x +delphi5 图片存取问题(高手请进)
- 穷人急救,各位大歌 我拿高分求教
- 安装DVD解压卡后是否可用MEDIAPLAYER控件直接播放*.VOB文件?
- 再谈同步
- 开发三层架构时遇到的几个问题~~(初学者)
- 有开发人事,考勤,薪资的请帮帮忙,thanks
- 一个关于数据库的问题。
- 多层应用,请低手指教!!!
- Webbrowser中按^N会弹出IE来,我可不可过滤掉它!
- 最近发现一个很怪的问题,不知道大家的是否也碰到过,很值很一看(关于版权)希望大家能发表一下意见和看法
- 将连接session封装在bpl中,如何多个bpl共享这一个数据库连接?解决问题者再给100
PSort = ^TPSort; //指针
TPSort = record
id: integer;
Sort:String;
end; procedure TForm1.Button1Click(Sender: TObject);
var
Sort : PSort;
node : TTreeNode;
begin
new(Sort);
Sort.id :=1;
Sort.Sort :='文件';
with treeView1.Items do
begin
node := addchild(nil,sort.Sort);
node.Data := sort;
end;
new(sort);
Sort.id :=2;
Sort.Sort :='资料';
with treeView1.Items do
begin
node := addchild(nil,sort.Sort);
node.Data := sort;
end;
end;procedure TForm1.treeview1DblClick(Sender: TObject);
var
sort:pSort;
begin
New(sort);
sort := TreeView1.Selected.Data;
showmessage(sort.Sort);
end;
你有MSN没有
谢谢你。晚上用QQ:123033319