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.   

    问题在这里:Ipvalue:=@(CurrenNode.Data);
      

  2.   

    楼上说得对
    Ipvalue:=@(CurrenNode.Data);释放了后面访问就会出错了,
    所以不要释放
    如果真要释放,
    在treeview重读前或程序关闭时
    才对data逐个释放
      

  3.   

    谢谢!Ipvalue:=@(CurrenNode.Data);是什么意思啊?是不是我的 程序要改为 Ipvalue:=@(CurrenNode.Data); 啊
    还是不明白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;当我第二次 单击 button1 按钮时,
    又会重新读 CurrenNode.Data 啊这怎么会有错了!
    谢谢!
      

  4.   

    你把同一指针dispose两次,当然有问题了。改成这样
    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;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      dispose(TreeView1.Items[1].Data);
    end;