我的应用程序是基于模态形式。主窗体使用ShowModal打开一个窗体,此窗体使用ShowModal打开另一个窗体,因此我们已经堆叠了模态窗体。有时候会出现一个问题,当我们以新的形式调用ShowModal时,它隐藏在以前的表单之上,而不是在顶部显示。按Alt选项卡后,表单返回顶部,但这不是很好的解决方案。你遇到这个问题,你是怎么处理的?
编辑:
我使用Delphi 7。
解决方法
你没有提到哪个版本的Delphi …
较新的Delphi版本已经向TCustomForm添加了两个新属性:PopupMode和PopupParent。将您的模态对话框的PopupParent设置为创建该对话框的表单,确保子表单保持在其父对象的顶部。它通常会解决你所描述的问题。
我认为这对属性是在Delphi 2006中添加的,但它可能已经是2005年。他们绝对是在Delphi 2007和更高版本。
编辑:看到你使用Delphi 7之后,唯一的建议是,在显示你的模态窗体的代码中,你禁用创建它的表单,并在返回时重新启用。这应该阻止创建窗口接收输入,这可能有助于保持Z顺序正确。
像这样的东西可能会工作(未经测试,因为我不再使用D7):
procedure TForm1.ShowForm2; begin Self.Enabled := False; try with TForm2.Create(nil) do begin try if ShowModal = mrOk then // Returned OK. Do something; finally Free; end; end; finally Self.Enabled := True; end; end;
如果Form2创建了一个模态窗口(如前所述),只需重复该过程即可禁用Form2,创建Form3并以模态显示,并在返回时重新启用Form2。确保使用try..finally,如我所示,所以如果在模态窗体出现问题,创建表单总是被重新启用。