我一直遇到这个奇怪的问题。它几乎似乎是随机的,但我运行我的应用程序并打开一个表单,对其进行一些处理并关闭它。下次我打开该表单的另一个实例时,我会收到有关该表单已存在的错误消息。这很奇怪,我无法不断重现错误。
如果有帮助,我仍在使用 Delphi 6。是否有一些已知的原因导致这种情况发生,或者我能做些什么来防止它?
您确定表单关闭时没有隐藏吗?
这是 MDI 表单的默认设置,但我看到其他人也这样做(以加快重新显示表单的速度)。
编辑(感谢Cosmin Prund的评论!):
挂钩OnClose
表单的事件,并查看CloseAction
参数的值是什么。如果是caHide
,则表单被隐藏。
临时 hack 可能是分配caFree
给CloseAction
,但更好的解决方案是观察事件处理程序中的堆栈,看看你是如何到达那里的,以及是OnClose
什么导致了。CloseAction
caHide
注意:在这些情况下,您经常想看看 VCL 做了什么。因此,debug DCUs
为您的项目启用 是明智的;请参阅此博客文章如何做到这一点(debug DCUs
在链接中搜索)。
——杰伦
您尚未提供代码,但您似乎为两个表单实例提供了相同的组件名称,并且两个表单的所有者是相同的(可能是 Application 对象)。
您不能拥有由另一个组件拥有的同名组件。您应该为每个表单实例指定不同的名称,或者只是不为 Name 属性指定任何值,并让 RTL 为您新创建的实例选择一个唯一的组件名称。
如果您不是这种情况,请提供您创建表单实例的代码,以便我们检查表单还有什么问题。
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;