防止Android应用。关闭

时间:2014-12-26 17:29:35

标签: android delphi firemonkey delphi-xe7

随着XE7中非阻塞MessageDlg的出现,现在似乎无法有条件地 阻止 该应用。从我们在Windows中关闭(或在XE5中):

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    CanClose := False;
    FCanClose := False;
    FMX.Dialogs.MessageDlg('Exit?'
        ,
        TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
          procedure(const AResult: TModalResult)
          begin
            if AResult = mrYes then
              FCanClose := True;
          end
    );
    CanClose := FCanClose;

end;

仅在表单已关闭后才调用MessageDlg(和匿名过程),从而使对象失败。哦,如果你想知道我为什么要使用FCanclose,那是因为我得到了一个关于&#34的编译器错误;无法捕获Canclose"在匿名程序中。

现在我尝试的另一种可能性是将MessageDlg放在FormKeyUp事件处理程序中并捕获vkHardwareBack。

procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
var
  FService: IFMXVirtualKeyboardService;
begin
  if Key = vkHardwareBack then
  begin
    TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyBoardService,
        IInterface(FService));
      if (FService <> nil) then
      begin
        if (TVirtualKeyBoardState.Visible in FService.VirtualKeyBoardState) then

        else
        begin
          FMX.Dialogs.MessageDlg('Exit?'
          ,
          TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0,
          procedure(const AResult: TModalResult)
          begin
            if AResult = mrYes then
              Key := 0; // prevent exit, if Key could be "captured"
          end
          );
        end;
      end;
end;

但是再一次,MessageDlg仅在FormKeyUp事件处理程序完成执行后被调用,再次使键设置无效! (如果它可以&#34;捕获&#34;,那就是)

如何为用户提供关闭应用程序的选项,因为他们可能经常点击后退按钮,或者可能是因为他们需要完成某些任务才能允许出口?

1 个答案:

答案 0 :(得分:5)

字段FCanClose已初始化为False。第一次调用CloseQuery CanClose后,将设置为False,并显示MessageDialog。确认后,mrYes FCanClose对话框将设置为True,并再次调用表单的Close方法。现在,虽然FCanCloseTrue,但没有对话框,CanClose设置为True,表单将关闭。

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if not FCanClose then
    FMX.Dialogs.MessageDlg(
      'Exit?',
      TMsgDlgType.mtConfirmation, 
      [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 
      0,
      procedure(const AResult: TModalResult)
      begin
        if AResult = mrYes then
        begin
          FCanClose := True; // set the field value
          Close; // call close again
        end;
      end );

  CanClose := FCanClose;
end;