考虑以下情景:
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变量的范围可能会导致问题,但在TForm2实例中声明Form为私有字段并不能解决问题。
我的目标是显示一个闪屏窗体,执行我的线程,然后通过此线程的回调关闭Splash窗体并在适当时向用户显示对话框。
为了清楚起见,为什么会发生这种情况?