我一直在遇到这个奇怪的问题。它几乎似乎是随机的,但我运行我的应用程序并打开一个表单,用它做一些工作并关闭它。下次我打开另一个表单时,我会收到有关已存在表单的错误消息。这很奇怪,我无法不断重现错误。
如果它有助于我仍然使用Delphi 6。是否有一些已知原因导致这种情况发生或我可以做些什么来阻止它?
答案 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;