我的代码如下:
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组件的信息给我,如果如何做才不会出现这种情况?是不是 if (pnode1.Text=pname) then 这个条件不充分?那如何解决?谢谢你们。在线等呀,再谢谢啦
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组件的信息给我,如果如何做才不会出现这种情况?是不是 if (pnode1.Text=pname) then 这个条件不充分?那如何解决?谢谢你们。在线等呀,再谢谢啦
解决方案 »
- ModelMaker使用示例请教
- 请大家推荐好点的下载组件
- delphi7 中quick如何控制打印大小
- 为什么我的存储过程在delphi中不能执行,在toad中却可以执行?
- 为了学习,我和女朋友分手了,值吗?.........................................................
- ToolBar做MDI程序的主菜单
- 小小问题,耽误高手一点时间!帮帮小妹我!!!!!
- 求救啊!sos!
- 了解下现在大家用DELPHI开发网上应用用什么?WEBBROKE,INTRAWEB,ACTIVEX+MIDAS?
- 菜鸟提问:TOOLBUTTON控件的用法。
- 公司要开发一个用delphi开发的3层系统,我只知道delphi基本使用,请推荐delphi开发3层方面的书籍,谢谢
- Webbrowser取得网页链接问题?(高分相送啊)
var
i:integer;
p:^string;
begin
for i := 0 to 2 do
begin
new(p);
p^:=inttostr(i);
treeview1.Items.AddObject(nil,'我爱你',p);
end;
end;procedure TForm1.TreeView1DblClick(Sender: TObject);//双击的时候显示编号
var
p:^string;
begin
p:=TreeView1.Selected.Data;
showmessage(p^);
end;
procedure TForm1.cleartree(tree: TTreeview);
var
i:integer;
begin
for i:=0 to tree.Items.Count-1 do
begin
if tree.Items[i].Data<>nil then
Dispose(tree.Items[i].Data);
end;
tree.Items.Clear;
end;
英雄,高手,谁能救我呀?
pnode1:=treeview1.Items.Item[i-1];
if (pnode1.date=物品编号) then 你是不是根据树节点的string来确定是不是父节点,再在这个节点生成他的子树吗??改成用后台的指针记录类型(记录编号)来判断是不是你要的节点。
核心问题根本就不在这里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控制数据,否则当物料名称重复的时候就乱套了