Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 检查表格';人的存在不存在';行不通_Forms_Delphi_Constructor - Fatal编程技术网

Forms 检查表格';人的存在不存在';行不通

Forms 检查表格';人的存在不存在';行不通,forms,delphi,constructor,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'); M

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

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,但是表单没有打开,也不再显示,因为我在创建之后释放了它


知道问题出在哪里吗?

您在
MyForm
全局方法上调用了
Free
,但您没有修改引用。所以,
MyForm
仍然是指现在已销毁的表单。因此
Assigned(MyForm)
的计算结果为
True
,然后其他两个测试对陈旧对象引用进行操作。当您对过时的对象引用进行操作时,任何事情都可能发生。在您尝试过的情况下,操作似乎都返回
True
。但另一次,您可能会遇到访问冲突

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


您可能会发现我的回答很有启发性:

您在
MyForm
全局方法上调用了
Free
,但您没有修改引用。所以,
MyForm
仍然是指现在已销毁的表单。因此
Assigned(MyForm)
的计算结果为
True
,然后其他两个测试对陈旧对象引用进行操作。当您对过时的对象引用进行操作时,任何事情都可能发生。在您尝试过的情况下,操作似乎都返回
True
。但另一次,您可能会遇到访问冲突

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

你可能会发现我的回答很有启发性:

  • 初始化: MyForm:=零

  • 用户FreeAndNil(MyForm)

  • 如果(已分配(MyForm)),则
    不要执行此过程
    否则
    执行以下步骤

  • 初始化: MyForm:=零

  • 用户FreeAndNil(MyForm)

  • 如果(已分配(MyForm)),则
    不要执行此过程
    否则
    执行以下步骤


  • 它工作得很好,但我希望Free会使这个将变量设置为nil的任务。。。我看不出不要那样做有什么意义。感谢一个Lotinronic,我的链接导致有人从该答案中删除了一个upvote。@Felipe:调用Free()并不会自动将变量置零,为此,您必须使用FreeAndNil()(实际上,Free()会在ARC下的iOS编译器中将变量置零,但目前这是一个例外)@Felipe我在最后一段中链接到的答案非常详细地涵盖了您在评论中提出的确切主题。它工作得非常完美,但我预计Free会使这个变量设置为零的任务。。。我看不出不要那样做有什么意义。感谢一个Lotinronic,我的链接导致有人从该答案中删除了一个upvote。@Felipe:调用Free()并不会自动将变量置零,为此,您必须使用FreeAndNil()(实际上,Free()会在ARC下的iOS编译器中将变量置零,但目前这是一个例外)@Felipe我在最后一段中链接到的答案详细介绍了您在评论中提出的确切主题