gpt4 book ai didi

delphi - 从主窗体显示和/或关闭辅助窗体时如何防止失去焦点?

转载 作者:行者123 更新时间:2023-12-03 15:53:28 24 4
gpt4 key购买 nike

从主窗体中显示 2 个辅助窗体,然后关闭这两个窗体将导致主窗体失去焦点。 (另一个应用程序被激活而不是我的)

辅助表单可以直接由主表单创建,也可以通过从第二表单创建第三表单来创建。

辅助表单在 OnClose 事件中设置 caFree:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin  Action := caFree;end;

使用 Delphi 2009(更新 3 和 4)与 XP SP3。

以下是我重现问题的步骤:

  1. 创建新的 VCL 表单应用程序
  2. 按上述方式分配 OnClose 事件
  3. 将按钮拖到创建的表单上
  4. 在点击处理程序中创建一个新的 TForm1 并如下所示

运行程序。单击该按钮可显示第二个表单。单击第二个表单上的按钮创建第三个表单。关闭两个新表单时,主表单将失去焦点。

这是我在按钮单击事件处理程序中的代码:

with TForm1.Create(Application) do    show;

有什么方法可以阻止我的主窗体失去焦点吗?

(有趣的是,当直接从主窗体创建两个辅助窗体时,只有在关闭第一个创建的窗体然后关闭第二个创建的窗体时才会出现此问题)

<小时/>

过去我有the same issue这是通过更新我的delphi安装解决的,但在这种情况下我没有在OnClose事件中使用caFree,这是造成这种情况的原因错误。

A recommendation将辅助窗体上的 Parent 属性设置为主窗体,使新窗体绑定(bind)到我不想拥有的主窗体。 (并且那里提出的始终重新激活主表单的解决方案会导致表单的激活顺序丢失)

最佳答案

我会在其中一个表单关闭之前通过 api 调用手动激活“拥有”窗口:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
SetForegroundWindow(GetWindowLong(Handle, GWL_HWNDPARENT));
end;

这不会是操作系统的问题(即没有闪烁的任务栏按钮),因为我们的应用程序已经在前台。

如果设置了MainFormOnTaskBar,则拥有的窗口将是我们的主窗体,否则它将是隐藏的应用程序窗口。无论哪种情况,应用程序都将保留在前台。

关闭最后一个窗体(主窗体)时,SetForegroundWindow 调用是多余的,如果 MainFormOnTaskBar 为 true,它甚至会失败,因为那时主窗体将不被拥有,但我不会太在意(当然,当然可以在调用之前包含一个测试)..

关于delphi - 从主窗体显示和/或关闭辅助窗体时如何防止失去焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3882525/

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