Vb.Net Supprimer plusieurs LineShape [Résolu]

Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 3 oct. 2016 à 00:20 - Dernière réponse : cs_Le Pivert 4776 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention
- 6 oct. 2016 à 13:15
Bonjour ou Bonsoir,
avec l'aide de vb95
j'ai pu corriger mon code qui me permet de créer plusieurs lignes
après avoir utiliser les lignes je veux les supprimées en cliquant sur un autre bouton et pour créer des nouveaux lignes (un nombre différent de lignes)
mais j'arrive pas supprimer les lignes, j'ai bien essais :
If Me.Controls.ContainsKey("yourline1") Then
Me.Controls.RemoveByKey("yourline1")
End If

ou
If canvas.Shapes.Contains("yourline1") Then
canvas.Shapes.Remove("yourline1")
End If

ou aussi
 canvas.Shapes.Clear()

mais rien ne marche
voici le code :
Imports Microsoft.VisualBasic.PowerPacks
Public Class Form1
Dim a As Integer = 1
Dim nbr_lignes As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
canvas.Parent = Me
nbr_lignes = TextBox1.Text
For a = 1 To nbr_lignes
Dim yourline As New LineShape(100, (a * 100), 300, (a * 100))
yourline.Parent = canvas
Next
End Sub
End Class
Afficher la suite 

26 réponses

Répondre au sujet
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - Modifié par vb95 le 3/10/2016 à 01:01
+1
Utile
1
Bonjour Karin.code
Bien que le code suivant est correct


Imports Microsoft.VisualBasic.PowerPacks
Public Class Form1
Dim a As Integer = 1
Dim nbr_lignes As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
canvas.Parent = Me
nbr_lignes = TextBox1.Text
For a = 1 To nbr_lignes
Dim yourline As New LineShape(100, (a * 100), 300, (a * 100))
yourline.Parent = canvas
Next
End Sub
End Class


remplace le par celui-ci


Imports Microsoft.VisualBasic.PowerPacks
Public Class Form1
Dim nbr_lignes As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
canvas.Parent = Me
nbr_lignes = TextBox1.Text
For i = 0 To nbr_lignes -1
Dim yourline As New LineShape(100, ((i+1) * 100), 300, ((i+1) * 100))
yourline.Parent = canvas
Next
End Sub
End Class


- les variables de boucle sont souvent i et j : c'est une habitude à prendre .
- de plus en informatique on compte à partir de 0 . donc
for i = 1 to nbr_lignes

devient
for i = 0 to nbr_lignes - 1

Si tu manipules des tableaux ou des collections tu me diras merci !

- cette ligne est incorrecte
 nbr_lignes  = TextBox1.Text

nbr_lignes est une variable Integer et la Textbox contient une valeur String
Mets à la place
 nbr_lignes  = Convert.ToInt32(TextBox1.Text)


Dans les propriétés de tous tes projets mets toujours Option Strict et Option Explicit sur ON ( voir l'onglet Compiler)
L'un t'oblige à déclarer toutes tes variables et l'autre évite les conversions implicites

Pour ton problème je verrai demain

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Cette réponse vous a-t-elle aidé ?  
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 3 oct. 2016 à 10:26
Merci vb95
Je vais appliquer tes conseilles un par un
Commenter la réponse de vb95
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - Modifié par vb95 le 4/10/2016 à 02:32
+1
Utile
Bonsoir Karin.code et kikou93
Au cas où tes lignes sont dessinées dans une Picturebox
Pour effacer le contenu d'une PictureBox tu peux faire

Picturebox1.Image = Nothing
Picturebox1.refresh()


En plus Microsoft.VisualBasic.PowerPacks est un dll Vb6 . Ce n'est pas très performant de mélanger du VB 6 avec du VB Net . Il y a longtemps que je ne me sers plus de l'imports de Microsoft.VisualBasic et de ses dérivés ( dont PowerPacks)

Peux-tu expliquer clairement dans quoi tu dessines et ce que tu veux dessiner ? La méthode Draw en VB net est bien plus performante
Une solution plus adéquate devrait être possible à mettre en œuvre !
Salutations à vous


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de vb95
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 5 oct. 2016 à 10:39
+1
Utile
4
Bonjeur vb95,

Désolé de ne pas t'avoir répondu hier j'ai pas pu me connecter

une boucle pour dessiner les 18 rectangles

Je préfère créer des lignes ça sera beaucoup mieux

détermines tu les différentes lignes à y dessiner pour chaque dessin ? 
Y-a-t'il un fichier pour le dessin en haut à gauche par exemple ?

Je vais t'expliquer ce que veux faire
1) Je calcul la longueur de la première linge (elle sera horizontale) et je dessin cette dernier

