2010-06-29 6 views
6

J'ai un bouton par défaut sur un formulaire qui possède un contrôle TSpinEdit. Lorsque le contrôle TSpinEdit a le focus et que l'utilisateur appuie sur la touche Entrée, au lieu de cliquer sur le bouton par défaut, l'utilisateur entend simplement un bip système car la touche Entrée n'est pas valide pour un TSpinEdit.Désactiver le signal système sur TSpinEdit lorsque vous appuyez sur Entrée

Normalement, pour éviter le bip, j'utiliserais l'événement OnKeyPress et réglerais le Key := 0 pour ignorer la touche. Je pourrais alors exécuter la méthode de clic sur le bouton par défaut. Cependant, dans ce cas, OnKeyPress ne se déclenche pas car la touche Entrée n'est pas valide.

OnKeyDown se déclenche, mais lorsque j'y ai réglé Key := 0, cela n'arrête pas le bip du système. Alors, comment désactiver le bip du système lorsque j'appuie sur la touche Entrée d'un contrôle TSpinEdit?

Je suis sur Delphi 5, et ils n'ont pas inclus la source de Spin.pas.

+5

Avez-vous regardé dans " \ Borland \ Delphi5 \ Source \ Samples \"? –

+0

@Uwe, merci! C'est exactement là où spin.pas est. Je suppose que j'ai eu une recherche de fichier échoue. –

Répondre

6

Vous devez descendre de TSpinEdit et passer outre IsValidChar pour éviter l'appel MessageBeep ou KeyPress pour éviter IsValidChar.

+0

C'est ce que j'ai fait, bien sûr, mais merci à Uwe de m'avoir aidé à trouver la source! –

+0

Ça vous dérange de montrer un exemple? :) –

7

Essayez celui

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

//Enable system beep 
SystemParametersInfo(SPI_SETBEEP, 1, nil, SPIF_SENDWININICHANGE); 
+0

merci pour l'excellente information, mais je veux toujours entendre les bips pour les autres touches non valides, donc si j'attends que l'événement OnKeyDown se déclenche avant de désactiver le bip du système, cela ne semble pas empêcher le bip. –

+0

Cool bidouille. Je ne savais pas. –

+0

Ça marche pour moi, merci: D – Giovani

2

Set KeyPreview = True sur votre formulaire et ajoutez le code suivant à l'événement keypress du formulaire:

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; 
Questions connexes