Перейти к содержанию
Fire Monkey от А до Я
  • 0

TPopup и реакция вместе с нажатием vkHardwareBack [ANDROID]


notricky

Вопрос

Не нашел тега TPopup. Напишу тут.

Ситуация в следующем. Я использую TPopup + TCalloutPanel для хинтов (подсказок). С анимацией FadeIn FadeOut.

Все вроде просто.

На основной форме есть стандартная проверка FormKeyDown

  if Key in [vkHardwareBack] then
  begin
    TPlatformServices.Current.SupportsPlatformService(IFMXVirtualKeyboardService, IInterface(FService));
    if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) then
    begin
      DebugLog('KeyboardOnBackButton');
    end
    else
    begin
      Key := 0;
      if ItemLayout.Visible then
      begin
        DebugLog('ItemLayoutBackButton');
        btCancelClick(btCancel);
      end
      else
      begin
        DebugLog('MainLayoutBackButton');
        MessageDlg('Are you sure to exit now?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbCancel], -1,
          procedure (const AResult: TModalResult)
          begin
            if AResult = mrOk then
            begin
              DebugLog('CloseOnBackButton');
              Close;
            end;
          end);
      end;
    end;
  end

В общем ничего сверхестественного.

Затем, когда появляется хинт:

procedure TFParent.ShowHint(AControl: TControl; AText: string; ATitle: string=''; Duration: single = 3; ImageIndex: integer = -1);
begin
  DebugLog('ShowHint');
  lbHint.Text := AText;
  puHint.PlacementTarget := AControl;
  faHintFadeOut.Delay := Duration;
  puHint.IsOpen := true;
  ivHint.Visible := ImageIndex <> -1;
  lbHintTitle.Text := ATitle;
  lbHintTitle.Visible := ATitle <> '';
end;

все тоже хорошо. Однако, когда я нажимаю кнопку назад - сначала пропадает хинт. А если я нажимаю снова кнопку назад, то вообще говоря я жду два варианта:

  1. ItemLayout переходит в MainLayout
  2. Программа запрашивает выход MessageDlg

Но на деле приложение просто закрывается. При чем без ошибок.

Что с этим можно сделать?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
18 часов назад, wamaco сказал:

перехватить кнопку "Назад"

Буду рад, если подскажете как.

 

13 часов назад, ZuBy сказал:

в качестве бреда, используйте событие OnKeyUp

Расскажите по-подробнее - каким образом это использовать? Пока не представляю. К тому же мне кажется, там уже не будет того же сообщения на down. Ошибаюсь?

Ссылка на комментарий
  • 0

Ну в общем...
не долго думая
 

  TPopupHelper = class helper for TPopup
    procedure SetOnKeyDown(KeyDown: TKeyEvent);
  end;

...

{ TPopupHelper }

procedure TPopupHelper.SetOnKeyDown(KeyDown: TKeyEvent);
begin
  TCustomPopupForm(self.PopupForm).OnKeyDown := KeyDown;
end;

И вызываю SetOnKeyDown при показе Popup-a.
 

В итоге при показываемом Popup-e нажатии кнопки "Назад" просто выполняется условие один (из первоначального поста): ItemLayout переходит в MainLayout, при этом Попап не закрывается.

Если в первоначальный код для MyForm.OnKeyDown(), где проверка на vkHardwareBack, добавить проверку

...
      Key := 0;
      if Sender.InheritsFrom(TCustomPopupForm) then
      begin
        HideHint;
        DebugLog('PopupFormBackButton');
      end
      else 
...

то можно и предотвратить закрытие приложения и закрыть попап.

Приложение более не закрывается, попап закрывается, проблем solved.

Хочу только сказать, что это некрасиво. Если есть фиксы или более интересные решения - готов послушать.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...