delphifiremonkeydelphi-xe5firemonkey-fm2

Handling Hard Button vkHardwareBack


In my application I use TTabControl with 3 tabs: Main Tab (TabItem1) with 3 buttons: Button1 will take me to TabItem2, Button2 to TabItem3, and Button 3 to TabItem3.

I handle FormKeyUp Event to Control the Navigation and:

If the key pressed is vkHardwareBack then if the ActiveTab is the TabItem1, I popup a message asking if the user wants to quit the application. If the answer is yes, I close the application and if not nothing happens. this part is working just fine!

But if the ActiveTab is TabItem2 or TabItem3 then I want the application to go back to the Main Tab (TabItem1) by firing TTabChangeItem standard action with properties:

But this is not happening. When the user is pressing the vkHardwareBack while the ActiveTab is TabItem2 or TabItem3 the application goes to background and the home screen is shown.

Any Idea what am I doing wrong?

And here is a the FormKeyUp procedure:

procedure TfMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char;
  Shift: TShiftState);
begin
  if Key = vkHardwareBack then
    if TabControl.ActiveTab = TabItem1 then
      if MessageDlg('Are you sure you want to Exit?', TMsgDlgType.mtWarning,
           [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes then
        MainActivitiy.finish
     else
       ChangeTabAction1.Execute; // I tried here also: TabControl.ActiveTab := TabItem2; but still the same results
end;

Solution

  • Maybe try something like this (untested):

    procedure TfMain.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    begin
      if Key = vkHardwareBack then
      begin
        Key := 0;
        if TabControl.ActiveTab = TabItem1 then
        begin
          if MessageDlg('Are you sure you want to Exit?', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes then
          begin
            MainActivitiy.Finish;
          end;
        end else
        begin
          ChangeTabAction1.Execute;
        end;
      end;
    end;