XL 2016 VBA - Évènement TextBox_Enter() non géré en module de Classe

Dudu2

XLDnaute Barbatruc
Bonjour,
Alors l'évènement _Enter() n'est pas géré en Classe ? Une solution ?
 

Pièces jointes

  • Test Classe.xlsm
    40.3 KB · Affichages: 5
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
non seulement tout les controls mais aussi la déviation parent/controls pour es frames et multipage
car si tu fait msgbox activecontrol.name dans un userform et que le control actif est dans une frames ou un multipage et ou / autres le message te donne le nom du parent
 

Dudu2

XLDnaute Barbatruc
J'ai résolu le problème des Frame et MultiPage.

Y a un bug Excel sur MultiPage lorsqu'on:
- active un Control du MultiPage
- active la Page qui contient ce Control
Le Control reste l'ActiveControl du MultiPage alors que ce devrait être le MultiPage l'ActiveControl.
Mais ça ne gène pas
 

Pièces jointes

  • Classe Event TextBox Enter() et Exit().xlsm
    46.2 KB · Affichages: 0

patricktoulon

XLDnaute Barbatruc
je crois que l'on c'est fourvoyé dans nos essais précédents
j'ai tout virér car je suis convaincu que ma méthode fonctionne
j'en ai refait un au propre de base pour le moment
et ca fonctionne sans bug et juste

je répète
le keydown sur Tab memorise le control(ca sera le old control)
le keyup toujours sur Tab on lance la sub generale
dans la sub générale on a le oldcontrol eet le newcontrol c'est le form.activecontrol
et le mousedown appelle, tout simplement la sub resultat

et je laisse la touche tab fonctionner dans le flux de control comme elle sait très bien le faire toute seule
 

Dudu2

XLDnaute Barbatruc
Alors oui, on peut exploiter la différence KeyDown et KeyUp sur le Control ciblé par l'évènement.
Ça peut résoudre le problème des déplacements par touches.

Pour les déplacements par Clic Souris, on peut aussi détecter l'Enter() grâce au MouseUp().
Par contre pas de solution pour l'Exit() d'une TextBox par clic dans un autre Control dont ne détecter pas l'Enter(). On en revient au point de départ.

Ou alors lancer une boucle Timer dans un Module qui rend l'ActiveControl 3 fois par seconde.
Du coup, ça rend inutile l'interception de tous les évènements.
Cependant plus commode que de coder tous les Controls dans la Classe.

Je vais essayer une méthode Timer un peu plus tard.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
pas la peine de tout ça
je te le met au propre
il fonctionne nickel et quand tu va voir le code tu va pleurer ( de rire j'espère) 😂
exactement le même principe que mes textboxs formatés
je travaille pour le moment avec
textbox
optionbutton
commandbutton
checkbox
 

dysorthographie

XLDnaute Accro
Bonjour,
j'arrive un peux tard et je n'es pas lu la totalité des poste mais si ça peux aider!
module standard
VB:
Dim T As New MyTimer
Sub test()
T.Interval = 100 '1000 = 1 secone / 0 arrêt du timer
End Sub
 Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _
    ByVal nIDEvent As Long, ByVal dwTime As Long)
    ' Code à exécuter à chaque intervalle du timer
    ' Par exemple, MsgBox "Timer Tick!"
End Sub
tu pourra définir dans TimerProc le Enter et le Exit des controles!

module de classe MyTimer
VB:
Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr, _
        ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
    Private Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, _
        ByVal nIDEvent As LongPtr) As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, _
        ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, _
        ByVal nIDEvent As Long) As Long
#End If

Private TimerID
Private m_Interval As Long

Public Property Let Interval(ByVal Value As Long)
    If CBool(Value) Then
        StartTimer Value
    Else
        StopTimer
    End If
End Property

Private Sub StartTimer(ByVal Interval As Long)
    If Interval <= 0 Then Exit Sub ' Vérifier si l'intervalle est valide
    m_Interval = Interval

    ' Créer un timer avec l'intervalle spécifié
    TimerID = SetTimer(0, 0, m_Interval, AddressOf TimerProc)
End Sub

Private Sub StopTimer()
    ' Arrêter le timer
    KillTimer 0, TimerID
    m_Interval = 0
End Sub


Private Sub Class_Terminate()
StopTimer
End Sub
 

Dudu2

XLDnaute Barbatruc
je travaille pour le moment avec
Tu peux améliorer le truc avec KeyDown (Control Origine) & KeyUp (Control Destination) et éviter d'aller chercher l'ActiveControl comme je l'ai fait dans mon code, mais si tu es obligé de coder tous les Controls dans la Classe pour choper leur MouseUp pour détecter un TextBox_Exit() par clic souris, ça reste la même usine à gaz rédhibitoire. J'attends de voir ta version.
 

Dudu2

XLDnaute Barbatruc
Excellent @patricktoulon !
1713637393287.gif

Juste une petite remarque, comme tu ne testes pas les Controls MultiPage, un clic sur Multipage (pas sur un de ses Controls) ne détecte pas la sortie d'une TextBox.
Pour le Frame c'est moins utile puisqu'une entrée dans le Frame amène directement à son 1er Control... sauf s'il n'en a aucun Enabled pour raison applicative.

J'ai donc moi aussi modernisé mon code (plus traditionnel que le tien dans l'initialisation de la classe) grâce au KeyUp(). Du coup je n'utilise plus du tout le KeyDown().

Reste que ces codes sont tributaires de la déclaration de WithEvents sur tous presque les Controls possibles.
Mais c'est déjà un grand pas pour l'humanité des développeurs VBA de XLD qui s'intéressent au Enter Exit de TextBox en module de classe... Une foule quoi
1713637360708.gif
.

Edit: Fichier voir plus loin
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Victoire ! J'ai pu enfin faire ce que tu as fait pour avoir une information référençable à travers toutes les instances d'une classe (ton truc de "mémoire").
Il m'a fallu un certain temps pour en comprendre le principe mais à force d'essais j'ai fini par capter !
 

Pièces jointes

  • Classe Event TextBox Enter(1) et Exit().xlsm
    64.1 KB · Affichages: 0

patricktoulon

XLDnaute Barbatruc
amuse toi a en enlever dans les keydown tu verra ils ne sont pas necessaire
c'est ce qui a de bien en laissant la tabulation faire son job comme à l'origine le jump de ctrl en ctrl se fait quand même
par contre le mouse down comme c'est pas d'origine la oui ils les faut
quoi que les images c'est comme les labels elle prennent pas

dans n'importe quel cas le procédé est simple comme bonjour
 

Discussions similaires

Réponses
6
Affichages
454
Réponses
29
Affichages
2 K

Statistiques des forums

Discussions
314 634
Messages
2 111 445
Membres
111 138
dernier inscrit
Gsx31