treeview中的data无法正确读出,请大侠赐教。(50分)

  • 主题发起人 主题发起人 yfli
  • 开始时间 开始时间
Y

yfli

Unregistered / Unconfirmed
GUEST, unregistred user!
程序如下,为何我无发读出正确Treeview中Data的数据
请告诉我,我的程序错在那里。

写入程序:
procedure TForm1.Button1Click(Sender: TObject);
var
MyData:Integer;
MyPTR:PInteger;
begin
MyData := StrToInt(Edit1.Text);
MyPTR:= @MyData;
TreeView1.Items.AddObject(nil,'Item',MyPTR);
Dispose(MyPTR);
end;
读出程序:
procedure TForm1.Button2Click(Sender: TObject);
var
MyPTR:PInteger;
begin
if TreeView1.Selected <> nil then
begin
MyPTR := TreeView1.Selected.Data;
ShowMessage(Inttostr(MyPTR^));
Dispose(MyPTR);
end;
 
>>myData := StrToInt(Edit1.Text);
>>MyPTR:= @MyData;
>>TreeView1.Items.AddObject(nil,'Item',MyPTR);
>>Dispose(MyPTR);
^^^^^^^^^^^^^^^^^^^ 将myptr指向的内存释放.
^^^^^
都释放了, 你还读什么?
 
老兄,好象你的程序很乱哦!
>>MyData := StrToInt(Edit1.Text);
>>MyPTR:= @MyData;
>>TreeView1.Items.AddObject(nil,'Item',MyPTR);
>>Dispose(MyPTR);

1.局部变量在堆栈段申请空间,@MyData这种写法本身就是错误的。
你应该在数据段申请空间:
type
MyPInteger: ^Integer;
...
New(MyPtr);
MyPtr^ := StrToInt(Edit1.Text);
...

2.你没有为MyPtr申请空间,怎么可以Dispose呢?何况在这个例程中即使你申请
了也不能Dispose,否则Data会指向一个非法地址。你应该在TreeView的
OnDeletion中释放:
...
begin
Dispose(TMyPtr(Node.Data));
end;

3.相应地,读出程序也不可Dispose一个并不存在的内存。
 
谢谢,barton和Another_eyes刚刚开始学习指针,让大家见笑了,barton如果有关于指针的详细资料的话,请给寄一份到yfli218@263.net.晕 、晕。。。
 
后退
顶部