我想取得每个树节点的id,就想用数组来存id,用指针来取id,我第一个方法是用结构体:
pmydata=^Tmydata;
Tmydata=record
id:array of integer;
end;
var
i:integer;
myid:pmydata;
begin
new(myid);
for i:=0 to 100 do begin
with adoquery1 do begin
close;
sql.Clear;
sql.Add('select * from tree where level=0 and id='+inttostr(i)+'');
open;
node:=treeview1.Items.AddChild(nil,trim(fieldbyname('name').AsString));
接下来我想这样
myid^.id[i]:=fieldbyname('id').AsInteger;这句话出现内存错误。
然后我就想不要结构体了,直接定义数组:
type
Tmyid=array of integer;
pmyid=^Tmyid;
var
myid:pmyid;
i:integer;
begin
new(myid);
for i:=0 to 100 do begin
with adoquery1 do begin
close;
sql.Clear;
sql.Add('select * from tree where level=0 and id='+inttostr(i)+'');
open;
然后怎么写都不对:
myid^[i]:=fieldbyname('id').AsInteger;还是地址分配出错 崩溃啊,高手请指教啊
pmydata=^Tmydata;
Tmydata=record
id:array of integer;
end;
var
i:integer;
myid:pmydata;
begin
new(myid);
for i:=0 to 100 do begin
with adoquery1 do begin
close;
sql.Clear;
sql.Add('select * from tree where level=0 and id='+inttostr(i)+'');
open;
node:=treeview1.Items.AddChild(nil,trim(fieldbyname('name').AsString));
接下来我想这样
myid^.id[i]:=fieldbyname('id').AsInteger;这句话出现内存错误。
然后我就想不要结构体了,直接定义数组:
type
Tmyid=array of integer;
pmyid=^Tmyid;
var
myid:pmyid;
i:integer;
begin
new(myid);
for i:=0 to 100 do begin
with adoquery1 do begin
close;
sql.Clear;
sql.Add('select * from tree where level=0 and id='+inttostr(i)+'');
open;
然后怎么写都不对:
myid^[i]:=fieldbyname('id').AsInteger;还是地址分配出错 崩溃啊,高手请指教啊
解决方案 »
- 菜鸟请教2个通讯问题 请高手指导指导 谢谢!!
- 谁有 komfort.dll SOPCDA~1.dll w95_s7.dll 请发给我下,谢谢! 邮箱: [email protected]
- 如何利用delphi制作类似QQ形式的工具条?
- 如何得到操作系统里数据库所有驱动程序的名称?
- 在线等!刚做数据库方面的程序,哪位能给个思路!
- 这个取cpu号的函数会不会在不同的计算机上到同样的号,概率有多大
- 跪求查找各种DELPHI函数的方法以及相关资料!
- 迷途的羔羊~~需要大家的帮忙~~~
- 我该如何将输入的字符以******的形式显示
- 今天爽想给分(200)想知道关于文件操作的所有函数的用法
- 求教:内存分配和释放的问题
- 关于delphi出图的问题,急求
可以运行了,但是我要给节点data赋值就出现问题了
Treeview1.Selected.Data:=myid^[1];
说incompatible type integer and pointer
edit1.text:=(inttostr(pmyid(Treeview1.selected.data)^[1]));
我现在这样写不报错了,就是没数据出来
怀疑查询出的结果可能不是一个。
pmyid=^Tmyid;var
Form9: TForm9;
node,node1:ttreenode;
a,j,c,e,id:string;
nodeid:string;
myid:pmyid;
implementation{$R *.dfm}
procedure TForm9.FormCreate(Sender: TObject);
var
i:integer;
begin
new(myid);with adoquery3 do
begin
close;
sql.Clear;
sql.Add('select max(level) as le,max(id) as idd from tree');
open;
c:=trim(fieldbyname('idd').AsString);end;
for i:=1 to strtoint(c) do begin
with adoquery1 do
begin
close;
sql.Clear;
sql.Add('select * from tree where level=0 and id='+inttostr(i)+'');
open;
node:=treeview1.Items.AddChild(nil,trim(fieldbyname('name').AsString));
setLength(myid^,22);
myid^[i]:=fieldbyname('id').AsInteger;
j:=trim(fieldbyname('id').AsString);
end;
if j<>'' then begin
with adoquery2 do
begin
close;
sql.Clear;
sql.Add('select * from tree where level=1 and parentid='+j+' order by id');
open;
node1:=treeview1.Items.AddChild(node,trim(fieldbyname('name').AsString));
e:=trim(fieldbyname('id').AsString);
end;with adoquery3 do
begin
close;
sql.Clear;
sql.Text:='select * from admin where did='+inttostr(i)+' and sid='+e+'';
open;
treeview1.Items.AddChild(node1,trim(fieldbyname('name').AsString));
end;end
else
begin
treeview1.Items.Delete(node);
end;end;
end;procedure TForm9.TreeView1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to treeview1.Items.Count-1 do begin
if (treeview1.Items[i].Selected=true) and (treeview1.Items[i].Level=0)then begin
Treeview1.Items[i].Data:=myid;
edit1.text:=(inttostr(pmyid(Treeview1.Items[i].data)^[i]));
Treeview1.Items[i].Data:=nil;
end;
end;
end;
end.
我现在点节点只能出来第二个父节点id=3 点第一个没反应 点第三个父节点取出的值=0,这是什么原因
没必要用动态数组id:array of integer;只用一个id即可
pmydata=^Tmydata;
Tmydata=record
id:integer;
end;
动态创建目录树时将每个treenode对应的id绑定到其data中
ID : Pinteger;begin new(ID)
ID^ := FieldByName().AsInteger; Node.Data = ID
end
node.data=mydata^id的话,mydata指针最后不就只是指向最后一个i值么,每次调用就只有一个值了
在使用过程中,了解到其TTreeNode对象的data属性存储相关数据很有用,一般情况下,我们先声明一个结构体以及其指针,例如: type PMyRc = ^TMyRc; TMyRc = Record id:string; name:string; age:integer; end; 添加一个节点,显示信息为TMyRc的name,同时存储id,age。方法如下: var p:PMyRc; i:integer; begin Randomize; for i:= 0 to 9 do begin New(p); p.id:=inttostr(random(100)); p.name:='name'+ inttostr(random(205)); p.age:=random(90); // Caption := p.id+' '+P.name + ' '+inttostr(p.age); TreeView1.Items.AddObject(nil,p.name,Tobject(p)); //dispose(p); 如果在这里释放指针,id,age并不能存在树中,而是在这里就被释放了。应该在释放树的事件里书写。 end; end; 释放树的事件deletion, 即使是删除也会执行这些代码。所以不用担心内存泄漏。但是如果不书写以下代码,或者用相关的方式释放内存,必定会造成内存泄漏。 procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode); begin dispose(pmyrc(node.data)); end; 访问某个树枝中的age值: Pmyrc(TreeView1.Selected.data)^.age
使用时:myid:=integer(Ttreenode1.data)即可如果节点对应的数据有多项内容,才需要先分配结构,再由data保存此结构的地址,最后还要释放该结构
所以,我就为treenode再增加了一个datastring:string
一个string可以编码储存多项内容了,无须先分配结构、最后还要释放该结构