tmj*_*ac2 4 delphi memory-management delphi-2009
我有一个问题,我试图确定对象的引用是否有效.但它似乎正在回归奇怪的结果.
procedure TForm1.Button1Click(Sender: TObject);
var form1 : TForm;
ref2 : TControl;
begin
form1 := TForm.Create(nil);
form1.Name := 'CustomForm';
form1.Parent := self; //Main Form
form1.Show;
ref2 := form1;
showmessage(ref2.ClassName+' - '+ref2.Name+' - '+BoolToStr(ref2.visible,true));
freeandnil(form1);
showmessage(ref2.ClassName+' - '+ref2.Name+' - '+BoolToStr(ref2.visible,true));
end;
Run Code Online (Sandbox Code Playgroud)
第一个showmessage返回 - "TForm - CustomForm - True"(就像我期望的那样).
第二个showmessage回归 - "TForm - - False".我实际上希望某种访问违规,然后我可以陷阱并知道该引用无效.
在我的应用程序中,我需要在创建它们时编译随机TForm后代的列表,然后稍后检查它们是否已经消失(或者不可见).不幸的是,这是一个基于插件的系统,所以我可以改变所有这些表格来发布"我已完成消息".
像这样的代码是否可以安全使用(假设我实际上正在检查访问违规)?有没有人有任何想法发生了什么.
谢谢
问题是,在某种可能性下,访问的内存仍由Delphi内存管理器保留.在这种情况下,Windows不会生成任何类型的访问冲突,因为该内存属于您!
一种可能性是切换到不同的Delphi内存管理器,它可以检测释放对象的使用.例如,FastMM4有几个"内存卫生"检查,这对于调试非常有用,但即使这样,你也不会立即捕获所有这些错误.
任何TComponent(例如TForm的后代)可以在其它部件被破坏的通知进行注册.
在您的表单中,为您希望收到销毁通知的每个表单调用FreeNotification(表单).然后在同一表单上覆盖Notification()方法.当任何形式(或其他组件)您已被称为FreeNotification()被破坏,你的通知()方法将一个被称为组件引用的形式和参数运行的opRemove.
如果我已经理解了你想要实现的目标,我认为这应该是足够的信息来设计一种方法来做你需要的.
| 归档时间: |
|
| 查看次数: |
4978 次 |
| 最近记录: |