1

在 CloseQueryEvent 中,我为应用程序关闭确认添加了 MessageDlg 代码,当我在 Windows 中运行应用程序时,如果我传递 CanClose =True,则应用程序运行正常。但是这个 messageDialogue 在 Android 中不起作用,请建议我是否有其他方法来处理 closeQuery 事件。而且我还看到了 如何在 Delphi-XE5 Firemonkey 应用程序中关闭 android 应用程序的示例?

4

3 回答 3

2

模态对话框在移动平台上不起作用。您必须使用将匿名过程作为输入的异步版本,然后在对话框关闭时在该过程中执行所需的操作。例如:

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  MessageDlg('Do you really want to exit?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
    procedure(const AResult: TModalResult)
    begin
      if AResult = mrYes then
        Application.Terminate;
    end
  );
end;
于 2014-11-11T19:57:23.577 回答
1
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;  var KeyChar: Char; Shift: TShiftState);
begin
  if Key = vkHardwareBack then
  begin
    MessageDlg('Do You Want To Close This Application', TMsgDlgType.mtConfirmation,
    [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
    procedure(const AResult: TModalResult)
    begin
      if AResult = mrYes then
      begin
        Application.Terminate;
        Exit;
      end
    end);
    Key := 0;
  end;
end;

这段代码对我来说很好用

于 2014-11-14T18:36:24.880 回答
0

根据雷米的回答。

模态对话框在移动平台上不起作用。您必须使用将匿名过程作为输入的异步版本,然后在对话框关闭时在该过程中执行所需的操作。例如:

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  MessageDlg('Do you really want to exit?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
    procedure(const AResult: TModalResult)
    begin
      if AResult = mrYes then
        Application.Terminate;
    end
  );
end;

在 Android 中,按下后退按钮不会触发该事件。为了解决这个问题,我们必须更改后退按钮的行为才能调用该函数CloseQuery

procedure TFormMain.FormKeyUp(Sender: TObject; var Key: Word;  var KeyChar: Char; Shift: TShiftState);
begin
    if Key = vkHardwareBack then
    begin
        TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
        if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then
        begin
            // Back button pressed, keyboard visible, so do nothing...
        end else
        begin
            Key := 0;
            CloseQuery;
        end;
    end;
end;
于 2015-09-17T11:51:50.843 回答