我想取得每个树节点的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;还是地址分配出错 崩溃啊,高手请指教啊

解决方案 »

  1.   

    我现在加了一段setLength(myid^,22);
    可以运行了,但是我要给节点data赋值就出现问题了
    Treeview1.Selected.Data:=myid^[1];
    说incompatible type integer and pointer
      

  2.   

    Treeview1.Selected.Data:=myid;
    edit1.text:=(inttostr(pmyid(Treeview1.selected.data)^[1]));
    我现在这样写不报错了,就是没数据出来
      

  3.   

    'select * from tree where level=0 and id='+inttostr(i)''
    怀疑查询出的结果可能不是一个。
      

  4.   

    typeTmyid=array of integer;
    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,这是什么原因
      

  5.   

    直接用treenode.data存,赋值要是指针Pointer类型
    没必要用动态数组id:array of integer;只用一个id即可
    pmydata=^Tmydata;
    Tmydata=record
      id:integer;
    end;
    动态创建目录树时将每个treenode对应的id绑定到其data中
      

  6.   

    var
      ID : Pinteger;begin  new(ID)
      ID^ := FieldByName().AsInteger;  Node.Data = ID
    end
      

  7.   

    7L是正解,不要用addchild,用AddChildObject就可以在treeview里加入自定义数据了,网上例子一大堆,搜一下即可
      

  8.   

    生成目录树的时候,将每个treenode对应的id绑定到其data中这句话没错,但是我生成树用的for循环,
    node.data=mydata^id的话,mydata指针最后不就只是指向最后一个i值么,每次调用就只有一个值了
      

  9.   

    唉~现在的人啊
    在使用过程中,了解到其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 
      

  10.   

    如果节点对应的数据就是一个id(32位整数),则直接利用Ttreenode1.data:=pointer(yourid)存储即可
    使用时:myid:=integer(Ttreenode1.data)即可如果节点对应的数据有多项内容,才需要先分配结构,再由data保存此结构的地址,最后还要释放该结构
    所以,我就为treenode再增加了一个datastring:string
    一个string可以编码储存多项内容了,无须先分配结构、最后还要释放该结构
      

  11.   

    建议楼主应该多看看treeview管理对象的例子 就应该明白了