Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.
Icône de la ressource

Collection module classe 2024 patricktoulon (classe controls) gérer Enter/exit TextBox 1.0 1.0

patricktoulon

XLDnaute Barbatruc
patricktoulon a soumis une nouvelle ressource:

Collection module classe 2024 patricktoulon (classe controls) gérer Enter/exit TextBox 1.0 - gérer l'enter et l'exit de textbox en serie


En savoir plus sur cette ressource...
 

Dudu2

XLDnaute Barbatruc
Bonjour @patrcktoulon,
Est-ce que tu peux me rappeler pourquoi dans la classe on n'utilise pas directement les évènements Enter() et Exit() ? Je suis un peu perdu sur ce truc.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2
tout simplement par ce ces deux events n'existent
pas dans une classe

et comment le pourraient ils d'ailleurs
un même module classe pour x textbox ,comment pourrait il gérer ces events particuliers et propre à chacun des textboxs concernés
sachant que l'enter d'un signifie le exit d'un autre
 

Samuel2023

XLDnaute Nouveau
Salut Patrick j'espère que tu vas bien
J'ai une nouvelle méthode à te soumettre.
Celle-ci consiste à partir d'une seule classe de module qui permet de créer et de gérer plusieurs formulaires et plusieurs contrôles de formulaire en associant propriété d'objet + événements d'objets. Au niveau du module Userform, on utilisera une variable statique pour appeler le module de classe concerné...
 

Dudu2

XLDnaute Barbatruc
Bonjour,

La question de @Samuel2023 m'amène à m'interroger sur le principe car je suis aussi intéressé au titre de cette ressource.

Lorsque la classe est instanciée pour chaque Control - ReDim Preserve cls(1 To A) dans ton code - qu'advient-il de ces instances lorsqu'on ferme le UserForm ?
- Est-ce qu'elles restent instanciées en mémoire ?
- Ou disparaissent-elles avec les Controls associés eux-mêmes disparus avec la fermeture du UserForm ?

A moins que le fait que le tableau des classes instanciées pour chaque Control, tableau qui fait partie de la classe instanciée dans le UserForm qui disparait avec le UserForm, en disparaissant lui aussi, supprime les instances de classe qu'il contient ? Encore que ce tableau fait aussi partie des instances des Controls.
Pas facile à décrire ! Ni à tester car le fait de conserver l'une de ces instances dans une variable Module pour voir si elle existe encore après la fermeture du UserForm (par appel d'une fonction Public de la classe faisant un MsgBox par exemple) empêche probablement la disparition de cette instance.

Sinon, pour être sûr il faudrait supprimer les instances des Controls à la fermeture du UserForm.
Mais comment supprimer une instance de classe ?
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Alors j'ai testé plusieurs options lors de la fermeture du UserForm_QueryClose() en appelant une fonction de la classe qui tente de supprimer les instances des Controls.
<Instance>.Delete
<Instance>.Remove
<Instance>.Release
<Instance>.Clear
<Instance>.Termination
mais ça plante.

Set <Instance> = Nothing fonctionne, mais est-ce pour autant que la mémoire est libérée de l'instance ou que simplement l'objet Instance prend la valeur Nothing ?
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Une remarque intéressante...

A - Si, dans le UserForm on déclare Dim Classe As New Classe1 en variable globale, on ne passera JAMAIS par l'évènement Class_Initialize() ni Class_Terminate() à la fermeture du UserForm. Ce qui n'est pas normal (encore un bug Excel) car la même déclaration dans un Module n'a pas ce problème et qui me fait douter que cette instance de Classe1 soit clôturée à la fermeture du UserForm.

B - Car si, dans le UserForm on déclare Dim Classe As Classe1 en variable globale, et que dans UserForm_Initialize() ou UserForm_Activate() on fait Set Classe = New Classe1, alors on passe bien par l'évènement Class_Initialize() et Class_Terminate() à la fermeture du UserForm.

Ce qui me fait dire qu'il ne faut pas utiliser l'option A si on veut utiliser l'évènement Class_Initialize() et Class_Terminate() et probablement avoir au moins l'instance UserForm de la classe clôturée à la fermeture du UserForm.

Avec les instances des Controls créées dans l'instance du UserForm, on ne passe pas par Class_Terminate() car ces instances de Controls ne sont pas clôturées et je ne sais pas comment les clôturer.
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour,
La durée de vie d'une variable est lié à sa portée.

Si le tableau de variables ce trouve en public,ou globale ,dans un module standard alors la variable restera en mémoire après la fermeture du formulaire.

Si le tableau est déclaré dans la zone déclaratives du formulaire alors il sera décharger de la mémoire car sa portée est celle du formulaire.

Personnellement je perconiserai l'utilisation d'une collection un set collection= Nothing au sorti du formulaire t'enlèverait toutes inquiétudes.

Ce qui n'empêche pas l'utilisation des événements Class_Initialize() et Class_Terminate() du module de classe.

Les Class_Initialize() et Class_Terminate() sont la pour instencier et libertés les objets utiles à l'intérieur de la classe pas à libérer l'instance de la classe proprement dite.

