检查表单的存在不起作用

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)

现在,如果我打开表单并关闭它,并且我检查这个条件语句,每次我都变为现实,但表单没有打开而且不再显示,因为我在创建后释放了它.

什么可能是问题的任何想法?

Dav*_*nan 5

您调用FreeMyForm全局方法,但未修改引用.所以,MyForm仍然指现在被破坏的形式.因此Assigned(MyForm)评估为True,然后其他两个测试对陈旧的对象引用进行操作.当您操作过时的对象引用时,可能会发生任何事情.在您尝试过的情况下,似乎操作都会返回True.但是另一次你可能会遇到访问冲突.

您需要将MyForm变量设置为nil调用后Free.冒着重新开始伟大的德尔斐宗教战争的风险,你可能会考虑用FreeAndNil(MyForm)它代替MyForm.Free.

你可能会在这里找到我的答案是有启发性的:为什么在使用或释放​​东西之前我不应该使用"if Assigned()"?