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