为什么我添加树不成??
我这段代码为什么 不能添加树啊
procedure Tform1.ADDtree(AID:integer;Pnode:Ttreenode);
var
I: Integer;
ANodeData: PNodeData;
NewNode: TTreeNode;
begin
with ADOquery1 do
begin
close;
sql.Clear;
sql.Add('select* from tree_TABLE where PID=:PID');
parameters.ParamByName('PID').Value:=AID;
open;
for i:=0 to recordcount-1 do
begin
ANodeData := New(PNodeData);
ANodeData^.Auto_ID:=fieldbyname('ID').AsInteger;
ANodeDATA^.Parent_ID:=fieldbyname('PID').AsInteger;
ANodeDATA^.caption:=fieldbyname('name').AsString;
NewNode:=treeview1.Items.AddChildFirst(Pnode,name);
NewNode.Data:=ANodeData;
ADDtree(fieldbyname('ID').AsInteger,NewNode);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddTree(0,nil);
end;
问题点数:50、回复次数:26Top
1 楼loon1981(懒家伙)回复于 2005-08-01 22:22:09 得分 0
你的数据里的游标没有移动...
不家OPEN后先FIRST一下Top
2 楼hthunter(茫茫然时光飞逝)回复于 2005-08-01 22:26:15 得分 0
在for循环里你没有ADOquery1.Next;Top
3 楼yimibaer(别人笑我看不穿,我笑别人太疯癫)回复于 2005-08-02 08:22:45 得分 0
1,2樓正解
Adoquery 先first 在循環中Adoquery.next
Top
4 楼xuren1981()回复于 2005-08-02 09:17:54 得分 0
很感谢各位 可是改过后还是不行 添加不成,
Tpnode=record
ID:integer;
caption:string;
end;
Ptreenode=^Tpnode;
..................................
procedure Tform1.ADDtree(AID:integer;Pnode:Ttreenode);
var
I: Integer;
ANodeData: PNodeData;
NewNode: TTreeNode;
begin
with ADOquery1 do
begin
close;
sql.Clear;
sql.Add('select* from tree_TABLE where PID=:PID');
parameters.ParamByName('PID').Value:=AID;
open;
first;
for i:=0 to recordcount-1 do
begin
ANodeData := New(PNodeData);
ANodeData^.Auto_ID:=fieldbyname('ID').AsInteger;
ANodeDATA^.Parent_ID:=fieldbyname('PID').AsInteger;
ANodeDATA^.caption:=fieldbyname('name').AsString;
NewNode:=treeview1.Items.AddChildFirst(Pnode,name);
NewNode.Data:=ANodeData
ADDtree(fieldbyname('ID').AsInteger,NewNode);
next;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AddTree(0,nil);
end;
Top
5 楼xuren1981()回复于 2005-08-02 09:32:39 得分 0
我写错了 其中这句应该是
NewNode:=treeview1.Items.AddChildFirst(Pnode, ANodeDATA^.caption);
可是关键好象不是在这里 我改了还是不行?那位可以指点一下啊Top
6 楼xuren1981()回复于 2005-08-02 10:55:42 得分 0
有那位可以帮我啊 急啊Top
7 楼chenxuqian(aQ)回复于 2005-08-02 11:09:45 得分 0
这问题简单啊,正确的做法是,设置断点用F8跟踪,逐步查明问题所在,
不能添加树,首先是书的数据又没有查出来,其次数据有了添加的过程有没有问题,
我讲的是方法,开始跟踪吧!!Top
8 楼xuren1981()回复于 2005-08-02 12:02:02 得分 0
我做了啊 跟踪不出来啊 怎么办
那里出错了呢Top
9 楼Johnson8021()回复于 2005-08-02 15:18:08 得分 0
ADOquery1 是全局对象,改成函数内的局部对象吧!Top
10 楼Johnson8021()回复于 2005-08-02 15:23:50 得分 0
因为你是用递归算法个,而ADOquery1 是个全局对象,每次第推调用时都把ADOquery1 原有的数据毁坏而无法回归了,在函数内定义一个局部ADO来用吧!Top
11 楼xuren1981()回复于 2005-08-02 15:47:19 得分 0
多次实验 还是不行 我又改了
Procedure Tform1.ADDtree(AID:integer;FatherId:TtreeNode);
var
ADOQuery1:TADOquery;
i:integer;
mynode:Ttreenode;
myptreenode:Ptreenode;
begin
ADOQuery1:=TADOQuery.Create(self);
ADOQuery1.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
'Persist Security Info=False;Initial Catalog=test;Data Source=18-MDX';
with ADOQuery1 do
begin
close;
sql.Clear;
sql.Add('select* from Tree_TABLE where ID=:ID');
parameters.ParamByName('Id').Value:=AID;
open;
first;
for i:=0 to recordcount-1 do
begin
New(myptreenode);
myptreenode^.ID:=fieldbyname('ID').AsInteger;
myptreenode^.caption:=fieldbyname('name').AsString;
mynode:=Treeview1.Items.AddChild(FatherId,myptreenode^.caption);
mynode.Data:=myptreenode;
ADDtree(fieldbyname('ID').AsInteger,mynode);
next;
end
end;
ADOQuery1.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADDtree(0,nil)
end;Top
12 楼Johnson8021()回复于 2005-08-02 16:02:37 得分 0
我觉得你这样添加树效率很低,会多次频繁地跟数据库服务器连接,而且占用内存多。Top
13 楼xuren1981()回复于 2005-08-02 16:04:22 得分 0
那应该怎样做呢?请指教!
可是我这样做不知道为什么就是不行 那里错了
Top
14 楼Johnson8021()回复于 2005-08-02 16:27:28 得分 0
你用这种方法有什么结果?有什么error吗??Top
15 楼xuren1981()回复于 2005-08-02 16:31:14 得分 0
没有错误提示啊 ,可以运行,但是就生成不了树,teview是空白的
谢谢楼上多次指点!Top
16 楼Johnson8021()回复于 2005-08-02 16:37:11 得分 0
sql.Add('select* from Tree_TABLE where ID=:ID');
parameters.ParamByName('Id').Value:=AID;
改成这个
sql.Add('select* from Tree_TABLE where PID=:ID');
parameters.ParamByName('Id').Value:=AID;Top
17 楼Johnson8021()回复于 2005-08-02 16:45:28 得分 0
sql.Add('select* from Tree_TABLE where ID=:ID');
parameters.ParamByName('Id').Value:=AID;
改成这个
sql.Add('select* from Tree_TABLE where PID=:ID');
parameters.ParamByName('PId').Value:=AID;
Top
18 楼Johnson8021()回复于 2005-08-02 16:49:45 得分 0
不可能是空白的吧,至少可以添加一个节点。Top
19 楼xuren1981()回复于 2005-08-02 16:56:46 得分 0
好像还是不行啊 sql.Add('select* from Tree_TABLE where ID=:ID');
parameters.ParamByName('Id').Value:=AID;
ID=:ID'); 后一个ID是参数 ParamByName('Id') 所以这里应该是ID 才对啊Top
20 楼xuren1981()回复于 2005-08-02 16:58:05 得分 0
一个节点都没有啊 不知道怎么回事 找不到出毛病 郁闷了Top
21 楼Johnson8021()回复于 2005-08-02 17:06:41 得分 25
哦,我看错了!
应该是
sql.Add('select* from Tree_TABLE where PID=:ID');
parameters.ParamByName('Id').Value:=AID;
不知道你数据表里的PID和ID是怎样组织的??Top
22 楼xuren1981()回复于 2005-08-02 17:28:06 得分 0
ID PID name
1 0 总公司
2 1 软件部
3 1 办公室
4 2 meriko
是这样的Top
23 楼loon1981(懒家伙)回复于 2005-08-02 23:38:54 得分 0
这是前几天发的一个贴我把他贴过来了.你自己慢慢对一下吧.
MENUID NENUNAME parents_name
00 在职员工 NULL
0001 生管部 在职员工
000101 小海盗 生管部
第一个为他的ID 第一个为节点的名称.第三个存的是他父节点的名称
parents_name字段存放的是他父节点的名称.
//------------------------------创建树BEGIN----------------------------------
//调用的时候传入一个树形控件的名称
procedure TFrm_Set_Power.CreateNavigationTree(tvThis:TTreeView);
Var
sqlstr:String;
myQ,Child:TAdoQuery;
sqlstr2:String;
i:integer;
Begin
i:=0;
tvThis.Items.Clear();
myQ:=TadoQuery.Create(self);
myQ.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;
myQ.Close();
myQ.SQL.Clear();
sqlstr := 'Select menuid,MenuName menuname,MenuUrl menuurl,SetParameters menuparam From T_SysMenuInfo menu';
sqlstr:= sqlstr+' where parents_name=' ;
sqlstr:= sqlstr+'''''';
sqlstr:= sqlstr+' Order By MenuId' ;
myQ.Close();
myQ.SQL.Clear();
myQ.SQL.Add(sqlstr);
myQ.Open();
myQ.First();
While not myQ.Eof do
Begin
tvThis.Items.Add(tvThis.Selected,myQ.FieldByName('menuname').AsString);
begin
Child:=tAdoQuery.Create(Self);
Child.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=WORK;Data Source=sbsever';
sqlstr2:='Select menuid,MenuName menuname,MenuUrl menuurl,SetParameters menuparam From T_SysMenuInfo menu';
sqlstr2:= sqlstr2+' where parents_name=' ;
sqlstr2:= sqlstr2+''''+myQ.FieldByName('menuname').AsString+'''';
sqlstr2:= sqlstr2+' Order By MenuId' ;
Child.Close();
Child.SQL.Clear();
Child.SQL.Add(sqlstr2);
Child.Open();
Child.First();
for i:=i to tvThis.Items.Count-1 do
if tvThis.items.Item[i].Text=myQ.FieldByName('menuname').AsString then
begin
While not Child.Eof do
Begin
tvThis.Items.AddChild(tvThis.items.Item[i],Child.FieldByName('menuname').AsString);
Child.Next;
End;
Child.Free;
break;
END;
end;
i:=i+1;
myQ.Next;
End;
myQ.Free();
sqlstr:='';
sqlstr2:='';
End;
//-------创建树END-----
Top
24 楼loon1981(懒家伙)回复于 2005-08-03 00:01:47 得分 25
你PID为0的时候就为一个根结点吗?如果是这样看下面的代码吧.
我把上面发的修改了一下应该可以的.你自己再调试一下吧.?
//调用的时候传入一个树形控件的名称
procedure TFrm_Set_Power.CreateNavigationTree(tvThis:TTreeView);
Var
sqlstr:String;
myQ,Child:TAdoQuery;
sqlstr2:String;
i:integer;
Begin
i:=0;
tvThis.Items.Clear();
myQ:=TadoQuery.Create(self);
myQ.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//你用的ADOQUERY修改此处的连接字符串
myQ.Close();
myQ.SQL.Clear();
sqlstr := 'Select id,pid,name From Tree_TABLE ';
sqlstr:= sqlstr+' where PID=0' ;
sqlstr:= sqlstr+' Order By Id' ;
myQ.Close();
myQ.SQL.Clear();
myQ.SQL.Add(sqlstr);
myQ.Open();
myQ.First();
While not myQ.Eof do
Begin
tvThis.Items.Add(tvThis.Selected,myQ.FieldByName('name').AsString);
begin
Child:=tAdoQuery.Create(Self);
Child.ConnectionString:=Frm_Main_Menu.ADOConnection1.ConnectionString;//你用的ADOQUERY修改此处的连接字符串
sqlstr2:=sqlstr := 'Select id,pid,name From Tree_TABLE ';
sqlstr2:= sqlstr2+' where PID=' ;
sqlstr2:= sqlstr2+''''+myQ.FieldByName('Id').AsString+'''';
sqlstr2:= sqlstr2+' Order By Id' ;
Child.Close();
Child.SQL.Clear();
Child.SQL.Add(sqlstr2);
Child.Open();
Child.First();
for i:=i to tvThis.Items.Count-1 do
if tvThis.items.Item[i].Text=myQ.FieldByName('name').AsString then
begin
While not Child.Eof do
Begin
tvThis.Items.AddChild(tvThis.items.Item[i],Child.FieldByName('name').AsString);
Child.Next;
End;
Child.Free;
break;
END;
end;
i:=i+1;
myQ.Next;
End;
myQ.Free();
sqlstr:='';
sqlstr2:='';
End;
//-------创建树END-----
Top
25 楼xuren1981()回复于 2005-08-03 10:34:31 得分 0
是我自己的原因 现在弄好了 感谢懒家伙和jonohsonTop
26 楼xuren1981()回复于 2005-08-03 10:37:10 得分 0
是我自己的原因 现在弄好了
感谢懒家伙和jonohson!!Top




