Autres [Résolu]un seul evenement control gerant x controles identiques SANS MODULE CLASSE

patricktoulon

XLDnaute Impliqué
bonjour a tous
dranreb propose un calendrier conçu dans un userform
et utilise un mappage "withevents" dans un userform
je ne comprends pas bien comment il fait sans instancier de classe avec un seul "withevents" dans le userform
si quelqu'un sait un petit exemple simplifié serait le bien venu
 
Dernière édition:

patricktoulon

XLDnaute Impliqué
ok je pense avoir compris comme la boucle est perpétuelle dans le activate et est stoppée par des variables , a chaque click le bouton devient celui qui est mappé
 

ChTi160

XLDnaute Barbatruc
Bonjour Patrick
Bonjour le Fil ,le Forum
Pas sûr d'avoir compris ta demande !mais je crois que Bernard(Dranreb) a fournit un fichier qui pourrait répondre a ta recherche.
cela concerné des Chronos (Userform) je crois , il y avait possibilité d'afficher plusieurs Chrono .
un lien vers le Fil : Chrono
jean marie
 
Dernière édition:

patricktoulon

XLDnaute Impliqué
re
Bonjour ChTi160
en fait je regarde son calendrier et il utilise un stratagème inutile et gourmand en terme d'uc car c'est une boucle perpétuelle qui boucle sur le controls actif alors que l'on peu classer des controls absolument de la même manière qu'un module classe moyennant 2/3 petites nuances et quoi que dans mes classe je le fait deja
je prépare un exemple et je le donne

pour commencer avant mon retour il faut savoir que le module userform est un module classe a part entiere
ca devrait mettre la puce a l'oreille deja
je vais regarder ce chrono ;)
 

job75

XLDnaute Barbatruc
Bonjour à tous,
pour commencer avant mon retour il faut savoir que le module userform est un module classe a part entiere
ca devrait mettre la puce a l'oreille deja
En effet de même qu'on peut déclarer Public x As New Classe1 on peut déclarer Public y As New UserForm1

A+
 

patricktoulon

XLDnaute Impliqué
re
bonjour job75
voila un exemple
VB:
Public WithEvents bout As MSForms.CommandButton 'map événement control
Private clavier(15) As New UF 'tableau d'instance de map control
Public maforme As Object 'variable pour userform

Private Sub UserForm_Activate()
For i = 1 To 15 'boucle
Set clavier(i).bout = Me.Controls("commandbutton" & i) 'instanciation des map bouton
Set clavier(i).maforme = Me 'instanciation des map parent userform dans chaques map bouton
Next
End Sub
Private Sub bout_Click(): whatcontrol bout: End Sub 'événement unique gerant les 15 boutons 

Public Sub whatcontrol(ByVal Q As Object)'sub appelée par l’événement unique



'Label1.Caption = Q.Name ' ne peux pas fonctionner label1 est inconnu dans l'instance du map du bouton cliqué

UF.Label1.Caption = Q.Name 'PRECEDER DU PARENT  label1 est identifié
'ou
maforme.Label1.Caption = Q.Name ' ma forme est connu dans l'instance du map du bouton cliqué

'dans cet evenement tout les controls qui n'auraient pas été mappé doivent etre precedé de leur parent jusqu'au userform(ex:UF.frame1.textbox2)
End Sub
bien lire lire les commentaires
si dranreb passe par la ca devrait l’intéresser pour son calendrier ;)
voila une classe sans classe :p
 

Fichiers joints

Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne vais quand même pas charger 31 exemplaires de tout le calendrier juste pour que chacun me traite un seul de ses boutons de jour !
Mon userForm est modal. Il n'a rien d'autre à faire que de veiller en permanence à ce que le TBnJour soit toujours le ToggleButton actif. De plus il n'empêcherait pas le traitement d'évènements système puisque la boucle contient un DoEvents. D'ailleurs il est plus que probable que VBA déroule aussi de son coté en permanence des boucles pour pouvoir traiter les évènements. C'est juste dommage qu'ils n'aient pas prévu un évènement au niveau UserForm pour détecter le changement de contrôle actif.
 
Dernière édition:

patricktoulon

XLDnaute Impliqué
re
C'est juste dommage qu'ils n'aient pas prévu un événement au niveau UserForm pour détecter le changement de contrôle actif.
re
je t'en fait 1 si tu veux qui demande très très peu de ressource avec une de mes astuces ;)
je l'ai ja mais testé sur un userform mais qui sait ??
et si suis je bête je m'en sert avec mon msgbox perso temporaire

dans un userform tu met tout plein de controls et un label
tu met ce code
VB:
Option Explicit
Private WithEvents Cmbrs As CommandBars    'creation de l'object commandbars events

'evenement commandbars
Private Sub Cmbrs_OnUpdate()
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled
    UserformControl_change
End Sub



Private Sub UserForm_Activate()
    Set Cmbrs = Application.CommandBars
    Cmbrs_OnUpdate
End Sub

'evenement userform
Private Sub UserformControl_change()
    Label1 = ActiveControl.Name
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Set Cmbrs = Nothing
End Sub
bien moins lourd qu'une boucle perpétuelle au graphique des performances ;)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
C'est sûr que si tu trouvais une procédure qui s'exécute automatiquement dans un UserForm chaque fois que le focus passe à un autre contrôle, ça m'intéresserait énormément.
 

patricktoulon

XLDnaute Impliqué
re
ben je viens de te donner l'astuce
regarde dans gestion des taches le graphique ,il décolle pas ca consomme queudale

