OnShortCut event of Delphi XE2 Forms


This article is about OnShortCut event of Delphi Forms. Lets discuss the requirement first.

Requirement: Assme that I have two Delphi forms in my project (MyForm1 and MyFrom2). Now my requirement is that, if I am on MyForm1 and press ESC, I should go to MyForm2 and vice versa.

Consider the code of MyForm1:

unit uf_MyUnit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,   Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.Imaging.jpeg, Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TfMyUnit1 = class(TForm)
    procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);  
  private
  
  public

  end;

var
  fMyForm1: TfMyUnit1;

implementation

uses uf_MyUnit2;

{$R *.dfm}

procedure TfMyUnit1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
   case Msg.CharCode of
      27 : begin
             Handled := true;
             fMyForm2.Show;
             fMyForm1.Close;
           end;
   end;
end;

end.

Explanation: Remember to add FormShortCut function on the OnShortCut event of the form. By adding this function on the OnShortCut event of the form, this function will immediately gets fired when any key is pressed. '27' is the keycode for ESC key. So when ESC key is pressed fMyForm2 is displayed and current form is closed.

Similar is the code for MyForm2:

unit uf_MyUnit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.Imaging.jpeg, Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TfMyUnit2 = class(TForm)
    procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);  
  private
  
  public

  end;

var
  fMyForm2: TfMyUnit2;

implementation

uses uf_MyUnit1;

{$R *.dfm}

procedure TfMyUnit2.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
   case Msg.CharCode of
      27 : begin
             Handled := true;
             fMyForm1.Show;
             fMyForm2.Close;
           end;
   end;
end;

end.