检查表单的存在不起作用

时间:2013-08-05 14:10:02

标签: forms delphi constructor

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

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

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

知道可能出现什么问题?

2 个答案:

答案 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)

  1. 初始化: MyForm:= nil;

  2. 用户FreeAndNil(MyForm)

  3. if(Assigned(MyForm))then 不要做这个程序
    否则
    做这个程序