【发布时间】:2015-03-31 23:24:19
【问题描述】:
鉴于这种情况:
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 ok。在调用 Form.Close 之前放置 MessageDlg 可以正常工作。最初我认为我的 Form 变量的范围可能导致了问题,但将 Form 声明为 TForm2 实例中的私有字段并不能解决问题。
我的目标是显示一个启动表单,执行我的线程,然后通过所述线程的回调,关闭启动表单并在适合用户的地方显示对话框。
为了清楚起见,为什么会发生这种情况?
【问题讨论】:
-
如果你看,我正在调用 TThread.Synchronize...除非我不能这样称呼它,否则接受道歉
标签: multithreading delphi dialog delphi-xe6