2009-06-12 8 views
2

J'ai un TComboBox sur un formulaire. Sa propriété Style est définie sur csDropDownList. Si j'ouvre la liste déroulante et sélectionnez une option avec ma souris ou mon clavier et appuyez sur ENTRÉE, la liste déroulante se ferme et la propriété ItemIndex est modifiée avant que le gestionnaire d'événements KeyPress ne soit déclenché. Si je clique sur TAB, la liste déroulante ne disparaît pas tant que le gestionnaire d'événements KeyPress n'a pas été déclenché et que le focus ne s'est plus déplacé et que ItemIndex n'est pas mis à jour. il revient à tout ce qui avait été sélectionné avant que j'ouvre la liste.Comment faire pour que la touche TAB ferme une TComboBox sans perdre la position actuelle?

Si je veux que TAB mette à jour ItemIndex avec tout ce qui est actuellement sélectionné dans la liste déroulante, comment l'implémenterais-je?

+0

Je trouve amusant que vous poser des questions avec Steven et François comme en général les réponses les plus courantes, surtout depuis que Steven est assis derrière vous . –

+1

Si vous utilisez le clavier pour sélectionner une valeur dans une zone de liste déroulante, vous devez utiliser uniquement le clavier et ne pas ouvrir la liste déroulante. En appuyant sur les flèches haut et bas, vous pouvez modifier directement l'élément sélectionné (et la valeur de la propriété ItemIndex), et l'onglet fonctionnera normalement. D'accord, vous n'avez pas le contrôle sur la liste des éléments dans la liste déroulante, mais s'il y a beaucoup d'éléments, un architecte d'interface devrait se demander si une combobox est le bon contrôle pour le travail. –

+1

D'accord avec Stijn, et avec skamradt, et conformément à ces commentaires, je suggère que vous vous montrez réticent à modifier le comportement par défaut d'un élément d'interface commun (à moins que ce comportement par défaut ne soit manifestement non standard). – Argalatyr

Répondre

3

Définissez la propriété KeyPreview du formulaire sur True.

En cas ComboBox OnKeyDown:

procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if (Key = VK_TAB) then 
    begin 
    Key := VK_RETURN; 
    Perform(WM_NEXTDLGCTL,0,0); 
    end; 
end; 

émule la touche de retour, puis se déplace le focus sur le contrôle suivant.

+0

Juste pour être complet, si vous souhaitez également utiliser Shift & Tab pour revenir en arrière: si ssShift en décalage puis Exécuter (WM_NEXTDLGCTL, 1,0) else Effectuer (WM_NEXTDLGCTL, 0,0); –

0

Je crois que c'est le comportement par défaut, et pour le changer, vous devrez peut-être sous-classer le contrôle (ou même un assistant de classe), intercepter le message Windows pour la frappe, puis si un tab envoie un retour au contrôle et manipulez l'onglet vous-même.

0

Vous devriez essayer de piéger TAB plus tôt dans l'événement KeyUp ou peut-être même plus tôt dans le KeyDown.

0

Lorsque vous récupérez votre index utiliser à la place du classique ComboBox-> ItemIndex

ComboBox->Items->IndexOf(ComboBox->Text) 
Questions connexes