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가 작동하는 방식입니다. OS에는 사용자가 직접 앱을 탐색하고 종료 할 수있는 기능이 있습니다. –
var 매개 변수를 캡처 할 수 없게하려면 클래스 필드가 필요하지 않습니다. 로컬을 캡처 할 수 있습니다. –
충분합니다. 그래도 질문에 대답하지 않습니다. – nolaspeaker