2014-12-26 2 views
0

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에만 호출됩니다! (그것이 "캡쳐 된"수있는 경우)

이 아닌 경우 사용자가이 아닌 앱을 닫는 옵션을 제공해야합니다. 너무 자주 버튼을 누르거나 필요한 작업이있을 수 있습니다. 그들이 끝내기 전에 끝내야합니까?

+2

AFAIK, 모바일 앱은 사용자가 종료하지 않아도됩니다. 적어도 iOS가 작동하는 방식입니다. OS에는 사용자가 직접 앱을 탐색하고 종료 할 수있는 기능이 있습니다. –

+0

var 매개 변수를 캡처 할 수 없게하려면 클래스 필드가 필요하지 않습니다. 로컬을 캡처 할 수 있습니다. –

+0

충분합니다. 그래도 질문에 대답하지 않습니다. – nolaspeaker

답변

5

필드 FCanCloseFalse으로 초기화됩니다. CloseQueryCanClose의 첫 번째 통화 후 False으로 설정되고 MessageDialog가 표시됩니다. mrYesFCanClose으로 대화 상자를 확인한 후 True으로 설정되고 양식의 Close 메서드가 다시 호출됩니다. 이제 FCanCloseTrue이고 대화 상자는 표시되지 않으며 CanCloseTrue으로 설정되고 양식이 닫힙니다.

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; 
+0

굉장한 해결책! +1 (투표권을 행사할 수있는 대리인이 충분하지 않음) – nolaspeaker

관련 문제