表单关闭并打开另一个实例后,“表单已存在”。德尔福

时间:2010-07-06 21:05:51

标签: delphi forms exists delphi-6

我一直在遇到这个奇怪的问题。它几乎似乎是随机的,但我运行我的应用程序并打开一个表单,用它做一些工作并关闭它。下次我打开另一个表单时,我会收到有关已存在表单的错误消息。这很奇怪,我无法不断重现错误。

如果它有助于我仍然使用Delphi 6。是否有一些已知原因导致这种情况发生或我可以做些什么来阻止它?

3 个答案:

答案 0 :(得分:4)

你确定表格在关闭时没有隐藏吗?

这是MDI表单的默认设置,但我看到其他人也这样做(为了加快重新显示表单)。

修改(感谢Cosmin Prund发表评论!):

挂钩表单的OnClose事件,查看CloseAction参数的值是什么。如果是caHide,则隐藏表单。

临时黑客攻击可能是将caFree分配给CloseAction,但更好的解决方案是在OnClose事件处理程序中查看堆栈,看看你是如何在那里结束的,是什么导致CloseAction首先成为caHide

注意:在这些情况下,您经常需要查看VCL的功能。因此,为您的项目启用debug DCUs是明智的;请参阅此blog article如何操作(在链接中搜索debug DCUs)。

- 的Jeroen

答案 1 :(得分:0)

您还没有提供代码,但似乎您给两个表单实例提供了相同的组件名称,并且两个表单的所有者是相同的(可能是Application对象)。

您不能拥有其他组件拥有的同名组件。您应该为每个表单实例指定不同的名称,或者只是不为Name属性赋予任何值,并让RTL为新创建的实例选择唯一的组件名称。

如果您不是这种情况,请提供您创建表单实例的代码,以便我们检查表单可能出现的其他问题。

答案 2 :(得分:0)

 function ShowOnce( AFormClass:TFormClass;AShowing:Boolean=True):TForm;
 var 
   i : integer;
 begin
   Result := nil;

   for i := 0 to Screen.FormCount -1 do
     if Screen.Forms[i] is AFormClass then Result := Screen.Forms[i] as TForm;


   if not assigned(Result) then
     Result := AFormClass.Create(Application.MainForm); // Application or a parameter
   if Showing then
      Result.Show;
 end;

样本1:

ShowOnce(TForm3); 

样本2:

Form3:=ShowOnce(TForm3,False) as TForm3;
Form3.SomeProperty:=32;
Form3.Show;