0

我有一个表单,我为它编写了自己的构造函数:

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

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

知道可能是什么问题吗?

4

2 回答 2

5

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

您需要将MyForm变量设置为nilafter call Free。冒着重新开始我们这个时代伟大的宗教德尔福战争的风险,您可能会考虑使用FreeAndNil(MyForm).MyForm.Free

您可能会发现我在这里的回答很有启发性:为什么在使用或释放​​事物之前我不应该使用“if Assigned()”?

于 2013-08-05T14:13:16.803 回答
1
  1. 初始化:MyForm := nil;

  2. 用户 FreeAndNil(MyForm)

  3. if (Assigned(MyForm)) then
    Don't DO THE PROCEDURE
    else
    DO THE PROCEDURE

于 2013-08-06T18:17:38.920 回答