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 に答える