OVH Cloud OVH Cloud

form.load ou form.show - interactif et dinamique

4 réponses
Avatar
nullus premier
bonjour,

J'ai un tableau avec le nom de 3 form existantes.

Dans le load de mon form principal, je cr=E9=E9 autant de=20
commandbutton que j'ai d'=E9l=E9ment dans mon tableau.
Chaque commandbutton re=E7oit au passage en caption le nom=20
du form dans le tableau.
Comment ouvrir le form en cliquant sur son commandbutton ??

sub formload()
montab =3D array("lulu","titi","mama")
for i =3D 0 to 3
load commandbutton(i)
commandbutton(i).caption =3D montab(i)
end sub

sub commandbutton_Click(Index As Integer)
ici je souhaite le code qui show le form en fonction de=20
l'index en trouvant le nom du form dans montab
end sub


Plus tard, j'envisage d'avoir d'autres form, et il me=20
suffirait simplement d'ajouter leur nom dans montab.

Par simplicit=E9, je n'ai pas mis le code de la gestion de=20
l'emplacement des commandbutton

Par avance merci

4 réponses

Avatar
François Picalausa
"nullus premier" a écrit dans le
message de news:028e01c3c301$024e37d0$
bonjour,

J'ai un tableau avec le nom de 3 form existantes.

Dans le load de mon form principal, je créé autant de
commandbutton que j'ai d'élément dans mon tableau.
Chaque commandbutton reçoit au passage en caption le nom
du form dans le tableau.
Comment ouvrir le form en cliquant sur son commandbutton ??

sub formload()
montab = array("lulu","titi","mama")
for i = 0 to 3
load commandbutton(i)
commandbutton(i).caption = montab(i)
end sub

sub commandbutton_Click(Index As Integer)
ici je souhaite le code qui show le form en fonction de
l'index en trouvant le nom du form dans montab
end sub


Plus tard, j'envisage d'avoir d'autres form, et il me
suffirait simplement d'ajouter leur nom dans montab.

Par simplicité, je n'ai pas mis le code de la gestion de
l'emplacement des commandbutton

Par avance merci



Bonjour/soir,

montab = array("lulu","titi","mama")


Ca ressemble à du variant tout ça... LENT!
=>
Dim MonTab(2) As String
MonTab(0) = "lulu"
MonTab(1) = "titi"
MonTab(2) = "mama"
=> Typé = plus rapide ;-)

Une solution pour ton problème serait de stoquer tous les objets dans une
collection.
On remplace les noms hardcodés dans un tableau par les tags de chaque form.
Exemple:
Option Explicit

Private MyForms As Collection

Private Sub CommandButton_Click(Index As Integer)
MyForms(CommandButton(Index).Caption).Show
End Sub

Private Sub Form_Load()
Set MyForms = New Collection

MyForms.Add Form2, Form2.Tag
MyForms.Add Form3, Form3.Tag
MyForms.Add Form4, Form4.Tag


Dim objForm As Form

For Each objForm In MyForms
Load CommandButton(CommandButton.UBound + 1)
'on utilise le tag du form come caption
CommandButton(CommandButton.UBound).Caption = objForm.Tag
CommandButton(CommandButton.UBound).Visible = True
CommandButton(CommandButton.UBound).Left = _
CommandButton(CommandButton.UBound - 1).Left + _
CommandButton(CommandButton.UBound - 1).Width
Next objForm
End Sub

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
nullus premier
>-----Message d'origine-----
"nullus premier" a


écrit dans le
message de news:028e01c3c301$024e37d0$
bonjour,

J'ai un tableau avec le nom de 3 form existantes.

Dans le load de mon form principal, je créé autant de
commandbutton que j'ai d'élément dans mon tableau.
Chaque commandbutton reçoit au passage en caption le nom
du form dans le tableau.
Comment ouvrir le form en cliquant sur son




commandbutton ??

sub formload()
montab = array("lulu","titi","mama")
for i = 0 to 3
load commandbutton(i)
commandbutton(i).caption = montab(i)
end sub

sub commandbutton_Click(Index As Integer)
ici je souhaite le code qui show le form en fonction de
l'index en trouvant le nom du form dans montab
end sub


Plus tard, j'envisage d'avoir d'autres form, et il me
suffirait simplement d'ajouter leur nom dans montab.

Par simplicité, je n'ai pas mis le code de la gestion de
l'emplacement des commandbutton

Par avance merci



Bonjour/soir,

montab = array("lulu","titi","mama")


Ca ressemble à du variant tout ça... LENT!
=>
Dim MonTab(2) As String
MonTab(0) = "lulu"
MonTab(1) = "titi"
MonTab(2) = "mama"
=> Typé = plus rapide ;-)

Une solution pour ton problème serait de stoquer tous les


objets dans une
collection.
On remplace les noms hardcodés dans un tableau par les


tags de chaque form.
Exemple:
Option Explicit

Private MyForms As Collection

Private Sub CommandButton_Click(Index As Integer)
MyForms(CommandButton(Index).Caption).Show
End Sub

Private Sub Form_Load()
Set MyForms = New Collection

MyForms.Add Form2, Form2.Tag
MyForms.Add Form3, Form3.Tag
MyForms.Add Form4, Form4.Tag


Dim objForm As Form

For Each objForm In MyForms
Load CommandButton(CommandButton.UBound + 1)
'on utilise le tag du form come caption
CommandButton(CommandButton.UBound).Caption =


