adamo901
Messages postés139Date d'inscriptionmardi 18 janvier 2005StatutMembreDernière intervention 8 décembre 2008
-
17 avril 2007 à 10:46
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 2014
-
23 avril 2007 à 14:43
Bonjour,
Je cherche à ouvrire une fenêtre dont le nom est le contenue d'une textbox. sans utiliser des if :
Exemple :
J'ai trois form : Form1, Form2 et Form3
sur Form1 j'ai TextBox1 et le un bouton Commande1.
Le but est :
Si je saisie Form2 dans le TextBox1 et je click sur Commande1 ==> la fenêtre Form2 s'affiche.
A voir également:
Ouvrire une fenêtre dont le nom est le contenu d'une TextBox
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 20 avril 2007 à 12:17
Bonjour adami901
1) il n'y a pas à ma connaissance d'autres moyens ! L'aide en ligne (lis-la donc un peu) est très claire à ce sujet : la collection des Forms ne contient que les Forms chargées ! et tu ne peux te référer à une Form par une chaîne de caractères, mais uniquement par son nom directement. Ce problème est donc entendu !
2) Charger une form ne veut pas nécessairement dire la montrer.
3) En ce qui concerne l'occupation des ressources (j'ai déjà eu l'occasion de le dire) : il n'y a absolument aucune différence entre le Hide et le Unload. Tu peux faire tous les Unload que tu veux... la mémoire occupée ne sera pas modifiée tant que ton appli elle-même tournera (jusqu'à, donc, la dernière Form). Si tu veux en avoir la preuve, c'est facile ... je te laisse réfléchir pour deviner ce qu'il te suffirait de faire pour le prouver ...(retrouver par exemple la valeur d'une variable globale ou statique, ou encore la couleur modifiée d'un contrôle... en "rechargeant" une form précédemment déchargée.
Voilà... à moins que tu ne nous sortes ce que VB ne sait pas faire, tu sais maintenant : et ce qu'il convient de faire et que le fait de charger des Forms (que tu peux cacher) n'apporte aucun bénéfice réel.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 22 avril 2007 à 08:25
Bonjour,
J'aimerais vraiment que tu reviennes ici, adamo
Pour toi, mais également pour tous ...
En y allant pas à pas, étape de réflexion par étape de réflexion, on arrive à quelquechose d'à la fois beau et surprenant...
C'est toi qui a ouvert cette discussion et je tiens à ce que tu reste dans ce fil (tu verras pourquoi c'est intéressant...)
Je précise que je n'ai jusqu'à ce jour communiqué à personne ce que je m'aprêtes à communiquer ici. VBFrance a donc la possibilité de orofiter là d'une vraie " première "
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 avril 2007 à 12:06
Bonjour ami,
Ne te précipite pas !
Je t'ai dit qu'on allait y aller (pour la bonne compréhension) pas à pas ...
La seule chose que je demande est que personne n'intervienne entre chaque étape (même pas toi).
Un seul truc : je me suis abîmé hier un muscle lombaure et la position assise me fait énormément souffrir.
Il me faudra laisser passer un quart d'heure au moins entre chaque message.
Je dirai quand je serai arrivé à l'étape finale...
Tu n'as qu'à revenir ici de temps en temps (mais sans intervenir, s'il te plait)
Etape 2, donc avec trois forms form1, form2 et form3
une listbox list1 sur form1
code dans form1 :
Dim formes(2) As Form
Private Sub Form_Load()
Set formes(0) = Form1
Set formes(1) = Form2
Set formes(2) = Form3
For i = 0 To 2
List1.AddItem formes(i).Name
Next
End Sub
Private Sub List1_Click()
formes(List1.ListIndex).Show
End Sub
ce n'est là que la 2ème étape et elle ressemble à la première (l'étape finale sera surprenante)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 avril 2007 à 12:20
Etape 3 (facile à mettre en oeuvre mais difficile à comprndre !
Nous allons maintenant faire "sauter" le trempli d'un tableau formes et alimenter directement la listbox par les noms.
Pour des raisons non claires, VB s'y retrouvera alors même que les forms form2 et Form3, non encore chargées, ne se trouvent normalement pas dans la collection Forms !
Tout se passe comme si VB, en allant "chercher" le nom, gardait en mémoire l'objet !!!
Private Sub Form_Load()
List1.AddItem Form1.Name
List1.AddItem Form2.Name
List1.AddItem Form3.Name
End Sub
Private Sub List1_Click()
Forms(List1.ListIndex).Show
End Sub
La preuve ?
Le code suivant planterait
alors même qu'il n'y a aucune différence entre les chaînes Form2 et Form2.Name, toutes deux de type string
Private Sub Form_Load()
List1.AddItem "Form1"
List1.AddItem "Form2"
List1.AddItem "Form3"
End Sub
Private Sub List1_Click()
Forms(List1.ListIndex).Show
End Sub
Etonnant, non ?
Ce n'est pas fini ... je reviens après déjeuner ...
A +
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 avril 2007 à 12:29
Bon...
j'ai encore un peu de courage et 5 minutes !
Le code qui ne marchait oas (en rouge dans mon message précédent) va subitement marcher ainsi !!!
Private Sub Form_Load()
abracadabra = Form1.Name & Form2.Name & Form3.Name
List1.AddItem "Form1"
List1.AddItem "Form2"
List1.AddItem "Form3"
End Sub
Private Sub List1_Click()
Forms(List1.ListIndex).Show
End Sub
Etonnant, non ?
Voilà bien la preuve de ce que j'avançais ! Le seul de se référer à une Form, ne serait-ce que pour en tirer sa propriété Name force VB, apparemment, à constituer une collection de Forms !!!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 avril 2007 à 14:04
La dernière étape est évidente :
Si; comme j'ai largement exprimé que je le pensais, une Form était ajoutée à la collection Forms de VB, chargée ou non, dès l'ors que l'on se référait à l'une seule de ses propriétés, rien ne devrait alors plus interdire que l'on s'amuse à l'y rechercher en uitilisant une chaine de caractères !...
Et c'est le cas !!!
La preuve ? (on ajoute un bouton de commande command1, ici) :
Private Sub Command1_Click()
toto = "Form3"
For Each frm In Forms
If frm.Name = toto Then frm.Show
Next
End Sub
Private Sub Form_Load()
abracadabra = Form1.Width & Form2.Height & Form3.Caption
End Sub
Il est bien évident que si "Form3" était frappé dans une textBox, on utiliserait toto = Text1.text, n'est-ce-pas ?
(encore que je préfère l'idée d'une listbox puisqu'elle n'oblige pas l'utilisateur à frapper un nom de Form ...)
Voilà ... moi j'ai fini, en ce qui me concerne ... A vous, maintenant.... la discussion reste ouverte
Qui se charge, maintenant, de faire un petit exposé de toutes ces belles choses-là ? (aucun forum n'a jusqu'à présent "la chose").
jrivet
Messages postés7392Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention 6 avril 201260 23 avril 2007 à 14:09
Salut,
Oui mais rien que le fait de faire Form1.Width alors qu'il n'ai pas chargé, ceci le charge automatiquement (il passera par Form_Load du Form1)
=> Ajout dans la collection Form puisque chargé
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 23 avril 2007 à 14:43
Exact, Dricke !
Et c'est bien là la raison pour laquelle on m'entend répéter (ici et ailleurs) qu'il n'y a aucune différence (en occupation de mémoire) entre le fait qu'une Foms soit chargée ou non (seule les références de la collection Forms diffèrent) ... Le Unload ne décharge pas vraiment la mémoire tant que la totalité des Forms n'est pas déchargée !!!
Tout cet exercice deviendarit parfaitement inutile dès lors que le chargement "connu" des Forms (sans alourdir la mémoire pour aurant, contrairement aux idées reçues et largement répandues à tort) se ferait systéùatiquement.
Le seul point intéressant de tout cet exercice a été de démontrer que même lorsque l'on ne charge pas une Form, VB en abonde en catimini sa collection Forms dès lors que, par un moyen ou un autre, on s'y réfère.... et de démolir une fois pour toutes les thèses de "fausses économies" (que, de son côté, VB ne fera jamais).
Je n'ai par ailleurs nulle part trouvé un tel aveu de VB....
J'ai par contre toujours trouvé de fausses idées (au prétexte d'économie de mémoire) à ce sujet.