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.
Version imprimable
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: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: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: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: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:
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:
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:
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:
1
2
3
4
5Private 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:
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 ! :D
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.Citation:
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:Public Property currentPcb As PictureBox
Du coup côté form principal tu accèdes à la propriété CurrentPcb comme suit :Code:CurrentPcb = etic
ensuite tu supprimes ton contrôle en utilisant :Code:dlg.currentPcb
Code: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:
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:
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+
Et bien merci pour tout vraiment... !
Je vais suivre tes conseils c'est vrai que je pars tête baissée.
En tout cas tu m'as été d'une très grande aide.
Bonne journée à toi !