Vérifier si une forme est chargée [Résolu]

Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 10:43 - Dernière réponse : ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention
- 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
Afficher la suite 

19 réponses

Répondre au sujet
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 déc. 2013 à 11:47
0
Utile
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.

Commenter la réponse de ucfoutu
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 12:11
0
Utile
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é.
Commenter la réponse de Herve_be
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 19/12/2013 à 13:12
0
Utile
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
Commenter la réponse de ucfoutu
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 13:34
0
Utile
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.
Commenter la réponse de Herve_be
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 19/12/2013 à 14:35
0
Utile
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
Commenter la réponse de ucfoutu
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 15:18
0
Utile
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.
Commenter la réponse de Herve_be
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscriptionModérateurStatut 28 août 2015 Dernière intervention - 19 déc. 2013 à 15:38
0
Utile
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

Commenter la réponse de cs_Jack
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 16:04
0
Utile
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.
Commenter la réponse de Herve_be
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - Modifié par ucfoutu le 19/12/2013 à 17:10
0
Utile
1
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
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 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 !
Commenter la réponse de ucfoutu
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - Modifié par Herve_be le 19/12/2013 à 17:33
0
Utile
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" !
Commenter la réponse de Herve_be
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 déc. 2013 à 17:32
0
Utile
7
Bref ... (je ne veux pas m'épuiser à répéter).
Discussion à clore, donc (tag résolu qu niveau de ton premier message).
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 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à ...
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 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 !
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 déc. 2013 à 19:17
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 ...
Herve_be 198 Messages postés mercredi 4 août 2010Date d'inscription 16 mars 2018 Dernière intervention - 19 déc. 2013 à 19:23
Pour faire des réponses pareilles, je préfère aussi que tu t'abstiennes, ce n'est d'ailleurs pas la première fois : quand j'ai vu que tu répondais en premier je me suis dit "aïe, on n'est pas sorti.
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 19 déc. 2013 à 19:25
Tu viens d'"en sortir", t'en fais pas ... et de rentrer ailleurs (une liste personnelle).
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.