gpt4 book ai didi

multithreading - 为什么在通过 OnClose 事件(在线程中)释放表单后不显示 MessageDlg

转载 作者:行者123 更新时间:2023-12-03 15:19:57 25 4
gpt4 key购买 nike

考虑到这种情况:

procedure TForm2.Button1Click(Sender: TObject);
var
Form: TForm;
begin
Form := TForm.Create(nil);
Form.OnClose := FormClosed;
Form.Show;
Sleep(200);
TThread.CreateAnonymousThread(
procedure
begin
TThread.Synchronize( nil,
procedure
begin
Form.Close;
MessageDlg('Testing', mtInformation, [mbok], 0);
end);
end).Start;
end;

procedure TForm2.FormClosed(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;

未显示我的 MessageDlg 调用(此调用的结果始终为 mrCancel (2))。

经过深入研究,它与 OnClose 事件并将 Action 设置为 caFree 有关。

Form.Close 更改为 Form.Free 并删除 OnClose 事件完全显示 MessageDlg 正常。将 MessageDlg 放置在对 Form.Close 的调用之前可以正常工作。最初我认为 Form 变量的范围可能导致了问题,但将 Form 声明为 TForm2 实例中的私有(private)字段并不能解决问题。

我的目标是显示一个启动窗体,执行我的线程,然后通过所述线程的回调,关闭启动窗体并在适合用户的地方显示对话框。

为了清楚起见,为什么会发生这种情况?

最佳答案

发生的情况是对话框所属的窗口是正在关闭的窗体。当对话框开始其模态消息循环时,窗体被释放并随之关闭其拥有的窗口。包括对话框。

通过将首先显示对话框的调用替换为

来测试一下,让您更加确信我上面所说的是正确的
MessageBox(0, ...);

然后与

MessageBox(Form.Handle, ...);

也就是说,明确对话框的所有者。

第一个版本没有所有者,将显示该对话框。第二个不会,因为它复制了代码中的场景。

关于multithreading - 为什么在通过 OnClose 事件(在线程中)释放表单后不显示 MessageDlg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270559/

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