gpt4 book ai didi

delphi - 从另一个窗体的 onActivate 调用时,模式窗体中的控件不会获得焦点。为什么?

转载 作者:行者123 更新时间:2023-12-02 08:30:37 26 4
gpt4 key购买 nike

在某些情况下,我的应用程序会尝试在显示另一个表单(Form1)后自动打开某个表单(Form2)。我使用 onFormActivate 调用 ShowModal,但在显示第二个表单后,它的控件失去焦点。

重现:

  1. 创建一个新的 VCL 应用程序;
  2. 创建第二个表单并在其中放置一个 TEdit
  3. 在主表单上添加一个 onFormActivate 监听器;

'

procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.ShowModal;
end;

运行后您将看到显示 Form2。但编辑并没有引起焦点。如果我在项目文件中注释 MainFormOnTaskbar ,它就会起作用。

// Application.MainFormOnTaskbar := True;

但这不是我应该改变的。我想了解:为什么 TEdit 失去焦点?

最佳答案

OnActivate 在焦点移动时触发。中断这个过程是一个非常糟糕的主意。

如果您希望 OnActivate 事件触发 ShowModal() 调用,则应使用 PostMessage() (或简短的TTimer),以便消息循环可以完成处理已经在进行的焦点转移,然后可以在安全时执行 ShowModal()。例如:

const
WM_SHOWMODAL_FORM2 = WM_APP + 1;

procedure TForm1.FormActivate(Sender: TObject);
begin
PostMessage(Handle, WM_SHOWMODAL_FORM2, 0, 0);
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_SHOWMODAL_FORM2 then
Form2.ShowModal
else
inherited;
end;

关于delphi - 从另一个窗体的 onActivate 调用时,模式窗体中的控件不会获得焦点。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43482728/

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