Fonction pour mettre un combobox en readonly sans mettre explicitement enabled à false

Soyez le premier à donner votre avis sur cette source.

Snippet vu 20 126 fois - Téléchargée 30 fois

Contenu du snippet

Cela n'est pas une méthode d'un contrôle hérité, mais une simple fonction autonome.

L'API FindWindowEx, via le 3iéme argument qui correspond à la WindowClass, permet de recherche le handle de la zone de saisie qui est contenue dans la ComboBox.

Le principe est le suivant si on veut mettre en lecture seule :
- on met Enabled=False sur la ComboBox
- on rend active la zone de saisie contenue dans la ComboBox
- on envoie un message Windows à cette zone de saisie pour la passer en lecture seule (correspond à la propriété ReadOnly sur un TextBox)

Donc la combobox est inactive, mais son contenue n'est pas 'flouté', comme avec la propriété Enabled.

Source / Exemple :


Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Integer, ByVal hwnd2 As Integer, ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Integer

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Long, _
            ByRef lParam As Object) As Integer

    Private Const EM_SETREADONLY = &HCF
    Private Const WM_ENABLE = &HA

    Private Sub SetComboReadOnly(ByRef c As Control, ByVal ro As Boolean)
        Dim hWndEdit As Integer

        If Not (TypeOf c Is ComboBox) Then
            Throw New Exception("SetComboReadOnly : type de contrôle non géré.")
        End If

        c.Enabled = Not ro

        hWndEdit = FindWindowEx(c.Handle.ToInt32, 0&, "Edit", vbNullString)
        If hWndEdit <> 0 Then
            SendMessage(hWndEdit, WM_ENABLE, True, 0&)
            SendMessage(hWndEdit, EM_SETREADONLY, ro, 0&)
        Else
            Throw New Exception("SetComboReadOnly : erreur API Windows 'FindWindowEx'.")
        End If
    End Sub

Conclusion :


Une autre méthode consisterait à créer un contrôle hérité de la ComboBox, et d'intercepter les évènements de click souris, clavier etc...
(voir mes autres sources pour avoir un modèle)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
jeudi 11 mars 2010
Statut
Membre
Dernière intervention
31 octobre 2010

svp
mes amis je cherche coment fair
quant je click sur dbcombobox la valeur de dbedit change par exemple si dbcombobox=ing alorsdbedit=12
le test avec case
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
ok ok.
Messages postés
7
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
29 septembre 2010

Désolé pour la faute, "la ComboBox apparaît grisée"
Messages postés
7
Date d'inscription
dimanche 11 mars 2007
Statut
Membre
Dernière intervention
29 septembre 2010

Tout simplement parce que si tu le mets en Enabled=false, la ComboBox apparaît grisé, mais surtout le texte n'apparaît pas en noir comme dans un textbox grisé, mais en gris également, ce qui nuit grandement à la lisibilité. C'est ce qui était demandé dans la source originale : "Donc la combobox est inactive, mais son contenue n'est pas 'flouté', comme avec la propriété Enabled"

La technique présentée permet de garder un texte noir sur fond blanc sans s'embêter.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
pourquoi ne pas le mettre en Enabled = False, en ce cas ?
je ne comprends pas.
Afficher les 24 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.