Class_Initialize() n'est pas déclancher à instenciation New mais l'hors de sa première utilisation.

Class_Initialize() est inévitablement déclancher et peut importe les conditions de l'utilisation de la classe. Même si inexistant dans le mode de classe.


VB:
Dim myArray() As new Classe1
ReDim myArray(10)
Erase myArray
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour,

Class_Initialize() est bien déclenché à l'instanciation.
Class_Terminate() est bien déclenché à la "désinstanciation"

Pour que toutes les instances d'une classe déclarée dans une UserForm soient "désinstanciées" à la fermeture du UserForm, il faut que ces instances soient visibles du UserForm et qu'elles soient explicitement créées par un = New Classe (voir mon post #8). Si ces instances sont créées dans la 1ère instance de la classe (cas particulier du code de @patricktoulon et du mien par la même occasion) elles ne sont jamais "désinstanciées".

J'essaie d'adapter le code pour que toutes les instances soient désintanciées à la fermeture du UserForm, mais il y a une particularité que j'essaie de contourner.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour @Dudu2
si tu veux détruire toute les classe en un coup tu a comme tu l'a finalement compris une classe maitresse qui me sert a appeler la fonction init
donc dans ma classe je vais ajouter une variable public CountClass
en suite a la fin de init je vais donner la valeur de A(variable d'incrémentation) à CountClass

ensuite j'ajoute une fonction dans mon module classe

VB:
Public Function clearAllClass()
   Dim i&
   For i = 1 To Me.CountClass
        Set cls(i) = Nothing
    Next
End Function

cette variable countclass ne sera accessible uniquement par la classe cl instanciée dans le userform
du coup pour la demo dans mon userform j'ajoute un bouton

et dans son click j'appelle la fonction de l'instance cl(instanciée dans le userform)
VB:
Dim cl As New TxtBoxEnterExit


Private Sub CommandButton2_Click()
cl.clearAllClass
End Sub

Private Sub UserForm_Initialize()
cl.init Me 'dans le intialise ou activate de l'userform
End Sub


terminé toute les classe sont détruites


bien évidement l'appel peut se faire au queryclose du userform

et voila terminé
 

Pièces jointes

  • classe ENTER EXIT V 4 patricktoulon(1).xlsm
    36.4 KB · Affichages: 0

Dudu2

XLDnaute Barbatruc
Bonjour @patricktoulon,

En effet, et je n'étais pas sûr que Set cls(i) = Nothing clear la classe.
Mais j'ai vérifié avec un petit code, ça marche effectivement.

Le problème dans ce cas c'est qu'il faut appeler une fonction de la Classe pour "clearer" toutes les classes. Sur un Query_Close() par exemple comme tu le mentionnes.

Pour éviter cette contrainte j'essaie de monter le tableau des instances de classe dans le UserForm de sorte qu'à sa fermeture, toutes les instances soient "clearées" automatiquement.
Alors ça marche bien quand je fais référence au UserForm réel dans la classe, mais je bute sur un problème énervant car en faisant référence à la UserForm.TableDesInstances dans la Classe, je dois le faire non pas avec le nom réel du UserForm (of course) mais avec une variable de classe qui a été settée au UserForm réel et je me prends des erreurs de property à la c*n alors que je n'ai aucun Property machin dans mon code.

 

dysorthographie

XLDnaute Accro
Patrick dans ta classe utilises Erase myArray dans terminate pour libérer toutes tes instances

Du reste je comprends toujours pas pourquoi tu utilises un tableau et pas un collection quand on sait que ça fonctionne sur windows et mac et set collection= Nothing efface également toutes les instances.

N'oubli pas Class_Terminate() pourrais replacer avantageusement cl.clearAllClass
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
robert tu a raison pour le erase du cls
@Dudu2 je pige rien de ce que tu me dis

et non si je met les instances de classe dans une collection le fait de mettre la collection à nothing ne détruit pas les instance de classe
 
Dernière édition:

dysorthographie

XLDnaute Accro
faut si tu libère la classe qui les abritent elle serons détruites set cl=nothing kill toutes les instance liées à cl car elle fon parti de sa portées mais je préfère les killer dans terminate!

Pour que toutes les instances d'une classe déclarée dans une UserForm soient "désinstanciées" à la fermeture du UserForm, il faut que ces instances soient visibles du UserForm
faut vue qelles son visible de la classe elle même

qu'elles soient explicitement créées par un = New
il ne peut en être autrement si non elles ne son pas créées


Si ces instances sont créées dans la 1ère instance de la classe (cas particulier du code de @patricktoulon et du mien par la même occasion) elles ne sont jamais "désinstanciées".
elles sont libéré par le simple fait que la porté de ces variable dépende de la classe qui elle à été déinstancier avec tous ces bébé! un avortement colectif

le temp de vi d'une variable dépend de sa porté si tu scie le tronc qui abrite ta classe toutes tes sous classe se casseront la gueule!
 
Dernière édition:
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…