type里面有
  TResServer = record
    ID: Integer;
    Name: string;
  end;
  presserver = ^TResServer;
var里面有
  ResServer: array of presserver;
以上声明或定义等都是全局的。
下面这段过程跑不过
procedure ExstCa
var
  i: integer;
  TrNode: TTreeNode;
begin
   for i:= 0 to Length(VaArry)-1 do begin
      setlength(ResServer, i + 1);
      New(ResServer[i]);
      ResServer[i]^.ID := VaArry[i].id;//全局记录数据VaArry在此过程前创建并赋了值
      ResServer[i]^.Name := VaArry[i].Name;
      //ShowMessage(IntToStr(ResServer[i]^.ID));
      //ShowMessage(ResServer[i]^.Name);
      TrNode := VODTrV.Items.Add(nil, VaArry[i].Name); //VODTrV为TTreeView控件
      TrNode.Data := ResServer[i];
      ShowMessage(inttostr(presserver(TrNode.Data)^.ID));
   end;
end;
我的目的是:VODTrV控件的每个节点的data对应记录指针。想用此节点的data对应的指针对应的记录。
上面的ShowMessage是用来测试的,跑不过。请问是什么原因????

解决方案 »

  1.   

    补充一下下:
    procedure ExstCa漏了;
    (复制过来时小错误,程序代码里没有漏这个;)
    前面两个ShowMessage跑得过的。
      

  2.   

    應該用VODTrV.Items.AddChildObject吧.
      

  3.   

    请参考以下代码
    数据表结构最好设计成如下:  id      name ....        parent_id
      1       .....               0
      2       .....               1
      3       .....               1
              .....这样用递归写代码很容易的。如:
        Pbmdata =  ^TbmData;
        TbmData = record
            id   :integer;
            name   :string;
            parent_dm   :integer;
            if_end :boolean;
        End;//写根节点
       new(mybm);
       mybm.id:=q.fieldbyname('id').AsInteger;
       mybm.name:=q.fieldbyname('name').AsString;
    //   mybm.cs:=q.fieldbyname('cs').AsInteger;
       mybm.if_end:=q.FieldByName('if_end').AsBoolean;
       mybm.parent_dm:=q.fieldbyname('parent_dm').AsInteger;
    //写户籍树
       insert_tv(tv_1.Items.AddChildFirst(nil,mybm.name),mybm.id);
    procedure Tmainform.insert_tv(toptree:Ttreenode;id:integer);
    // 从父节点开始递归写数据
    var
       midtree:ttreenode;
       mybm :pbmdata;
       q1,q2:tadoquery;
    begin
       q1:=tadoquery.Create(self);
       q1.Connection:=dmform.ADOConnection1;
       q2:=tadoquery.Create(self);
       q2.Connection:=dmform.ADOConnection1;
       q1.SQL.Add('select * from aa where parent_dm='+inttostr(id));
       q1.Prepared;
       q1.Open;
       if q1.Eof then exit;
       while not q1.Eof do
       begin
           new(mybm);
           mybm.id:=q1.fieldbyname('id').AsInteger;
           mybm.name:=trim(q1.fieldbyname('name').AsString);
    //       mybm.cs:=q1.fieldbyname('cs').AsInteger;
           mybm.if_end:=q.FieldByName('if_end').AsBoolean;
           mybm.parent_dm:=q1.fieldbyname('parent_dm').AsInteger;
           midtree:=tv_1.Items.AddChildObject(toptree,mybm.name,mybm);
           q2.SQL.Clear;
           q2.SQL.Add('select * from aa where parent_dm='+inttostr(mybm.id));
           q2.Prepared;
           q2.Open;
           if not q2.Eof then  insert_tv(midtree,mybm.id);
           q2.Close;
           q1.Next;
       end;
       q1.Destroy;
       q2.Destroy;
    end;    发要详细代码,与QQ:549711582联系