如何在Delphi窗体的OnClose事件中使用MessageDlg?

3

当用户通过点击“关闭按钮”或按下Alt + F4来关闭我的表单时,我希望询问用户是否要关闭应用程序。如果是,则终止应用程序,否则不做任何操作。我在表单的onclose事件中使用以下代码:

procedure MyForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  buttonSelected : integer;
begin
  buttonSelected := MessageDlg('Do you really want to close the application?',mtCustom, [mbYes,mbNo], 0);
  if buttonSelected = mrYES then
  begin
    Application.Terminate;
  end
  else
  begin
    //What should I write here to resume the application
  end;

end;

无论我点击是或否,我的应用程序都会终止。我该怎么做才能在确认框上点击“否”时,我的应用程序不会终止?我应该如何改进上述函数?我是否使用正确的事件来实现此功能?请帮忙...

2
你需要使用 Action 参数,但更好的方法是在 OnCloseQuery 事件中完成任务。 - TLama
1
如果这是你的主窗体,那么你不需要调用 Application.Terminate。一旦主窗体关闭,应用程序就会关闭。 - David Heffernan
我讨厌应用程序问我是否真的确定想要它消失。 - Sertac Akyuz
@sertacAkyuz - 但这是要求。 - user1556433
@DavidHeffernan - 好的,已经移除了 application.terminate。 - user1556433
请回答我的这个问题:http://stackoverflow.com/questions/13559156/unexpected-behaviour-of-ttable-and-tdbgrid-in-delphi-xe2 - user1556433
2个回答

9
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  buttonSelected: integer;
begin
  buttonSelected := MessageDlg('Do you really want to close the application?', mtCustom, [mbYes, mbNo], 0);
  if buttonSelected = mrYES then
  begin
    CanClose:=true;
  end
  else
  begin
    CanClose:=false;
  end;
end;

或者像@TLama建议的那样,简化如下:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := MessageDlg('Do you really want to close the application?', mtCustom, [mbYes, mbNo], 0) = mrYES;
end;

4
可以将此代码简化为一行:CanClose := MessageDlg('确定要关闭应用程序吗?', mtCustom, [mbYes, mbNo], 0) = mrYES; - TLama

9

如果在else部分中输入

Action := caNone;

则窗口将保持打开状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接