Ouvrir plusieurs fois le même formulaire – Episode 2
Dans l’épisode précédent – Ouvrir plusieurs fois le même formulaire -, on a pu voir quelques bases permettant d’ouvrir plusieurs instances du même formulaire, par exemple pour comparer deux fiches Produits ou Clients à l’écran. Mais il restait plusieurs défauts, du fait de la gestion de nos variables. Cet article va les régler…
Le principe
Si nécessaire, relisez l’article précédent de cette série pour voir les principes et les défauts. En gros, la plupart des problèmes viennent du fait que la variable frm
qui nous servait à ouvrir une copie du formulaire se trouve dans le formulaire lui-même. D’où deux limites principales :
- un formulaire ne peut ouvrir qu’une seule copie de lui-même ;
- la durée de vie de la copie (l’autre instance) est limitée à celle du formulaire de départ : si vous fermez celui-ci, vous fermez sa copie (et donc toutes les suivantes).
Pour lever ces limites, on va apporter ces 2 nouveautés :
- on va stocker les copies de formulaires dans une variable globale, ce qui va régler le problème de la durée de vie ;
- on va remplacer la variable
frm
(qui était de typeAccess.Form
, valeur unique) par une variable de typeCollection
, qui permettra de stocker plusieurs copies.
La collection
- Créez un nouveau module standard (que vous pouvez appeler
mod Forms
, par exemple). - Ajoutez ces déclarations en début de module :
1 2 3 4 5 |
Option Explicit Option Compare Database ' Collection des formulaires Private colForms As New VBA.Collection |
Comme indiqué plus haut, la variable colForms
est de type Collection
, elle va pouvoir stocker plusieurs formulaires. Une collection est une liste de « clefs / valeurs ». Chaque formulaire devra donc être identifié par une clef unique pour pouvoir être stocké dans la collection.
Gestion de la collection
Il s’agit maintenant d’ajouter des nouveaux formulaires à la collection, et de gérer également leur suppression. Ajoutez ces deux fonctions à votre module :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
' --- ' AJOUT D'UN FORMULAIRE A LA COLLECTION ' --- ' Function NouveauFormulairePersonnes() Dim frm As Access.Form ' Création du nouveau formulaire Set frm = New [Form_frm Personnes] ' Activation du nouveau formulaire frm.SetFocus ' Ajout du formulaire à la collection globale colForms.Add frm, Str(frm.Hwnd) End Function ' --- ' SUPPRESSION D'UN FORMULAIRE DE LA COLLECTION ' --- ' Function FermerFormulaire(ByVal lngId As Long) ' Suppression du formulaire de la collection globale On Error Resume Next colForms.Remove Str(lngId) End Function |
- La première fonction crée un nouveau formulaire
frm Personnes
, comme dans l’article précédent. La nouveauté, ici, est que le formulaire est ensuite ajouté à la collection globalecolForms
, pour qu’il persiste en mémoire. - Pour ajouter un objet à une collection, vous invoquez la méthode
Add
, à laquelle vous passez l’objet à stocker, et sa clef unique (une chaîne de caractères). Pour faire rapide, la clef utilisée ici est l’identifiant de fenêtre (Hwnd
) donné par Access. Il s’agit d’une valeur de typeLong
, transformée en chaîne parStr()
. - La deuxième fonction fait l’inverse : elle retire un objet de la collection. Pour retirer un formulaire, il faudra donc fournir sa clef (son identifiant
Hwnd
).
Function
) pourraient en fait être des procédures (Sub
). Mais on s’en servira précisément comme fonctions dans un prochain article. Ceci explique cela…Gestion du formulaire
Notre infrastructure est en place, il reste à adapter le formulaire pour ajouter ses copies à notre collection globale, et pour retirer les copies lorsque le formulaire est fermé.
- Adaptez le code de votre bouton (
btnAutreFiche
, dans l’article précédent), pour obtenir ceci :
1 2 3 |
Private Sub btnAutreFiche_Click() NouveauFormulairePersonnes End Sub |
- Alimentez également l’événement
Sur fermeture
du formulaire (dans les propriétés du formulaire), de cette manière :
1 2 3 |
Private Sub Form_Close() FermerFormulaire Me.Hwnd End Sub |
Vous pouvez maintenant tester…
(argh : vos formulaires s’affichent toujours en superposition, encore une chose à améliorer ?)