2) Je choisi le nombre de ligne au dessus de la 1er linge (je peux choisir si il y a le même espace entre eux ou non, je peux les entrer manuellement pour chaque ligne)

bien sûr les lignes horizontales en tous la même longueur
3) Même procédure a suivre pour les lignes verticales

La méthode Draw en VB net est bien plus performante 
Une solution plus adéquate devrait être possible à mettre en œuvre

Quand tu a écrit ça j'ai fait quelque petite recherche et je trouver le code suivant :
 Dim g As Graphics
g = Me.PictureBox1.CreateGraphics
Dim p As Pen = New Pen(Color.Green, 2)
p.DashStyle = Drawing2D.DashStyle.Solid
g.DrawLine(p, X1, Y1, X2, X2)

je crois que ce code répond a tout les conditions pour dessiner ce que je veux
je peux choisir la couleur et l'épaisseur
Dim p As Pen = New Pen(Color.Green, 2)

et le type de ligne
p.DashStyle = Drawing2D.DashStyle.Solid 

Comment ça marche c'est cool! 
      1000 Merci les Amis
Cette réponse vous a-t-elle aidé ?  
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention - 5 oct. 2016 à 11:00
Pour le Triangle du dessin qui est à dois tu peux utiliser le code suivant
 Dim Graph As Graphics
Graph = Me.PictureBox1.CreateGraphics
Dim paint As Pen = New Pen(Color.Green, 2)
paint.DashStyle = Drawing2D.DashStyle.Solid
Graph.DrawLine(paint, X1, Y1, X2, Y2)
Graph.DrawLine(paint, X1, Y1, X2/2, Y3)
Graph.DrawLine(paint, X2/2, Y3, X2, Y2)
End Sub

Car on ne peux pas dessiner un triangle directement
Bonne courage pour la suite
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 5 oct. 2016 à 11:12
Merci Vb95 et Kikou93 vous m'avez beaucoup aidé (un petite peu trop à mon goût lol)

Merci infiniment
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention > Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 5 oct. 2016 à 11:48
C'est exactement ce que j'allais te proposer Karin.code
Si je t'ai trop aidé je t'enverrai la facture lol !
Bonne fin de semaine à toi

Pour kikou 93
Tu as écrit : Car on ne peux pas dessiner un triangle directement
Si on peut :

Public Sub DrawLinesPoint(ByVal e As PaintEventArgs)

' Create pen.
Dim blackPen As New Pen(Color.Black, 3)

' Create array of points that define lines to draw.
Dim points As Point() = {New Point(10, 10), New Point(10, 100), _
New Point(200, 50), New Point(250, 300)}

'Draw lines to screen.
e.Graphics.DrawLines(blackPen, points)
End Sub


