Fel*_*ipe 0 forms delphi constructor
我有一个表单,我编写了自己的构造函数:
constructor Create(AOwner: TComponent; AParent: TWinControl; ASender: TMyClass;
ATab: String); reintroduce; overload;
Run Code Online (Sandbox Code Playgroud)
要创建这样的表单,我使用以下内容:
try
MyForm := TMyClassForm.Create(nil, Self.Parent, Self as TMyClass, 'FirstTab');
MyForm.ShowModal;
finally
MyForm.Free;
end;
Run Code Online (Sandbox Code Playgroud)
在其他地方,在开始一个程序之前,我需要检查这个表单是否被打开,所以我检查它的存在:
if (Assigned(MyForm)) and (MyForm.Active) and (MyForm.Showing) then
// Don't do the procedure
else
// Do the procedure
Run Code Online (Sandbox Code Playgroud)
现在,如果我打开表单并关闭它,并且我检查这个条件语句,每次我都变为现实,但表单没有打开而且不再显示,因为我在创建后释放了它.
什么可能是问题的任何想法?
您调用Free
了MyForm
全局方法,但未修改引用.所以,MyForm
仍然指现在被破坏的形式.因此Assigned(MyForm)
评估为True
,然后其他两个测试对陈旧的对象引用进行操作.当您操作过时的对象引用时,可能会发生任何事情.在您尝试过的情况下,似乎操作都会返回True
.但是另一次你可能会遇到访问冲突.
您需要将MyForm
变量设置为nil
调用后Free
.冒着重新开始伟大的德尔斐宗教战争的风险,你可能会考虑用FreeAndNil(MyForm)
它代替MyForm.Free
.
你可能会在这里找到我的答案是有启发性的:为什么在使用或释放东西之前我不应该使用"if Assigned()"?