我有一个应用程序,其中有一个主要的背景形式,从那里用户只能维护系统的不同部分的非模态形式.非模态窗体会覆盖CreateParams方法,因此每个窗体都会在启动任务栏中显示一个按钮:
procedure TfmMaterialsPlanning.CreateParams(var Params: TCreateParams); begin inherited; //create a new window on the task bar when this form is created Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; end;
实际上,用户可以打开一个维护"苹果"的非模态表单,另一个维持"橙子"的非模态表单,并使用开始菜单栏轻松切换两者.
但是,如果他们从"苹果"表单中打开一个模态表单,例如设置选项,首选项等,那么在关闭模态表单之前,他们不能使用"橙子"表单.
是否有可能只为父表单创建一个模态表单模态?因此,如果他们打开Apple的选项表格,他们不能使用苹果维护表格,但仍然可以使用Oranges维护表格?
如果您查看TCustomForm.ShowModal()的源代码,您将看到VCL不使用Windows API调用来显示模式对话框,但它确实禁用了应用程序中的所有其他窗体,而模式窗体是所示.您当然可以尝试相同的方法,只需Show()表单模式对话框,然后禁用父对象,然后在关闭表单模式对话框后重新启用它.需要有一个中心位置,您可以跟踪表单模式对话框,需要重新启用的表单等等.但是,您应该彻底测试代码是否确实是您希望它执行的操作,即使在应用程序之间来回切换,最小化应用程序等等时也是如此.
话虽如此 - 我认为这根本不是一个好主意.它打破了Windows用户对应用程序行为的所有假设.与Mac OS X不同,Windows在应用程序模式和表单模式对话框之间没有区别,您应该坚持与您编程的平台一致的行为.
最有可能是构建UI的更好方法.在"Windows用户体验交互指南"中查看对话框的相关页面.尽可能更好地避免模态对话框,链接指南显示了许多用例的更好替代方案.如果限制使用模态对话框,可能不再需要表单模式对话框.