On crée un tableau de points à relier et on appelle la méthode DrawLines
Pour le triangle il faut spécifier 4 points ( P1, P2, P3 et à nouveau P1 pour avoir les 3 côtés : P1-P2 , P2-P3 et P3-P1
Le code en exemple ne dessine pas un triangle par contre
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention > vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 12:22
Ah oui, je ne savais pas
on apprend tous les jours une nouvelle chose ici
Merci Vb95
Commenter la réponse de Karin.code
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention - 3 oct. 2016 à 15:13
0
Utile
2
Bonjour vb95 et Karin.code
Je ne c'est pas si je peux dire que c'est une solution
par exemple si tu créer un certains nombre de ligne au dessus de la PictureBox avec ton code

après tu clique sur le bouton supprimer qui contient le code suivant :
PictureBox1.Invalidate()
les lignes sont effacés

après tu change le nombre de ligne a crée
les nouveaux lignes s'affichent sans les ancien
mais il y a des petites lignes qui s'affiche comme le montre l'image suivante
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 3 oct. 2016 à 22:08
Merci Kikou93
c'est un bon solution, je vais l'utiliser pour l'instant, mais j'aimerais trouver une solution qui supprime les lignes définitivement (sans laisser des traces)
Merci pour ton aide kikou93
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention > Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 3 oct. 2016 à 23:13
De rien
si je trouve une meilleur solution je te tiendrai en courant
Bon courage
Commenter la réponse de kikou93
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 4 oct. 2016 à 10:48
0
Utile
1
Bonjour vb95,

ce que je veux créer ce sont des dessins de Génie Civil (aussi de
charpente métallique)
Par exemple :

il y a beaucoup d'autre
la PictureBox est juste un arrière plan ( Les lignes de doivent pas dépasser les limites de la PictureBox)
mais si dessin sur la Picturebox et mieux,alors peux-tu m'expliquer la méthode de dessiner une seul ligne et je me débrouille pour la suite
Merci
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 4 oct. 2016 à 13:37
Bonjour
je te réponds de puis mon téléphone portable !

La Picturebox n'est pas l'arrière-plan : c'est le conteneur ( elle contient tes dessins) .
Avec la méthode Draw tu peux :
- dessiner une ligne
- dessiner un rectangle, un carré
- une ellipse ou un cercle
choisir l'épaisseur du trait , sa couleur et bien d'autres choses

Prends ton dessin en haut à gauche
- une boucle pour dessiner les 18 rectangles
- une boucle pour dessiner les 7 pieds et leurs socles ( 2 lignes à dessiner)

Pour la double boucle une seule instruction Draw
Pour le seconde boucle il en faut 2 : une pour le pied une pour le socle

Maintenant tu parles de créer : au début tu as une PictureBox vide . Comment détermines tu les différentes lignes à y dessiner pour chaque dessin ?
Y-a-t'il un fichier pour le dessin en haut à gauche par exemple ?
Commenter la réponse de Karin.code
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention - Modifié par kikou93 le 5/10/2016 à 10:35
0
Utile
Moi aussi je croix que la méthode Draw est mieux je l'ai utilisé dans un de mes projets
Commenter la réponse de kikou93
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 5 oct. 2016 à 12:02
0
Utile
8
Bonjour

tu peux utiliser la methode DrawPolygon pour dessiner un triangle
https://msdn.microsoft.com/fr-fr/library/dd0c4s09(v=vs.110).aspx
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention > vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 16:17
Bonjour vb95

Le problème est le paramètre e de la sub

En fin le problème est plutot du coté du codeur
normalement on appelle les sub graphiques dans l'event paint sur
lequel on dessine et on se sert du pararametre e As PaintEventArgs de
l'event paint passé en parametre à la sub
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention > cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - 5 oct. 2016 à 16:25
Merci cs-ShayW de cette précision
bien le bonjour à toi
kikou93 384 Messages postés mardi 4 février 2014Date d'inscription 26 août 2017 Dernière intervention > vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 16:39
Il y a aussi cette possibilité
Dim AfficherTrait As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
AfficherTrait = True
PictureBox1.Invalidate()
End Sub
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
If AfficherTrait = True Then
Dim blackPen As New Pen(Color.Black, 3)
Dim point1 As New Point(50, 50)
Dim point2 As New Point(100, 25)
Dim point3 As New Point(150, 200)
Dim point4 As New Point(50, 50)
Dim curvePoints As Point() = {point1, point2, point3, point4}
e.Graphics.DrawPolygon(blackPen, curvePoints)
End If
End Sub

mais personnellement je préfère celle de cs_Le Pivert
cs_Le Pivert 4776 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention > vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 16:54
VB95, il y a une erreur sur cette ligne:

 ' Draw polygon to screen.
g.Graphics.DrawPolygon(blackPen, curvePoints)


comme ceci:

 ' Draw polygon to screen.
        g.DrawPolygon(blackPen, curvePoints)


@+
vb95 1388 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention > cs_Le Pivert 4776 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 17:45
salut cs_Le Pivert
exact merci

au message 17 modifier

g.Graphics.DrawPolygon(blackPen, curvePoints)

par

g..DrawPolygon(blackPen, curvePoints)
Commenter la réponse de cs_ShayW
cs_Le Pivert 4776 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - 5 oct. 2016 à 16:02
0
Utile
Bonjour à tous,

Comme ceci:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim g As Graphics
        g = PictureBox1.CreateGraphics
        ' Create pens
        Dim greenPen As New Pen(Color.Green, 2)
        Dim redPen As New Pen(Color.Red, 2)
        ' Create points for polygon.
        Dim p1 As New PointF(40.0F, 50.0F)
        Dim p2 As New PointF(60.0F, 70.0F)
        Dim p3 As New PointF(80.0F, 34.0F)
        Dim p4 As New PointF(120.0F, 180.0F)
        Dim p5 As New PointF(200.0F, 150.0F)
        Dim ptsArray As PointF() = {p1, p2, p3, p4, p5}
        ' Draw polygon
        g.DrawPolygon(greenPen, ptsArray)
        ' Dispose
        greenPen.Dispose()
        redPen.Dispose()
    End Sub


Si on veut le mettre sur le Form on remplace PictureBox par Me
Commenter la réponse de cs_Le Pivert
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 5 oct. 2016 à 16:46
0
Utile
Merci tout le monde
Merci infiniment pour votre aide
Commenter la réponse de Karin.code
cs_Le Pivert 4776 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 15 décembre 2017 Dernière intervention - Modifié par cs_Le Pivert le 6/10/2016 à 13:48
0
Utile
Je me suis amusé a faire un exemple avec une étoile et un autre avec un triangle, un rectangle et des lignes croisées:

Option Strict On
Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim g As Graphics
        Dim _y As Integer = 0 'position Top dans la pictureBox
        Dim _x As Integer = 0 'position Left dans la pictureBox
        g = PictureBox1.CreateGraphics
        ' Create pens
        Dim greenPen As New Pen(Color.Green, 2)
        Dim redPen As New Pen(Color.Red, 2)
        ' Créons les points qui définissent l'étoile: tourne dans le sens inverse des aiguilles d'une montre.
        Dim point1 As New Point(_y + 210, _x) 'A pointe supérieure
        Dim point2 As New Point(_y + 165, _x + 100) 'B
        Dim point3 As New Point(_y + 50, _x + 100) 'C pointe
        Dim point4 As New Point(_y + 150, _x + 170) 'D
        Dim point5 As New Point(_y + 100, _x + 280) 'E pointe
        Dim point6 As New Point(_y + 210, _x + 220) 'F
        Dim point7 As New Point(_y + 320, _x + 280) 'G pointe
        Dim point8 As New Point(_y + 280, _x + 170) 'H
        Dim point9 As New Point(_y + 350, _x + 100) 'I pointe
        Dim point10 As New Point(_y + 250, _x + 100) 'J
        Dim ptsArray As Point() = {point1, point2, point3, point4, _
        point5, point6, point7, point8, point9, point10}
        ' Draw polygon
        g.DrawPolygon(redPen, ptsArray)
        ' Dispose
        greenPen.Dispose()
        redPen.Dispose()
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim g As Graphics
        Dim _y As Integer = 10 'position Top dans la pictureBox
        Dim _x As Integer = 10 'position Left dans la pictureBox
        g = PictureBox1.CreateGraphics
        ' Create pens
        Dim redPen As New Pen(Color.Red, 2)
        Dim point1 As New Point(_y + 100, _x) 'A pointe supérieure
        Dim point2 As New Point(_y, _x + 150) 'B
        Dim point3 As New Point(_y + 200, _x + 150) 'C
        Dim rect As New Rectangle(_x, _y + 150, 200, 150)
        Dim curvePoints As Point() = {point1, point2, point3}
        ' Draw polygon
        g.DrawPolygon(redPen, curvePoints)
        g.DrawRectangle(redPen, rect)
        'lignes horizontales
        g.DrawLine(redPen, _x, _y + 200, 210, 210) '_x = pointleft départ, _y pointTop départ, longueur ligne, fin de ligne Top
        g.DrawLine(redPen, _x, _y + 250, 210, 260)
        'lignes verticales
        g.DrawLine(redPen, _x + 50, _y + 300, 60, 160)
        g.DrawLine(redPen, _x + 100, _y + 300, 110, 160)
        g.DrawLine(redPen, _x + 150, _y + 300, 160, 160)
        ' Dispose
        redPen.Dispose()
    End Sub
End Class


Si l'on veut modifier les points _x et _y par rapport à la PictureBox, voir les différences ici:

  Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Dim g As Graphics
        Dim _y As Integer = 0 'position Top dans la pictureBox
        Dim _x As Integer = 0 'position Left dans la pictureBox
        g = PictureBox1.CreateGraphics
        ' Create pens
        Dim redPen As New Pen(Color.Red, 2)
        Dim point1 As New Point(_y + 100, _x) 'A pointe supérieure
        Dim point2 As New Point(_y, _x + 150) 'B
        Dim point3 As New Point(_y + 200, _x + 150) 'C
        Dim rect As New Rectangle(_x, _y + 150, 200, 150)
        Dim curvePoints As Point() = {point1, point2, point3}
        ' Draw polygon
        g.DrawPolygon(redPen, curvePoints)
        g.DrawRectangle(redPen, rect)
        'lignes horizontales
        g.DrawLine(redPen, _x, _y + 200, 200, 200) '_x = pointleft départ, _y pointTop départ, longueur ligne, fin de ligne Top
        g.DrawLine(redPen, _x, _y + 250, 200, 250)
        'lignes verticales
        g.DrawLine(redPen, _x + 50, _y + 300, 50, 150)
        g.DrawLine(redPen, _x + 100, _y + 300, 100, 150)
        g.DrawLine(redPen, _x + 150, _y + 300, 150, 150)
        ' Dispose
        redPen.Dispose()
    End Sub


Voilà bonne programmation




@+ Le Pivert
Commenter la réponse de cs_Le Pivert

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.