8
votes

I have a default button on a form that has a TSpinEdit control on it. When the TSpinEdit control has the focus and the user presses the Enter key, instead of the default button getting clicked, the user just hears a system beep because the Enter key is invalid for a TSpinEdit.

Normally, to avoid the beep, I would use the OnKeyPress event and set the Key := 0 to skip the key press. I could then execute the click method on the default button. However, in this case, OnKeyPress doesn't fire because the Enter key is not valid.

OnKeyDown fires, but when I set Key := 0 there, it doesn't stop the system beep.

So, how do I disable the system beep when pressing the Enter key on a TSpinEdit control?

I'm on Delphi 5, and they didn't include the source for Spin.pas.

3
Did you look in "<Program Files>\Borland\Delphi5\Source\Samples\" ? - Uwe Raabe
@Uwe, thanks! That's exactly where spin.pas is. I guess I had a file search fail. - Marcus Adams

3 Answers

7
votes

You have to descend from TSpinEdit and override IsValidChar to avoid the MessageBeep call or KeyPress to avoid IsValidChar.

7
votes

Try this one

//Disable system beep
SystemParametersInfo(SPI_SETBEEP, 0, nil, SPIF_SENDWININICHANGE); 

//Enable system beep
SystemParametersInfo(SPI_SETBEEP, 1, nil, SPIF_SENDWININICHANGE); 
3
votes

Set KeyPreview = True on your form and add the following code to the form's keypress event:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if SpinEdit1.Focused and (Key = #13) then
  begin
    Key := #0; // Cancels the keypress
    Perform(CM_DIALOGKEY, VK_RETURN, 0); // Invokes the default button
  end;
end;