Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Delphi VCL app, how to disable the default behavior of a KeyDown event?

While I was reading code, I found that in the KeyDown event you can set Key := 0; to stop processing the event any further. For example: TIncrementalForm.FormKeyDown is coded as:

procedure TIncrementalForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_RETURN then begin
    Key := 0; // Stop processing by input window
    if Shift = [ssShift] then
      btnPrevClick(nil)
    else
      btnNextClick(nil);
  end;
end;

Another example is from unit FindFrm:

procedure TFindForm.cboFindTextKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_TAB then begin
    cboFindText.SelText := #9;
    Key := 0; // prevent propagation
  end;
end;

I tested it myself, but it doesn’t work:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private const
    VK_X = Ord('X');
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_X then
  begin
    Key := 0;
    Memo2.Lines.Add('yes');
  end;
end;

end.

My intention is: whenever the user holds down the key x in the TMemo control I do some business logic (i.e. add "yes" to the memo) and stop further processing. But the result is that the key x is still inserted to the TMemo text. I want to know how to disable the default key holding down event behavior (inserting the corresponding key).

>Solution :

The key here (no pun intended) is to use OnKeyPress instead of OnKeyDown:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = 'x' then
  begin
    Key := #0;
    Memo1.Lines.Add('yes');
  end;
end;
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading