1

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

如果有帮助,我仍在使用 Delphi 6。是否有一些已知的原因导致这种情况发生,或者我能做些什么来防止它?

4

3 回答 3

4

您确定表单关闭时没有隐藏吗?

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

编辑(感谢Cosmin Prund的评论!):

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

临时 hack 可能是分配caFreeCloseAction,但更好的解决方案是观察事件处理程序中的堆栈,看看你是如何到达那里的,以及是OnClose什么导致了。CloseActioncaHide

注意:在这些情况下,您经常想看看 VCL 做了什么。因此,debug DCUs为您的项目启用 是明智的;请参阅此博客文章如何做到这一点(debug DCUs在链接中搜索)。

——杰伦

于 2010-07-07T05:18:47.750 回答
0

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

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

如果您不是这种情况,请提供您创建表单实例的代码,以便我们检查表单还有什么问题。

于 2010-07-06T21:15:21.787 回答
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;
于 2012-04-26T08:56:20.843 回答