我有一个表单,我编写了自己的构造函数:
constructor Create(AOwner: TComponent; AParent: TWinControl; ASender: TMyClass;
ATab: String); reintroduce; overload;
要创建这样的表单,我使用以下内容:
try
MyForm := TMyClassForm.Create(nil, Self.Parent, Self as TMyClass, 'FirstTab');
MyForm.ShowModal;
finally
MyForm.Free;
end;
在别的地方,在开始程序之前,我需要检查这个表单是否打开,所以我检查它的存在:
if (Assigned(MyForm)) and (MyForm.Active) and (MyForm.Showing) then
// Don't do the procedure
else
// Do the procedure
现在,如果我打开表单然后关闭它,并且我检查这个条件语句,每次我都知道,但表单没有打开而且不再显示,因为我在创建后释放了它。
知道可能出现什么问题?
答案 0 :(得分:5)
您在Free
全局方法上调用了MyForm
,但未修改引用。所以,MyForm
仍然指的是现在被破坏的形式。因此Assigned(MyForm)
的计算结果为True
,然后其他两个测试对陈旧的对象引用进行操作。当您操作过时的对象引用时,可能会发生任何事情。在您尝试过的情况下,似乎操作都返回True
。但是另一次你可能会遇到访问冲突。
您需要在致电MyForm
后将nil
变量设置为Free
。冒着重新开始我们时代伟大的德尔菲宗教战争的风险,你可以考虑使用FreeAndNil(MyForm)
代替MyForm.Free
。
你可能会在这里找到我的答案:Why should I not use "if Assigned()" before using or freeing things?
答案 1 :(得分:1)
初始化: MyForm:= nil;
用户FreeAndNil(MyForm)
if(Assigned(MyForm))then
不要做这个程序
否则
做这个程序