objForm.Tag
CommandButton(CommandButton.UBound).Visible = True
CommandButton(CommandButton.UBound).Left = _
CommandButton(CommandButton.UBound - 1).Left


+ _
CommandButton(CommandButton.UBound - 1).Width
Next objForm
End Sub

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


.
Merci François pour ces explications. N'ayant jamais créé


de collection, je découvre donc.
J'avais cherché, en vain, du côté de la collection forms
ou dans ce sens.
Je viens d'essayer ton exemple, je pense l'avoir assimilé.
Cependant, je coince sur les
MyForms.Add Form2, Form2.Tag
en effet, dés le 2e, j'ai ce message d'erreur
"Cette clé est déjà associée à un élément de cette
collection (erreur 457)"
En faisant F8, pas à pas, je constate que mon form "lulu"
est chargé en mémoire, puis j'ajoute "titi" qui se charge
en mémoire, mais en sortant de mon form "titi" j'obtiens
le message.

"lulu", "titi" et "mama" sont des formulaires de gestions
de données assez important, ne prendront ils pas trop de
mémoire ? D'autant plus que je vais en développer une
centaine par la suite ...
Avatar
François Picalausa
"nullus premier" a écrit dans le
message de news:1411901c3c316$b12da000$
-----Message d'origine-----
"nullus premier" a écrit dans
le message de news:028e01c3c301$024e37d0$
J'ai un tableau avec le nom de 3 form existantes.

Dans le load de mon form principal, je créé autant de
commandbutton que j'ai d'élément dans mon tableau.
Chaque commandbutton reçoit au passage en caption le nom
du form dans le tableau.
Comment ouvrir le form en cliquant sur son commandbutton ??

sub formload()
montab = array("lulu","titi","mama")
for i = 0 to 3
load commandbutton(i)
commandbutton(i).caption = montab(i)
end sub

sub commandbutton_Click(Index As Integer)
ici je souhaite le code qui show le form en fonction de
l'index en trouvant le nom du form dans montab
end sub


Par avance merci



Bonjour/soir,

Une solution pour ton problème serait de stoquer tous les objets
dans une collection.
On remplace les noms hardcodés dans un tableau par les tags de
chaque form. Exemple:
<snip l'exemple>


.





Bonjour/soir,


Merci François pour ces explications. N'ayant jamais créé


de collection, je découvre donc.
J'avais cherché, en vain, du côté de la collection forms
ou dans ce sens.
Je viens d'essayer ton exemple, je pense l'avoir assimilé.
Cependant, je coince sur les
MyForms.Add Form2, Form2.Tag
en effet, dés le 2e, j'ai ce message d'erreur
"Cette clé est déjà associée à un élément de cette
collection (erreur 457)"



Il FAUT définir les tags de chaque forms (à partir de l'éditeur de
propriétés design time) sinon, tu ajoute des éléements qui ont pour clé ""
Deux tags ne peuvent pas être les même.

En faisant F8, pas à pas, je constate que mon form "lulu"
est chargé en mémoire, puis j'ajoute "titi" qui se charge
en mémoire, mais en sortant de mon form "titi" j'obtiens
le message.

"lulu", "titi" et "mama" sont des formulaires de gestions
de données assez important, ne prendront ils pas trop de
mémoire ? D'autant plus que je vais en développer une
centaine par la suite ...



Je me demande si tu ne devrais pas développer un Contrôle ActiveX/boutton.
Si j'ai bien compris, chaque feuille doit être un bloc indépendant et
l'application principale un lanceur.

L'avantage du contrôle activeX, est que tu as un projet différent pour
chaque composant.
Si un bug a été corrigé dans une version du composant, tu ne dois donc pas
recompiler tout le projet et tout ne doit pas êtr réinstallé. De même, si un
utilisateur ne veut pas d'un composant, il lui suffit de ne pas l'installer.
Sinon, il doit avoir la grosse installation qui lui isntalle même ce qu'il
ne veut pas.
Ton activeX se chargera lui même de la mise en mémoire de la feuille en
temps voulut et donc, plus d'inquiétude de ce point de vue là.
Mis à part ça, tu est limité en nombre de feuilles/projet. Ici, tu peux
enfreindre cette limite puisque un composant = trois-quatres feuilles et tu
charge plusieurs composants.

Pour utiliser des contrôles séparés, je te conseille la fiche suivante de la
FAQ et plus particulièrement la seconde solution:
http://faq.vb.free.fr/index.php?questionˆ

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
nullus premier
Il n'y a q'un utilisateur, MOI.
Pas de distribution, j'suis trop nul pour cela.

ActiveX KEZAKO ?? Cela dépasse de loin mes capacités et
ma culture de programmation.

Le premier exemple sur http://faq.vb.free.fr/index.php?
questionˆ, je le maitrise sans problème.

Le deuxième, avec WithEvents, je pense comprendre que le
textbox est créé au chargement de la feuille.
Mais l'aide en ligne VB sur withevents est pour moi
nébulleuse.

Par contre je ne sais pas lire l'anglais et je le comprend
encore moins, dommage ... pour les liens sur le site MS

Cependant, il me semble que l'on séloigne un peu:
- j'ai un nombre évolutif de form.
- je charge dans un tableau le nom des forms.
- je fabrique et positionne durant le formload autant de
commandbutton(indexé) que d'éléments dans mon tableau
- je pose dans chaque caption le nom du form existant
-je souhaite ouvrir le form correspondant au nom figurant
sur le commandbutton quand je clique dessus.

Merci encore François pour ta diligence.