隨着XE7中非阻塞MessageDlg的出現,看起來現在不可能有條件地阻止該應用程序。從收盤像我們這樣在Windows(或XE5所做的那樣):阻止Android應用。關閉
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,那是因爲我在匿名程序中遇到了一個關於「無法捕獲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;
但再次,經過FormKeyUp事件處理程序執行完畢後,再次渲染鍵設置無用的MessageDlg只調用! (如果它可以被「俘虜」,那是)
如何給用戶的選項不關閉應用程序,因爲也許他們打後退按鈕一旦過於頻繁,或者是因爲有一些他們所需要的任務在他們被允許退出之前完成?
AFAIK,移動應用程序不應該被用戶關閉。至少這就是iOS的工作原理。操作系統具有讓用戶遠離應用程序並直接終止的功能。 –
您不需要該類的字段來解決無法捕獲var參數的問題。你可以捕捉本地。 –
夠公平的。雖然沒有回答這個問題。 – nolaspeaker