Vérifier si une forme est chargée

Résolu
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - 19 déc. 2013 à 10:43
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 19 déc. 2013 à 19:25
Bonjour,
Une application est constituées de 3 fonctionnalités chacune accessible via un bouton qui charge la Form correspondante.

Voici comment je charge les Forms
Dim Prgm(3) As Object
Set Prgm(1) = A 'c'est le nom de la Form
Set Prgm(2) = B
Set Prgm(3) = C

Quand on clique sur un des boutons
Private Sub Programme_Click(Index As Integer)
Load Prgm(Index)

Le problème est que si on clique 2 fois sur le même bouton la même Form est chargée à nouveau.
Avant de faire le Load je voudrais vérifier si la Form est déjà chargée.
J'ai trouvé des solutions qui vérifie si le caption est dans la collection de Forms mais je ne connais pas les caption, seulement le Name.

J'ai aussi essayé ceci mais j'ai "invalid property assignment"
Dim frm As Object
For Each frm In Forms
If frm = Prgm(Index) Then Exit Sub
Next


Merci d'avance pour votre aide

11 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2013 à 11:47
Bonjour,
1) Un Form a également une propriété Name.
2) le seul fait de te référer à un form ou à l'un de ses composants le charge, s'il n'est pas chargé
Et donc, la question : pourquoi fais-tu cela ? (explique).
Serait-ce pour éviter l'exécution d'instructions dans l'évènement Load des forms que tu charges ?
Explique la problématique.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
19 déc. 2013 à 12:11
Merci pour ta réponse,
Comme expliqué, le problème est que si on clique 2 fois sur le même bouton la même Form est chargée à nouveau.
Je voudrais l'éviter parce que le Form Load est à nouveau exécuté.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/12/2013 à 13:12
Tu n'as pas répondu à ma question !

Et surtout :
Enfin, quoi ! VB6 ne saurait "charger" plusieurs instances d'un même form !
Ne pas confondre le chargement d'un Form avec les instructions exécutées lors de son chargement !
Essaye de rester TECHNIQUE et TRES PRECIS !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
19 déc. 2013 à 13:34
Quand on clique sur un des boutons je fais
Private Sub Programme_Click(Index As Integer)
Load Prgm(Index)

Quand on clique à nouveau sur le même bouton je fais
Private Sub Programme_Click(Index As Integer)
Load Prgm(Index)

Donc "Load" est à nouveau exécuté; dans la Form en question "Form Load" est à nouveau exécuté, ce que je voudrais éviter.

Avant de faire le Load je voudrais vérifier si la Form est déjà chargée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/12/2013 à 14:35
Je t'ai déjà répondu.
Mais pas toi ...
Je te laisse là, si tu ne veux pas y mettre du tien !
Ton problème n'est pas un "rechargement". Il est autre !
Expose ta problématique exactement ou reste seul avec ta "vision" des choses.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
19 déc. 2013 à 15:18
Au départ c'est moi qui pose une question !

Je cherche seulement comment savoir si une Form est chargée sans la charger.

Merci pour ta réponse exhaustive et explicite.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 déc. 2013 à 15:38
Salut

Ton problème n'est pas clair.
Lors de tes appels, que vaut Index ?
Si tu ne veux pas charger 2 fois la même forme, pourquoi l'indexes-tu ?
Un simple test genre
If maForme(Index) Is Nothing Then 
    ' Existe pô encore
Else
    ' Existe déjà
End If

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
19 déc. 2013 à 16:04
J'ai 13 Form différentes et 13 boutons pour les appeler.
Plutôt de coder 13 fois
Private Sub Bouton1_click
Load Program1
End_sub
Private Sub Bouton2_click
Load Program2
End_sub
...
J'ai fait un array de boutons et un array pour les objets.
Quand on clique sur l'un des boutons, Index est le n° du bouton.

Private Sub Programme_Click(Index As Integer)
Load Prgm(Index) ' il s'agit de la Form correspondant au bouton.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/12/2013 à 17:10
Bonjour, cs_Jack,
On évite d'appeler un Form par son index, mais par son nom.
Les indexes sont attribués dans l'ordre de chargement des Forms.
De surcroit : fais ce petit test :
Sur Form1, un bouton et ce code :
Private Sub Command1_Click()
If Form2 Is Nothing Then MsgBox "oui" Else MsgBox "non"
End Sub
Tu n'as à ce stade pas chargé Form2, n'est-ce-pas ? Et pourtant Form2 n'est pas nothing


Ce qui est fait là est donc bon, puisque les forms ont été mis dans une matrice et que l'on se sert de l'index de la matrice et non du form dans la collection Forms.
A Herve_be :
J'ai bien compris ton mécanisme, mais là n'est pas ton problème ... et j'insiste, en te répétant :
- que l'instruction Load ne charge pas à nouveau un Form déjà chargé (et donc présent dans la collection Forms). Pour qu'il le recharge, il faut que l'instruction Unload ait été utilisée !
- qu'il suffit de se référer à un Form ou à l'un de ses contrôles pour que ce Form se charge automatiquement, s'il n'est pas déjà chargé !