j'oubliais cerise sur le gâteau les doevents et compagnie bye!!bye!!
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Non, tu ne m'a rien donné de ce qui m'intéresserait. Je ne veux pas d'un CommandBar dans mon UFmCalend. Je veux être averti avant tout autre évènement quand le ActiveControl change. Je me fous de ce que ça consomme comme CPU du moment que ça n'empêche rien d'autre de tourner en même temps.
 

patricktoulon

XLDnaute Impliqué
re
ben test avant de parler
ca n’empêche absolument rien de tourner

demonstration
l'evenement UserformControl_change te donne bien le controls actif
ca te met pas une commandbars elle existe deja
je me sert de son événement update pour boucler c'est tout
demo3.gif
 

Dranreb

XLDnaute Barbatruc
Ça n'a pas l'air de marcher chez moi. Quand j'affiche l'UserForm ça m'affiche dans le Label1 le nom du contrôle qui a le focus, mais ensuite ça ne change plus quand je clique sur d'autres.

Je ne vois pas pourquoi ça marcherait, d'ailleurs.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Effectivement en non modal ça marche. Mais ça ne me plait pas du tout. Ça aboutit d'ailleurs aussi à une exécution répétitive, et non à une exécution quand l'ActiveControl change.
 

patricktoulon

XLDnaute Impliqué
re
oui c'est une sorte de boucle mais l'UC n'est pas surchargé car en fait la boucle se fait en interne avec le on_update
je sais pas si tu est allé voir les gif dans Cjoin ton calendrier oscille entre 25% et 81% au repos avec cette méthode c'est insignifiant
je t'en cherche d'autre ;)
le mien est quasiment fini il me manque le calcul de certain jour férié canadien
 

Roland_M

XLDnaute Barbatruc
Bonjour,

c'est Dranreb qui m'avait filé cette astuce, boucle withevents, pour éviter un module de classe !
j'ai gardé les deux méthodes, celle de Dranreb et celle où je répète les 31 Sub des boutons(c'est pas gênant non plus, je les crée automatiquement)

pour la démonstration ci-joint mon calendrier autonome avec la méthode Dranreb(boucle withevents) et userform modal, fermeture après saisie
ça fonctionne parfaitement !
c'est vrai que c'est plus gourmand, mais franchement le temps de saisir une date, ça va quoi, je ne vois pas où est le problème !?

EDIT: Par contre "voilà une classe sans classe " de Patrick je vais y regarder car ça m'intéresse !

RE-EDIT: je viens d'essayer et ça fonctionne bien ! je trouve ça génial !
le problème c'est comme tu dis (Patrick):
'dans cet evenement tout les controls qui n'auraient pas été mappé doivent etre precedé de leur parent jusqu'au userform(ex:fmSTD_Calendrier.frame1.textbox2)

je ne me vois pas renommer tous les contrôles de mon calendrier, ça risque d'être laborieux !
 

Fichiers joints

Dernière édition:

patricktoulon

XLDnaute Impliqué
re Bonjour a tous les deux
roland chez moi aussi le model de danreb fonctionne très bien mais il est plus que gourmand après ca semble pas gêner plus que ca dranreb

perso je pense que pour un controls puisque c'est ca et seulement ca (un control calendrier) c'est un peu gros

je m'en suis aperçu quand je l'ai testé sur le pc portable c'est un petit hp a 450€ autant te dire que j'ai 4 giga de mémoire et 500 Giga de disque et un W10 taillé a la serpette et bien il souffre j'ai même eu un white screen pendant quelque secondes
mon pc fixe ca le chatouille c'est normal c'est un gamer et est équipé en conséquence mais je vois bien le compteur(gadget windows) aiguille crève le plafond et revient a moitié de temps en temps

perso moi ça me préoccupe un control qui pompe plus que l'application elle même

tandis qu'une classe même dans le userform contrairement a ce que crois dranreb ne mémorise pas x userform mais x map de l'userform , c'est différent et ça reste fixe et ça pèse deux cacahuètes

les classes c'est fait justement pour ça autant les utiliser surtout que la c'est juste les conditions : 42 jetons qui exécutent la même chose ,2 combo et spinbutton

l'avantage ben quand tu fait rien ou meme quand tu le charge l' encéphalogramme est plat ;)

après il fonctionne très bien j'ai rien a dire

sauriez vous ou je peut trouver les formules pour calculer certains jour fériés canadien?
 
Dernière édition:

patricktoulon

XLDnaute Impliqué
re
je reviens sur ce qu'a dit dranreb
Je ne vais quand même pas charger 31 exemplaires de tout le calendrier juste pour que chacun me traite un seul de ses boutons de jour !
l'exemple que j'ai donné prouve irréfutablement que ca ne mémorise pas x userforms mais bien des maps des controls
sinon dans la sub label1 serait reconnu sans qu'on soit obligé de préciser le parent puisque (je le rappelle)tout est dans l'userform
 

Roland_M

XLDnaute Barbatruc
re

je reviens sur "une classe sans classe"
j'ai essayé en rajoutant ex:fmSTD_Calendrier.frame1.textbox2 . . .

mais il y a un problème sérieux concernant les variables
j'ai deux dates déclarées
CalDateDEBUT As Date, CalDateFIN As Date
elles sont initialisées dans Activate et gardent bien entendu ces valeurs tout le temps de l'utilisation du calendrier
et j'en ai d'autres ainsi nécessaire au calendrier.

quand je sélectionne un jour sur le calendrier, j'ai un plantage !?
je me suis rendu compte que mes variables perdaient leurs valeurs ! donc valeur 0 date "00:00:00"
ça m'a l'air chaotique !? c'est bien dommage !

EDIT: c'est le cas pour toutes les variables initialisées au début et utiles au calendrier !
toutes remises à zéro ! ça peut pas aller !
 
Dernière édition:

Discussions similaires


Haut Bas