unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
     ss:string;
     ss1:^string;
begin
     ss:='12345';
     new(ss1);
     ss1^:=ss;
     TreeView1.Items[1].Data:=ss1;
end;procedure TForm1.Button1Click(Sender: TObject);
var
     CurrenNode:TTreeNode;
     Ipvalue:^string;
     Ipvaluestr:string;
begin     CurrenNode:=treeview1.Items[1];
     new(Ipvalue);
     try
        Ipvalue:=CurrenNode.Data;
        Ipvaluestr:=Ipvalue^;
     finally
         dispose(Ipvalue);
     end;
     showmessage(Ipvaluestr);
end;end.
现在问题是:
我单击一次 Button1 ,show 出 字符串 12345
我再次单击,就出现错误了,是地址路径错的那种如果,我写procedure TForm1.Button1Click(Sender: TObject);
var
     CurrenNode:TTreeNode;
     Ipvalue:^string;
     Ipvaluestr:string;
begin     CurrenNode:=treeview1.Items[1];
     new(Ipvalue);
     Ipvalue:=CurrenNode.Data;
     Ipvaluestr:=Ipvalue^;
    
     showmessage(Ipvaluestr);
end;
则没有错误,这是什么原因啊?谢谢!

解决方案 »

  1.   

    不要释放,
    如果真要释放,
    treeview重读前或程序关闭时
    才对data逐个释放
      

  2.   

    谢谢大哥
    data 是 treeview 节点的属性
    和 Ipvalue 有什么关系啊?
    谢谢!
      

  3.   

    treeview 节点 data 自己也可以保存 数据啊
      

  4.   

    Ipvalue和CurrentNode.Data都是指针,并且指向了同一块内存(Ipvalue:=CurrenNode.Data)。你用Dispose(Ipvalue)就将那块内存回收了,此时这两个指针是无效的/为定义的。另外,需要注意的是,如果调用Dispose(CurrentNode.Data)并且以后还可能用到Data的话,还要用CurrentNode.Data := nil;
    你可以参考下面的代码:procedure TForm1.Button1Click(Sender: TObject);
    var
    CurrentNode: TTreeNode;
    begin
    CurrentNode:=treeview1.Items[1];
    if Assigned(CurrentNode.Data) then
    showmessage(PString(CurrentNode.Data)^);
    end;
      

  5.   

    new(Ipvalue);和dispose(Ipvalue)都是多余的。procedure TForm1.Button1Click(Sender: TObject);
    var
      CurrenNode:TTreeNode;
      Ipvalue:^string;
      Ipvaluestr:string;
    begin
      CurrenNode:=treeview1.Items[1];
      Ipvalue:=CurrenNode.Data;
      Ipvaluestr:=Ipvalue^;
      showmessage(Ipvaluestr);
    end;