我想将字符串存入treeview节点的Data属性里,然后双击节点时再将Data里存的字符串提取出来。我是这样存的,不知对不对?
myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString);如果这样写对的话,那如何提取出来赋值给字符窜变量呢?谢谢!

解决方案 »

  1.   

    不行,要申请指针。
    PMyData=^TMyData;
    TMyData=record
        id:string; 
    end;
    var
       p:PMyData;
    begin
       new(p);
       p^.id:=ADOQuery2.FieldByName('CP_ID').AsString;
       myNodeChild.Data:=p;.......使用时:
       str:=PMyData(myNodeChild.Data)^.id;
      

  2.   


    type
      TMyData = record            //申明一个自定义类型, 用于存放Data数据
        ID: String;               //这里可以多个记录域, 可以不仅仅只有ID
      end;
      PMyData = ^TMyData;var
      MyData : PMyData;
    begin
      ......
      new(MyData);
      MyData^.ID := ADOQuery2.FieldByName('CP_ID').AsString;          //注: MyData^.ID可以省略写成MyData.ID
      myNodeChild.Data := MyData; 
      ......
    end;
    另外, 要在TreeView组件的OnDeletion事件中加上以下代码, 以释放Data数据所占的空间:procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
      if Node.Data <> nil then
      begin
        Dispose(Node.Data);
        Node.Data := nil;
      end;
    end;
      

  3.   

    myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString); 
    如果存入Data属性是integer类型我用下面语句可以提取的
    IntToStr(integer(TreeView1.Selected.Data))
      

  4.   


    Data本身是Pointer类型, 占据4字节空间, Integer(TreeView1.Selected.Data) 是把它强制转换为Integer类型来使用,这个没问题。myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString); 
    保存在myNodeChild.Data里的是 ADOQuery2.FieldByName('CP_ID').AsString 这个字符串的地址,而这个字符串在你下次访问 myNodeChild.Data里的地址已经不存在了,这个有问题。
      

  5.   

    所以:var
      MyData : PMyData;
    begin
      ......
      new(MyData);                     //这里要申请一个保存ADOQuery2.FieldByName('CP_ID').AsString内容的空间
      MyData^.ID := ADOQuery2.FieldByName('CP_ID').AsString;
      myNodeChild.Data := MyData;      //然后把空间地址保存在myNodeChild.Data中
      ......
    end;
    同时,要在回收这个空间,否则会内存泄漏:procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
      if Node.Data <> nil then
      begin
        Dispose(Node.Data);
        Node.Data := nil;
      end;
    end;
      

  6.   


    str := PChar(myNodeChild.Data) 
      

  7.   

    哦!有点明白了
    不好意思!再问一下type
      TMyData = record            //申明一个自定义类型, 用于存放Data数据
        ID: String;               //这里可以多个记录域, 可以不仅仅只有ID
      end;
      PMyData = ^TMyData;这个应该写在那个域里
      

  8.   

    bdmh 的方法不行,提取出来的是乱码
      

  9.   


    你可以在TreeView.Data下挂载多个相关信息。只需要修改一下TMyData这个记录类型的定义就行了,比如:
    type 
      TMyData = record
        ID: String;
        No: Integer;
        Checked: Boolean;
      end; 
      PMyData = ^TMyData; 
    在调用时,相应的代码为(下面以TreeView组件的OnChange事件为例):procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    var
      MyData : PMyDaya;
    begin
      MyData := PMyData(Node.Data);
      ShowMessage ('ID :' + MyData.ID);  
      ShowMessage ('No :' + IntToStr(MyData.No));  
      ......
    end;
      

  10.   


    找到单元里type这部分(一般都在单元的前面), 把
    type 
      TMyData = record
        ID: String;     
      end; 
      PMyData = ^TMyData; 
    写进去
      

  11.   


    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes;type
      TMyData = record            //申明一个自定义类型, 用于存放Data数据
      ID: String;              //这里可以多个记录域, 可以不仅仅只有ID
    end;implementationend.
      

  12.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}end.要是在本窗体单元应写那里
      

  13.   

    type 
      PMyData=^TMyData;
      TMyData=record
         id:string;
      end ;  TForm1 = class(TForm) 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end; 
      

  14.   

    2楼正解,必须使用指针,不过不一定要用记录,用PString即可,其余相同。直接PChar是不行的。
      

  15.   

    可以用PSTRING类型转换或用^指针操作
      

  16.   

    var
      p:Pstring;
    begin
      new(p);
      try
      p:=adoquery.fieldbyname('XX').asstring;
      myNodeChild.Data;
      except
      delete(p);
      end;
    ...
    ..
    end;
      

  17.   


    type 
      PMyData=^TMyData; 
      TMyData=record 
        id:string; 
      end ;   TForm1 = class(TForm) 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end;