Mais siu tu tiens absolument à faire ton test de non chargement (bien que, je le répète, ton problème est ailleurs) ===>>

voilà un exemple (totalementy inutile ...)

Private Sub Command1_Click()
MsgBox form_existe(Form2) ' t'affichera false
Load Form2
DoEvents
MsgBox form_existe(Form2) ' t'affichera maintenant True
End Sub

Private Function form_existe(f As Form) As Boolean
Dim f1 As Form
For Each f1 In Forms
If f1 Is f Then
form_existe = True
Exit For
End If
Next
End Function

Remplace Form2 Par n'importe quel prgm( x )


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2013 à 17:29
Et au passage (la sémantique est importante et chaque mot a une définition) :
"Set Prgm(1) = A 'c'est le nom de la Form"
"
Non ! A est un Form (et donc un objet) et son son nom (qui serait un string) ...
Je "chipote" ? ==>> pas du tout !
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
Modifié par Herve_be le 19/12/2013 à 17:33
Ben voilà, ça fonctionne très bien ainsi !
Quand on clique sur un bouton j'arrive ici avec Index = n° du bouton

Private Sub Programme_Click(Index As Integer)

Dim frm As Form
For Each frm In Forms
If frm Is Prgm(Index) Then
Prgm(Index).SetFocus
Exit Sub
Next

Load Prgm(Index)

Si la Form correspondant au bouton a déjà exécuté son Load alors elle reçoit simplement le focus, sinon on la charge.

En fait mon code initial était presque bon;
If frm = Prgm(Index) Then Exit Sub 
il fallait seulement remplacer le signe = par "is" !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2013 à 17:32
Bref ... (je ne veux pas m'épuiser à répéter).
Discussion à clore, donc (tag résolu qu niveau de ton premier message).
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2013 à 17:36
Tu devrais quand-même ouvrir ton aider VB6 et y lire ce qu'est simplement la méthode Show (elle charge si pas chargé) et montre toujours
(juste pour le cas où ...)
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
Modifié par Herve_be le 19/12/2013 à 17:43
La méthode show me dit-elle si la Form était déjà chargée ?
Je ne pense pas.
Par conséquent elle ne répond pas à ma question "Avant de faire le Load je voudrais vérifier si la Form est déjà chargée"
parce que si elle n'a jamais été chargée j'ai d'autres trucs à faire dans la Form principale (celle qui contient les 13 boutons).
Je ne comprends pas pourquoi tu tournes autour du pot pour connaître le comment du pourquoi alors que tu connais la solution.
Etait-ce trop simple de dire dès le début que si j'ai "invalid property assignment" c'est parce qu'on écrit pas
If frm = Prgm(Index)
mais
If frm is Prgm(Index)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 déc. 2013 à 17:58
1) La méthode Show montre (et charge si nécessaire)
2) tes "autres trucs à faire" ? fais-les depuis ailleurs (le Form que tu charges) que depuis la forme principale, pardi, s'ils ne doivent être faits qu'au chargement d'un autre Form !
Question de conception.
Mais bon ... J'essaye depuis le début de te mettre sur le chemin normal (raison de mes questions restées sans réponse) mais voilà ...
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 2
19 déc. 2013 à 18:24
1) La méthode Show montre (et charge si nécessaire)
donc elle ne fait pas ce que je voudrais
2) tes "autres trucs à faire" ? fais-les depuis ailleurs (le Form que tu charges)
Je devrais alors répéter le même code dans les 13 forms.

Tu me rappelles une anecdote.
Dans les années 80 j'ai fait un appel d'offre parce que la firme où je travaillais voulait acheter des PC portables; le cahier des charges disait entre autres "disque dur d'au moins 10 Mb" (ce n'est pas une erreur : 10 Mega ... en 85 !
IBM a remis une offre pour un PC portable sans disque dur.
Quand j'ai fait remarquer au délégué qu'il ne répondait pas au cahier des charges, il m'a rétorqué "mais ... vous n'avez pas besoin de disque dur !".

Idem ici.
Je cherche comment faire 'ça'.
Tu me réponds "tu n'as pas besoin de 'ça'" et tu commences à poser des questions et pourquoi, et comment, ... et c'est toi qui me demande de rester TECHNIQUE et TRES PRECIS !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/12/2013 à 19:23
OK !
Je m'abstiendrai donc dorénavant, avec toi :
- 1) de te proposer une meilleure conception
- 2) mais également de me lancer sur ton chemin, lorsque je le jugerai inadapté (je n'aime pas participer aux égarements)

PS : lorsque je vais acheter quelque-chose, je préfère personnellement "tomber" sur un commerçant qui me "corrige" si ce que je veux acheter est, en dépit de ce dont je suis persuadé, non en adéquation parfaite avec ce que je veux faire.
Mais bon ...
Bonne chance ...

PS2 : et j'ai adoré :
"J'ai trouvé tout seul
If frm = Prgm(Index) ... => If frm is Prgm(Index) ...
"
Devine où j'ai lu cela il y a quelques minutes !
Tout seul
, hein ...? <mode spécial> CHAPEAU BAS ! </fin mode spécial>
Ouais ...
0
Rejoignez-nous