OVH Cloud OVH Cloud

Suppression d'un control créer à la volé.

4 réponses
Avatar
Yan
Bonjour à tous,

Voilà mon problème, j'ai un Sub dans lequel je créer une fenêtre contenant
et un bouton et un label le tout à la volé. J'aimerais supprimer le label, à
l'aide de la fonction dispose() (je suppose), en cliquant sur le bouton qui
appel un autre Sub. Mais je n'y arrive pas.

Je penses que je suis dans la bonne voie, enfin je suppose, qu'en
pensez-vous ?

Voici en gros ce que j'ai fait :

Public Sub creation_premier_lancement()
' Création de la fenêtre :
Dim frm_premier_lancement As New Form()
frm_premier_lancement.StartPosition = FormStartPosition.CenterScreen

' Dimension de la fenêtre :
frm_premier_lancement.width = 500
frm_premier_lancement.height = 350

' Style de la fenêtre :
frm_premier_lancement.FormBorderStyle = FormBorderStyle.none

' Affichage de la fenêtre :
frm_premier_lancement.show

' Création du bouton "Suivant >" :
Dim btn_suivant As New Button()

' Affichage du texte dans le bouton :
btn_suivant.Text = "Suivant >"

' Evenement du bouton :
AddHandler btn_suivant.click, AddressOf suppression

' Ajout du bouton à la feuille :
frm_premier_lancement.Controls.Add(btn_suivant)

' Affichage en premier plan :
btn_suivant.BringToFront()

' Affichage d'un label contenant le texte de bienvenue :
Dim texte_de_bienvenue as new Label()
texte_de_bienvenue.text = "Coucou"

' Ajout du texte de bienvenue à la fenêtre :
frm_premier_lancement.Controls.Add(texte_de_bienvenue)

' Affichage en premier plan :
texte_de_bienvenue.BringToFront()
End Sub

Public Sub suppression(sender As Object, e As EventArgs)
jenesaispasquelcheminutiliserici.texte_de_bienvenue.dispose()
End Sub

Merci d'avance si vous pouviez m'aider,
Yan

4 réponses

Avatar
Piotrek
Salut c'est plus simple que tu le pense:

frm_premier_lancement.Controls.Remove(texte_de_bienvenue)
Avatar
Yan
Bonjour,

Merci pour votre aide, mais ça ne fonctionne pas. Lors de la compilation, il
me dit que "frm_premier_lancement" n'est pas déclaré, c'est comme si ma
fenêtre était uniquement destinée au sub qui l'a créé.

Merci encore,
Yan

-----------------------------
"Piotrek" a écrit dans le message de
news:O$1$
Salut c'est plus simple que tu le pense:

frm_premier_lancement.Controls.Remove(texte_de_bienvenue)




Avatar
Piotrek
Il faut declarer frm_premier_lancement et texte_de_bienvenue au niveau de ta
classe ou de ta form:

Dim frm_premier_lancement As Form()
Dim texte_de_bienvenue as Label()

Public Sub creation_premier_lancement()
' Création de la fenêtre :
frm_premier_lancement = New Form()
......
texte_de_bienvenue = new Label()
.....

Public Sub suppression(sender As Object, e As EventArgs)
frm_premier_lancement.Controls.Remove(texte_de_bienvenue)
End Sub

Tu est en train de creer un assistant ? Si il comporte beaucoup d'etapes, la
creation de composants a la volee risque de devenir un gros casse-tete a
force...

Pour simplifier la chose tu pourrais creer une form de base comportant tous
les elements communs a chaque etape de l'assistant (Texte d'introduction, le
numero de l'etape, boutons suivant, precedent, annuler...)

Ensuite tu pourrais creer dans cette form de methodes/proprietes communes a
toutes les etapes:
la methode qui annule l'assistant, les evenements qui signalent a
l'exterieur de la form qu'on passe a l'etape suivante, un evenement qui
indinque que l'on annule l'assistant

Une fois ta form "moule" terminee, cree une form pour chaque etape qui
herite de la form de base, ajoute-y les controles et le code specifiques a
l'etape

