gpt4 book ai didi

Delphi,可以使表单仅对特定的父表单进行模式化吗?

转载 作者:行者123 更新时间:2023-12-03 14:40:29 24 4
gpt4 key购买 nike

我有一个应用程序,其中有一个主后台表单,从那里用户只能使用维护系统不同部分的非模式表单。非模态表单重写 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;

实际上,用户可以打开一个维护“Apples”的非模态表单,另一个维护“Oranges”的非模态表单,并使用开始菜单栏在两者之间轻松切换。

但是,如果他们从“Apples”表单打开模态表单,例如设置选项、首选项等,那么他们在关闭模式表单之前无法使用“Oranges”表单。

是否可以使模态表单仅对父表单进行模态?那么如果他们打开苹果的选项表单,他们就不能使用苹果的维护表单,但仍然可以使用橙子的维护表单?

最佳答案

如果您查看 TCustomForm.ShowModal() 的源代码,您将看到 VCL 不使用 Windows API 调用来显示模式对话框,而是在显示模式对话框时禁用应用程序中的所有其他窗体。显示模态形式。您当然可以尝试相同的方法,只需 Show() 表单模式对话框,然后禁用父级,然后在关闭表单模式对话框后重新启用它。需要有一个中心位置来跟踪表单模式对话框、需要重新启用的表单等。然而,您应该彻底测试代码是否确实按照您希望的方式执行,即使在应用程序之间来回切换、最小化应用程序等时也是如此。

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

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

关于Delphi,可以使表单仅对特定的父表单进行模式化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/463778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com