使用Delphi XE出现多个模态对话框的问题

6
这是我的问题。
我有一个主应用程序正在运行,并打开了一个模态对话框,此时主应用程序屏幕被禁用,所有焦点都在新的对话框上。
从这个对话框中,我打开另一个模态对话框。所以现在主屏幕和对话框1都被禁用了,而此时对话框2拥有所有的焦点。到目前为止都很完美。
现在当我关闭这个顶层的对话框2时,我希望它只是跳回到对话框1。它会将焦点集中在对话框1上,但是主应用程序现在是可用的,你可以在任何地方点击,这会让对话框1消失但依然保持着打开状态。这对于那1%的用户来说可能会造成问题,因为他们有时不会立即关闭对话框1,而是继续点击其他地方。你可以想象QA(质量保证)不会接受这种情况 ;o)
看起来Windows有点混淆了,因为主应用程序似乎知道它仍然拥有打开的对话框1,因为缀带在功能区上的按钮仍然处于按下状态。
有什么想法吗?
到目前为止,我最好的解决方案是显式设置:
dialog1.PopupMode := pmExplicit;
dialog1.PopupParent := MainFrm;
即使你在主应用程序上单击,这似乎可以让对话框1保持在顶部,当你关闭对话框2时。所以这将鼓励用户尽快关闭它,但不是100%正确的。
编辑:我现在已经创建了一个独立的应用程序,它的功能符合预期。随着窗口的关闭,控件和焦点会从对话框2返回到对话框1,然后当对话框1关闭时回到主应用程序。这表明我们的功能区代码中存在其他问题,但我找不到它。哼!

2
通常的嫌疑对象可能是 Application.ProcessMessages 或其他启动并行消息循环的东西。 - Jens Mühlenhoff
如果您对原生的Delphi TRibbon不满意,可以看看Erik van Bilsen的Windows Ribbon Framework - menjaraz
嗨。这可能需要很多工作,但我建议不要使用ShowMessage()或MessageDlg(),而是创建一个新表单并在该表单中显示任何你想要的消息(你甚至可以在方法/函数中实现此操作,使它变得不那么麻烦 :)),这样你就可以使用ModalResult函数来处理特定实例的表单(myForm:= TForm1.Create(); 如果Myform.ShowModal = MrOk then {call second form etc etc ...})。希望这可以帮助到你。 - Ryno Coetzee
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接