Une fois que toutes tes forms sont pretes, cree une classe qui va les
piloter toutes:
- cette classe va creer et stocker toutes les references des forms etape,
dans un arraylist par exemple
- elle capte les evenements renvoyes par les forms etapes, quand
l'utilisateur clique sur le bouton "suivant", la form etape execute le code
qui lui est propre puis renvoie cet evenement a la classe pilote qui saura
qu'elle doit cacher la form en cours et afficher la form suivante. Idem pour
le bouton annuler: la form etape annule les action qu'elle a bien pu faire
(si elle a ouvert un fichier, elle le referme par ex) puis l'evenement est
passe a la classe pilote qui va annuler toutes les actions qui ont ete
effectuees par les forms precedentes

Bon, c'est juste pour donner une vague idee, et ce n'est qu'une maniere de
gerer les choses parmi d'autres, mais cette methode est tres souple. Je peux
essayer de trouver des exemples concrets de code sur le net si ca
t'interesse (je crois pas en avoir vu)
Avatar
Yan
Piotrek, t'es trop fort ! merci !

Et moi qui classais tout pour faire propre, alors qu'il faut faire la
déclaration à l'extérieur du Sub dans ma classe. J'avais tout faux.

Je souhaites en effet faire un assistant de premier lancement de mon petit
programme, qui demande à l'utilisateur quelques informations, lui permettant
de personnaliser l'application avant de l'utiliser. Il n'y a pas énormément
d'étapes, mais ta méthode a l'air bien, et si tu as sous le coude un exemple
concret, je suis preneur. J'avais aussi pensé à faire un "frame" que
j'aurais enrichi dynamiquement par des labels, textbox, ... et que j'aurais
pu supprimer afin de ne plus voir son contenu, et recréé à volonté, mais je
ne sais pas joindre à un "frame" des controls de façon dynamique.

Ah, j'oubliais, le framework a l'air sensible, j'ai du enlever les
parenthèses à la fin des lignes :

Dim frm_premier_lancement As Form
Dim texte_de_bienvenue as Label

Merci encore pour ton aide :-)

Amicalement,
Yan



-----------------------------
"Piotrek" a écrit dans le message de
news:
Il faut declarer frm_premier_lancement et texte_de_bienvenue au niveau de


ta
classe ou de ta form:

Dim frm_premier_lancement As Form()
Dim texte_de_bienvenue as Label()

Public Sub creation_premier_lancement()
' Création de la fenêtre :
frm_premier_lancement = New Form()
......
texte_de_bienvenue = new Label()
.....

Public Sub suppression(sender As Object, e As EventArgs)
frm_premier_lancement.Controls.Remove(texte_de_bienvenue)
End Sub

Tu est en train de creer un assistant ? Si il comporte beaucoup d'etapes,


la
creation de composants a la volee risque de devenir un gros casse-tete a
force...

Pour simplifier la chose tu pourrais creer une form de base comportant


tous
les elements communs a chaque etape de l'assistant (Texte d'introduction,


le
numero de l'etape, boutons suivant, precedent, annuler...)

Ensuite tu pourrais creer dans cette form de methodes/proprietes communes


a
toutes les etapes:
la methode qui annule l'assistant, les evenements qui signalent a
l'exterieur de la form qu'on passe a l'etape suivante, un evenement qui
indinque que l'on annule l'assistant

Une fois ta form "moule" terminee, cree une form pour chaque etape qui
herite de la form de base, ajoute-y les controles et le code specifiques a
l'etape

Une fois que toutes tes forms sont pretes, cree une classe qui va les
piloter toutes:
- cette classe va creer et stocker toutes les references des forms etape,
dans un arraylist par exemple
- elle capte les evenements renvoyes par les forms etapes, quand
l'utilisateur clique sur le bouton "suivant", la form etape execute le


code
qui lui est propre puis renvoie cet evenement a la classe pilote qui saura
qu'elle doit cacher la form en cours et afficher la form suivante. Idem


pour
le bouton annuler: la form etape annule les action qu'elle a bien pu faire
(si elle a ouvert un fichier, elle le referme par ex) puis l'evenement est
passe a la classe pilote qui va annuler toutes les actions qui ont ete
effectuees par les forms precedentes

Bon, c'est juste pour donner une vague idee, et ce n'est qu'une maniere de
gerer les choses parmi d'autres, mais cette methode est tres souple. Je


peux
essayer de trouver des exemples concrets de code sur le net si ca
t'interesse (je crois pas en avoir vu)