XL 2021 Commentaire au survol d'un checkbox d'un userform

Nicolas JACQUIN

XLDnaute Occasionnel
Supporter XLD
Bonjour à tous,

Comme le titre le dit, je cherche à mettre un commentaire ou note au survol d'un checkbox d'un userform,
je sais que ça se fait et qui en a qui savent faire, mais plus moyen de trouver.

Merci d'avance à tous
 
Solution
Bonjour tous le monde,
J'ai trouvé ma solution je pense

Dans un module

VB:
Public Const MyString1 = "Les 1"
Public Const MyString2 = "Les 2"
Public Const MyString3 = "Les 3"
Public Const MyString4 = "Les 4"

Et dans le userform

Code:
Private Sub CheckBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox1, vbCrLf & MyString1
End Sub

Private Sub CheckBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox2, vbCrLf & MyString2
End Sub

Private Sub CheckBox3_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    commentary CheckBox3, vbCrLf & MyString3...

patricktoulon

XLDnaute Barbatruc
re
c'est fait ca marche
tes check box sont plus larges que le text qu'ils ont
j'ai virer les label effece et efface 2 et tout y couintiti
demo.gif
 

Dudu2

XLDnaute Barbatruc
Non, je n'ai pas testé parce que j'ai vu le code et je n'ai pas vu de différence de conception d'avec le Timer.
Mais si tu dis que ça fonctionne, alors utilise ce code car c'est ton droit le plus strict.
Perso, ma petite boucle "éternelle" me convient très bien et a fait ses preuves. Je ne changerai pas pour le tien ;) .
 

patricktoulon

XLDnaute Barbatruc
sauf que l'on repasse pas par tout e la function et A et B (qui sont en static )ne sont pas changés tant que l'on change pas de control ce qui fait que la boucle repart jusqu'a 300 par contre quand tu t'arrête de bouge en restant dessus seuls les appels de boucles passées finissent leur tour et ç'a s’arrête : et dès que tu re bouge ça repart
autrement dit
le move lance les appels
si c'est nouveau on part du début de la fonction
le comm se place
la boucle démarre
pendant qu'elle tourne avec le doevent d'autre appels lui parvient
comme c'est le même control ça passe direct a un nouvelle instance du do/loop
si je m'arrête de bouger les instances de boucles finissent leur tour et ça s'arrête(je suis toujours dessus)
des que je re bouge d'autres appels de la boucle se lancent
et bien sur dans la boucle byebye si on est sortis

mais j'ai bien peur que tu n'ai pas compris le truc en fait
mais c'est pas grave si tu veux pas regarder
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous

@Dudu2 je viens de me rendre compte que tu te fait une fausse idée du sleep
dans le do/loop
en fait avec le sleep de 100 pas exemple tu repose le procc oui!!! mais tu augmente le temps de boucle aussi
conclusion je viens de f"aire un test "avec une boucle do/loop de 10 tours "avec un sleep de 100
100*10 ca fait 1000 soit une seconde
une seconde pour déterminer si la souris est sorti est 10 fois trop long
démonstration et pour le coup je fait la même chose que dans ta démo a savoir sortir a pas de tortue du control
on vois bien mon label de decompte defiller largement moins vite
demo.gif


et pourtant je boucle que jusqu’à 10
soit une seconde(=1000)
conclusion j'ai bien raison la discontinuité de la boucle n'est pas nécessaire
pour peu que je règle le sleep à 200 on passe a deux secondes de delay et on vois bien le compteur défiler encore moins vite
demo.gif


on a donc des temps de repos quand on bouge pas
et des temps de repos avec le sleep
VB:
Sub InfoBulle(check As Object, msg)
    Dim pos As pointapi, Criter, i&, sorti$
    Static A
    Static B
    If check.Name = OldControl Then

        GoSub passe
    Else
        OldControl = check.Name
        A = EmplacementControl(check)
        B = EmplacementControl(check, 1)

        With commentaire
            .Visible = True
            .ZOrder 0
            .Controls("message").Caption = UCase(check.Name) & vbCrLf & msg
            .Move B(0) + check.Width - 3, B(1) - .Height + 3
            If .top < 0 Then .top = check.top + check.Height
            If .Left > Me.InsideWidth - .Width Then .Left = check.Left - .Width
        End With
passe:

        Do While i < 10    ' c laisse largement le temps de capter la sortie
            i = i + 1
            sorti = "pas sorti"
            Label1.Caption = "boucle à démarré " & i & "  " & sorti
            GetCursorPos pos
            Criter = pos.X > A(0) And pos.X < A(2) And pos.Y > A(1) And pos.Y < A(3)
            If Not Criter Then OldControl = "": sorti = "sorti": commentaire.Visible = False: Exit Do
            DoEvents
            Sleep 200
        Loop
      
       Label1.Caption = "boucle arrêtée " & i & "  " & sorti


    End If
    'Debug.Print "stop"
End Sub
 

Dudu2

XLDnaute Barbatruc
Bonjour la liste,

@patricktoulon, plus tu allonges ton temps de boucle (ici 2 secondes), plus tu te rapproches d'une boucle infinie en temps relatif utilisateur en action. Mais ça reste une boucle limitée, comme les Timers ou le nombre de tours.

Mettons, tu attends pendant 2 secondes. Maintenant, le curseur est en bordure de zone par hasard, l'utilisateur répond au téléphone pendant 5 minutes ou croque dans son donuts pendant 5 secondes ou regarde passer la nouvelle secrétaire pendant 3 secondes puis il reprend sa souris qui sort rapidement de la zone sans déclencher de MouseMove(). Ben ta nouvelle boucle à 2 secondes elle sert à rien. Ça couvre peut-être 98,5% des cas, mais pas 100%. La boucle infinie, c'est 100%. Et perso j'aime bien l'idée que ce soit 100%.
 

Discussions similaires

Statistiques des forums

Discussions
312 610
Messages
2 090 206
Membres
104 452
dernier inscrit
hamzamounir