2009-01-21 68 views
10

我有一个应用程序,其中有一个主要的背景形式,从那里用户只能维护不同部分系统的非模态形式。非模态形式覆盖的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; 

在效果上,用户可以打开维持“苹果”,另一个非模态的非模态形式保持'橙子'的形式,并使用开始菜单栏轻松地在两者之间切换。然而,如果他们从'苹果'形式打开模态形式,例如,设置选项,偏好等,然后他们不能使用'桔子'形式,直到他们关闭模式形式。

是否有可能只对父窗体进行模态窗体模态?所以如果他们打开苹果的选项表单,他们不能使用苹果维护表单,但仍然可以使用橘子维护表单?

感谢

回答

0

无法实现你通过防止“苹果”的形式从接受焦点,而其子窗口打开时同样的效果?

-2

如果您在其自己的线程中创建每个非模态窗体,这是可能的。然后每个模态形式将会阻塞它所属的线程。

编辑:这应该是可能的,即使vcl不是线程安全的。请看看Alexeys explanation如何可以做到这一点:

所以,如果你有一组应该生活在一个单独的线程,然后将它们放到一个DLL的形式,编译它没有包和使用!它会工作,它将是线程安全的。

+0

使用VCL时无法做到这一点,它只能在执行GUI操作时从一个线程使用。 – mghie 2009-01-21 08:08:13

+0

是的,但是每个DLL都有自己的整个VCL和它自己的Application对象的副本。海事组织这并不比首先使用不同的可执行文件更好。 – mghie 2009-01-21 09:27:52

+0

我现在不是为什么Robo想要描述它的方式。他问是否可能,我说是。你说不是,我说你错了...... – Vegar 2009-01-21 09:42:00

6

如果你看看TCustomForm.ShowModal(源代码),你会看到,VCL不使用Windows API调用显示模式对话框,但它确实不是禁用所有其他形式的应用程序,而模态形式显示。你当然可以尝试一样的,只需Show()表单模式对话框,然后禁用父对象,然后在关闭表单模式对话框后重新启用它。需要有一个中心位置,您可以跟踪表单模式对话框,需要重新启用的表单等等。但是,您应该彻底测试代码是否确实实现了您希望它执行的操作,即使应用程序之间来回切换,最小化应用程序等等。

话虽如此 - 我不认为这是一个好主意。它打破了Windows用户对应用程序行为的所有假设。与Mac OS X不同,Windows在应用程序模式对话框和表单模式对话框之间没有区别,您应该坚持与您正在编程的平台一致的行为。

很可能有更好的方法来构建您的用户界面。在“Windows用户体验交互指南”中查看dialog boxes的相关页面。尽可能避免模态对话框,链接的指导方针为许多用例显示了更好的替代方案。如果限制使用模态对话框,也许你不再需要表单模式对话框。

0

就像旁人一样(虽然这将是一项可怕的工作),另一个解决这个问题的方法是谷歌的Chrome浏览器,每个“标签”是一个单独的过程,但作为一个单一的集成应用。

即使这种方法会达到你想要的东西,我会与以上,这将打破约模态行为,用户的设想和期望的意见达成一致。