gpt4 book ai didi

delphi - 如何针对程序的某些(但不是全部)其他窗口创建对话框模式?

转载 作者:行者123 更新时间:2023-12-02 18:18:59 24 4
gpt4 key购买 nike

Possible Duplicate:
How can I make a form that is not disabled when another form is shown modally?

假设我有一个具有三种表单的应用程序:引导用户完成工作流程、向导样式的主表单;在向导的某些步骤中偶尔显示的模式窗口;第三个“信息”窗口,可以随时显示,与用户在工作流程中的位置无关。

如何使模式窗口将焦点从主窗体上夺走,但保持信息窗口始终可用且响应灵敏?

使用最明显的InfoFrame.Create(nil).Show当模态表单显示时,来自主框架的信息窗口将无法使用。

奇怪的是,如果我从模式窗口创建并显示信息窗口,它将以所需的方式响应,并且在模式窗口关闭后它仍然存在。但是,当再次显示模式窗口时,信息窗口将被迫进入后台并变得无响应。

如何使信息窗口始终可用,即使在另一个表单的 ShowModal 时也是如此。过程已被调用?

在我正在开发的实际应用程序中,实际上有来自大约十几个“工作流”主窗口的数十种模态表单(其中许多也是模态的),但只有一个信息窗口(其中多个)实例可能会被显示),我不想将对 ShowModal 的每个调用更改为其他内容,尽管如果这是唯一的选择,我并不反对包装或子类化调用。

最佳答案

不要使用ShowModal,而是使用EnableWindow(MainForm.Handle, False)禁用MainForm,然后使用EnableWindow(MainForm.Handle, False)再次启用它EnableWindow(MainForm.Handle, True)。您可能需要添加一些内容以确保正确的窗口始终位于顶部。

编辑:如果您不想更改 MainForm 中的任何内容,也不想更改模态表单中的任何内容,则可以将计时器添加到具有该表单的 InfoFrame 中不断地 self 启用:

procedure TInfoFrame.EnablerTimer(Sender: TObject);
begin
if not IsWindowEnabled(Self.Handle) then
EnableWindow(Self.Handle, True);
end;

这样,即使在调用另一种形式的 ShowModal 之后,InfoFrame 也将可用。

Edit2:正如 @DavidHeffernan 所指出的,放置此逻辑的更好位置是在 InfoFrameWM_ENABLE 处理程序中,而不是在计时器中。不过,这个想法仍然是一样的。

关于delphi - 如何针对程序的某些(但不是全部)其他窗口创建对话框模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140321/

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