Bonjour,
Je veux créer une picturebox de façon dynamique lors d'un clique sur un bouton sur mon winform mais permettant à l'utilisateur de choisir la dimension de celle ci (width, height). Quel est la méthode à utilisée ?
Merci d'avance.
Bonjour,
Je veux créer une picturebox de façon dynamique lors d'un clique sur un bouton sur mon winform mais permettant à l'utilisateur de choisir la dimension de celle ci (width, height). Quel est la méthode à utilisée ?
Merci d'avance.
Bonsoir,
Lorsqu'on créé un objet dynamiquement on doit se soucier de ce qui suit :
Q : Comment instancier un objet dynamiquement ?
R : Pour une PictureBox :
Q : Comment définir des dimensions à un objet qui le permet ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim TON_CONTROL as new pictureBox
R : On lui définie ses dimensions via sa propriété "Size" :
Q : Ou sera t-il placé ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TON_CONTROL.Size = New size(48,48)
R : sur ton formulaire principal à des coordonnées bien précises :
Q : Comment l'ajouter au form principal ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part TON_CONTROL.location = New size(10,10)
R : En utilisant la méthode ".add" de la propriété "Controls" de Form1 :
NB : Il est probable qu'il y ai plusieurs contrôles de ce même type sur ton formulaire principal alors il serait judicieux de pouvoir les identifier si tu souhaites travailler avec individuellement ! Il faudra alors utiliser la propriété ".tag" de chaque Objet que tu instancieras de la classe PictureBox ou définir des noms uniques via la propriété ".name". La mise en place d'une variable d'incrémentation (increment as integer) avec une portée de classe permettrait d'obtenir le résultat escompté !
Code : Sélectionner tout - Visualiser dans une fenêtre à part Form1.controls.add(TON_CONTROL)
Bonne lecture.
Merci de ta réponse, jusque là nous sommes d'accord, j'ai déjà essayé quelque chose mais qui ne fonctionne pas.
Sur le Form principal lors d'un clic sur un bouton :
Sur le Form Dimensions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 'Création de la variable de l'étiquette Dim Etic As New PictureBox() Public Width1 As Integer Public Height1 As Integer 'Propriétés de l'étiquette Dimensions.Show() If Dimensions.BT_VALIDER.DialogResult = Windows.Forms.DialogResult.OK Then Me.Etic.Location = New Drawing.Point(500, 250) Me.Etic.Size = New Size(Width1, Height1) Me.Etic.Visible = True Me.Etic.BackColor = Color.White Me.Etic.BorderStyle = BorderStyle.FixedSingle End If 'Ajout du controle de l'étiquette Me.Controls.Add(Etic)
Comme tu peux le voir, lors du clic sur le bouton, ça m'affiche un form Dimensions où l'utilisateur peut rentrer les dimensions de la picturebox Largeur et hauteur et lors du clic sur valider si c'est bien une valeur numérique et s'il y a bien quelque chose, ces valeurs sont affectées aux variables public Width1 et Height1 créées dans mon form principal puis envoyées à la propriété Size de la picturebox. Mais ça ne fonctionne pas. Qu'est ce qui ne va pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Private Sub BT_VALIDER_Click(sender As System.Object, e As System.EventArgs) Handles BT_VALIDER.Click If Verification() Then Form_principal.Width1 = Me.TB_LARGEUR.Text Form_principal.Height1 = Me.TB_HAUTEUR.Text Me.Close() Else Me.LBL_ERREUR.Visible = True End If End Sub ''' <summary> ''' Vérifie les deux textbox de la page, regarde si elles sont remplies et si des nombres ont été entrés ''' </summary> ''' <returns>Vrai si pas d'erreur, faux si une erreur</returns> ''' <remarks></remarks> Function Verification() As Boolean Dim Bon As Boolean = True If Me.TB_LARGEUR.Text Is Nothing Or Not IsNumeric(Me.TB_LARGEUR.Text) Then Bon = False End If If Me.TB_HAUTEUR.Text Is Nothing Or Not IsNumeric(Me.TB_HAUTEUR.Text) Then Bon = False End If Return Bon End Function
Merci d'avance
Bonjour,
Je n'avais pas compris que tu laissais l'utilisateur saisir les dimensions dans un autre formulaire ! ...brefff....
Il faut que tu te penches sur certaines notions avant de poursuivre ton codage :
- la création d'un constructeur puis ajout d'arguments dans sa signature
- le passage de paramètres entre formulaires
D'autres points :
- Pourquoi ne pas utiliser, éventuellement, une boite de dialogue en lieu et place de ton form dimensions ? (dans ton post tu dis que c'est un form !)
- Attention, lorsque tu appelles la méthode ".Show" de ton form dimensions, l'user peut continuer à travailler sur ton form principal, à mon sens il faut que cette action d'appel soit bloquante donc préfères utiliser ".ShowDialog" !
- Pourquoi déclarer et instancier un objet sur ton form principal si au final l'utilisateur ne valide pas l'ajout depuis ton form dimensions (objet instancié non utilisé = fuite mémoire) ??
Concrètement il faudrait :
- Créé une boite de dialogue "dimensions" en ajoutant un constructeur qui accepte en argument le form principal. Dans cette même boite de dialogue, tu ajoutes un champs de portée classe de type form1 :
- L'appel depuis le form principal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Imports System.Windows.Forms Public Class PcbCreator Private frmMain As Form1 Sub New(frm As Form1) frmMain = frm ' Cet appel est requis par le concepteur. InitializeComponent() ' Ajoutez une initialisation quelconque après l'appel InitializeComponent(). End Sub Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click If Verification() Then Dim Etic As New PictureBox() Etic.Location = New Drawing.Point(500, 250) Etic.Size = New Size(CInt(TextBox1.Text), CInt(TextBox2.Text)) Etic.Visible = True Etic.BackColor = Color.White Etic.BorderStyle = BorderStyle.FixedSingle frmMain.Controls.Add(Etic) Me.DialogResult = System.Windows.Forms.DialogResult.OK Me.Close() Else 'On place ici une excpetion messageBox qui dit que les dimensions sont incorrectes...etc... End If End Sub Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click Me.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Close() End Sub Private Function Verification() As Boolean ' Ta fonction qui permet de vérifier que les dimensions sont en corrélation avec ton form principal ' ATTENTION : Il faut utiliser la variable frmMain pour récupérer ses dimensions en tps réel !! ' Je mets Return True pour montrer que l'exemple fonctionne ! Return True End Function End Class
Je ne prétends pas que ce soit la meilleure solution car il existe d'autres alternatives mais c'est pour te donner une idée de départ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim dlg = New PcbCreator(Me) dlg.ShowDialog() End Sub
Dans la mesure du possible on épargne un max la surcharge du form principal de la partie fonctionnelle à proprement dit. On découpe le problème et on créé des classes.
Bonne lecture .
A+
Je te remercie beaucoup ça marche ! Dernière question, si je clique sur un bouton fermer je veux que la picturebox soit supprimée. Avant ça fonctionnait mais vu que la création de la picturebox est dans un autre fichier comment faire ?
Et il y a une partie que j'ai pas compris :
A quoi sert cette partie ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Private frmMain As Form1 Sub New(frm As Form1) frmMain = frm ' Cet appel est requis par le concepteur. InitializeComponent() ' Ajoutez une initialisation quelconque après l'appel InitializeComponent(). End Sub
En tout cas parfait Merci encore !![]()
Bonjour,
J'ai pourtant été bien clair la dessus dans un précédent post :
C'est l'essence même de la POO qu'il faut que tu arpentes avant de vouloir poursuivre la programmation avec ce langage Objet.Il faut que tu te penches sur certaines notions avant de poursuivre ton codage :
- la création d'un constructeur puis ajout d'arguments dans sa signature
- le passage de paramètres entre formulaires
Brefff cette partie permet de passer un argument depuis ton form principal au constructeur de ta classe "PcbCreator".... tu pourrais procéder autrement en faisant référence au form1 depuis ton form PcbCreator afin d'accéder à la propriété size mais c'est une mauvaise pratique et tu te rendras compte par la suite que cela deviendra très rapidement impossible à gérer avec les contraintes liées aux instances...... (je m'égards.....)......
Si tu veux pouvoir supprimer l'objet que tu as créés alors tu peux ajouter une propriété CurrentPcb de type PictureBox dans ta classe "PcbCreator" :
Enfin lorsque l'user valide son choix d'ajouter le controle à ton form principal alors tu affectes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Public Property currentPcb As PictureBox
Du coup côté form principal tu accèdes à la propriété CurrentPcb comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part CurrentPcb = etic
ensuite tu supprimes ton contrôle en utilisant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part dlg.currentPcb
Code : Sélectionner tout - Visualiser dans une fenêtre à part Controls.Remove(TON_CONTROL)
Mais là ça devient de la vraie bidouille car en découvrant au fur et à mesure les besoins liés à ton programme, je n'aurais finalement pas procédé de la sorte !!
La bidouille modifiée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Public Class Form1 Private dlg As PcbCreator Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click dlg = New PcbCreator(Me) dlg.ShowDialog() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If Not dlg Is Nothing AndAlso Not dlg.currentPcb Is Nothing Then Controls.Remove(dlg.currentPcb) End If End Sub End Class
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 Imports System.Windows.Forms Public Class PcbCreator Public Property currentPcb As PictureBox Private frmMain As Form1 Sub New(frm As Form1) frmMain = frm ' Cet appel est requis par le concepteur. InitializeComponent() ' Ajoutez une initialisation quelconque après l'appel InitializeComponent(). End Sub Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click If Verification() Then Dim Etic As New PictureBox() Etic.Location = New Drawing.Point(500, 250) Etic.Size = New Size(CInt(TextBox1.Text), CInt(TextBox2.Text)) Etic.Visible = True Etic.BackColor = Color.White Etic.BorderStyle = BorderStyle.FixedSingle frmMain.Controls.Add(Etic) currentPcb = Etic DialogResult = System.Windows.Forms.DialogResult.OK Close() Else 'On place ici une excpetion messageBox qui dit que les dimensions sont incorrectes...etc... End If End Sub Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click DialogResult = System.Windows.Forms.DialogResult.Cancel Close() End Sub Private Function Verification() As Boolean Return True End Function End Class
Mais au risque de me répéter, j'insiste sur le fait qu'il faut faire de l'ouvrage de Mr LASSERRE Philippe ton livre de chevet.
A+
Partager