delphiuser-interfaceevent-handlingescapingonkeypress

How to avoid the ding sound when Escape is pressed while a TEdit is focused?


In code I have developed some years ago I have been using this a lot to close the current form on pressing the Escape key at any moment:

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if key = #27 then close;
end;

This behaviour is defined for the TForm. The form's KeyPreview property is be set to True to let the form react to key presses before any other components. It all works perfectly well for the best part of the program, however, when the Escape key is pressed while a TEdit component is focused a sound (a ding sound used by Windows to signify invalid operation) is issued. It still works fine but I have never quite managed to get rid of the sound.

What's the problem with this?


Steps to recreate:


Solution

  • You get the ding because you left the ESC in the input. See how Key is a var? Set it to #0 and you eliminate the ding. That removes it from further processing.

    procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char);
    begin
        if key = #27 then 
        begin
          key := #0;
          close;
        end;
    end;
    

    KeyPreview is just that, a preview of what will be passed to the controls unless you stop it.