Geen picture/wel picture

Status
Niet open voor verdere reacties.

jan68

Gebruiker
Lid geworden
19 apr 2012
Berichten
90
Ik zit met het volgende probleem:
Ik heb een menu gemaakt waardoor ik verschilden wegen binnen het programma kan volgen (iets wat je veel ziet)
via dit menu kan je een picturebox oproepen die gevuld word met een tekening of tekeningen die door middel van X en Y coordinaten uit een file worden opgebouw
nu doet zich het volgende probleem voor:
als ik het programma opstart en de picturebox vult met de tekeningen zie ik wel dat de tekeningen wel gemaakt zijn in een flits maar ik zie ze niet ,de picturebox is (weer) blank
als ik nu weer de picturebox via het menu aanroep zie ik wel de gehele tekening
Het is net of de eerste maal alles geclean'd wordt
heb divr.dingen al geprobeerd zoals :(me.) refresch : picturebox invalidate () maar tot op heden geen resultaat
wie kan mij helpen ???
gr John
 
hallo joz1
Private Sub loadprofiel()
Dim App_path As String
App_path = System.IO.Path.GetDirectoryName(Application.ExecutablePath)

Dim filenaam As String
Dim invfilenaam As String
profielnaam = "A18SM.COO"
filenaam = App_path & "\COOR\" & profielnaam
invfilenaam = App_path & "\INV\" & Replace(profielnaam, "COO", "Inv")

Dim parser0 As New TextFieldParser(filenaam)
Dim naam As String
Dim NI As Integer
Dim XI(200) As Double
Dim YI(200) As Double
Dim X1 As Integer
Dim X2 As Integer
Dim Y1 As Integer
Dim Y2 As Integer
Dim I As Integer
Dim G As Graphics = PictureBox2.CreateGraphics()

naam = parser0.ReadLine
NI = parser0.ReadLine.ToString
parser0.Delimiters = New String() {" "}
For I = 1 To NI
Dim velden() As String = parser0.ReadFields
XI(I) = Double.Parse(CStr(velden(0)), New Globalization.CultureInfo("en-us"))
YI(I) = Double.Parse(CStr(velden(1)), New Globalization.CultureInfo("en-us"))
Next
For I = 1 To NI - 1
X1 = 54 + XI(I) * 490
Y1 = 350 + YI(I) * -490
X2 = 54 + XI(I + 1) * 490
Y2 = 350 + YI(I + 1) * -490
G.DrawLine(Pens.Black, X1, Y1, X2, Y2)
Next I

Dim ZI(200) As Double
Dim d(200) As Double
Dim parser1 As New TextFieldParser(invfilenaam)
Dim leeg As String
Dim npoint As Integer
Dim reynoldsgetal As Integer
leeg = parser1.ReadLine
naam = parser1.ReadLine
NI = parser1.ReadLine
reynoldsgetal = parser1.ReadLine
npoint = parser1.ReadLine

For j = 1 To npoint
leeg = parser1.ReadLine
For I = 1 To NI
ZI(I) = Double.Parse(CStr(parser1.ReadLine), New Globalization.CultureInfo("en-us"))
Next
For I = 1 To NI - 1
X1 = 54 + 160 * XI(I) * 3
Y1 = 250 + 160 * ZI(I) / 3.2
X2 = 54 + 160 * XI(I + 1) * 3
Y2 = 250 + 160 * ZI(I + 1) / 3.2
G.DrawLine(Pens.Blue, X1, Y1, X2, Y2)
Next I
Next j

tot zover de code misschien zie jij iets wat ik over het hoofd zie
gr john
 
Misschien G.Dispose() neerzetten?

Stuur mij eens zo'n .COO-bestand, dan kan ik wat dingen uitproberen.
 
Hallo Joz1
Helaas g.dispose() is ook de oplossing niet
Ik zou hier op het forum .COO bestand neer kunnen zetten ,maar helaas bestaat dat uit soms honderden regels met getallen voor de X en Y waarde
Het zou teveel plaats innemen en verders geen bijdragen opleveren tot de oplossing ..... lijkt mij.
voorbeeld X. Y.
1.00000 0.00000
0.99985 0.00078
0.99950 0.00102 enz. enz tot honderd of meer regels
Het lijken ook Double's te zijn ,alleen staat er een punt en geen comma van daar de omzetting amerikaanse/nederlands

Het blijk dat een picturebox in runtime pas aan het einde van de code wordt afgesloten zodat alle gegevens niet zichtbaar zijn op deze manier.
Een ander mogelijkheid bestaat uit om de paint event of de bitmap via .Image toe te voegen ik hoop dat je begrijpt wat ik bedoeld
we blijven door ploeteren
GRT john
 
hallo Joz1
ik heb een redelijke oplossing gevonden (denk ik) moet het nog verder uit werken
Alleen wordt de picturebox in run-time geplaats of het Formulier
ik had dat anders gezien
Code:
Imports System.IO
Imports System.IO.Directory
Imports System.Data.SqlClient
Imports Microsoft.VisualBasic.FileIO
Imports System.Windows.Forms
Imports System.Globalization
Imports System.Drawing
Imports System.Drawing.Drawing2D
Public Class Form1
    ' to the Load event of the form.
    Private pictureBox1 As New PictureBox()

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        pictureBox1.Location = New Point(48, 48)
        pictureBox1.Height = 440
        pictureBox1.Width = 660
        pictureBox1.BorderStyle = BorderStyle.Fixed3D
        pictureBox1.BackColor = Color.White
        pictureBox1.Image = Image.FromFile("D:\visual studio 2010\Bitmap0.bmp")

        ' Connect the Paint event of the PictureBox to the event handler method.
        AddHandler pictureBox1.Paint, AddressOf Me.pictureBox1_Paint
        ' Add the PictureBox control to the Form.
        Me.Controls.Add(pictureBox1)
    End Sub 'Form1_Load

    Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
        ' Create a local version of the graphics object for the PictureBox.
        Dim g As Graphics = e.Graphics
        Dim App_path As String
        App_path = System.IO.Path.GetDirectoryName(Application.ExecutablePath)


        Dim filenaam As String
        Dim profielnaam As String
        Dim invfilenaam As String

        profielnaam = "E180.COO"
        filenaam = App_path & "\COOR\" & profielnaam
        invfilenaam = App_path & "\INV\" & Replace(profielnaam, "COO", "Inv")


        Dim parser As New TextFieldParser(filenaam)
        Dim naam As String
        Dim NI As Integer
        Dim XI(200) As Double
        Dim YI(200) As Double
        Dim X1 As Integer
        Dim X2 As Integer
        Dim Y1 As Integer
        Dim Y2 As Integer
        Dim I As Integer
       
        naam = parser.ReadLine.ToString
        NI = CInt(parser.ReadLine)
        parser.Delimiters = New String() {"      "}
        For I = 1 To NI
            Dim velden() As String = parser.ReadFields
            XI(I) = Double.Parse(CStr(velden(0)), New Globalization.CultureInfo("en-us"))
            YI(I) = Double.Parse(CStr(velden(1)), New Globalization.CultureInfo("en-us"))
        Next
        For I = 1 To NI - 1
            X1 = 54 + XI(I) * 490            '800 is de ruimte aan de voorkant
            Y1 = 350 + YI(I) * -490        '4870 is de ruimte van de bovenkant
            X2 = 54 + XI(I + 1) * 490
            Y2 = 350 + YI(I + 1) * -490
            g.DrawLine(Pens.Black, X1, Y1, X2, Y2)
        Next I

        Dim ZI(200) As Double
        Dim d(200) As Double
        Dim parser1 As New TextFieldParser(invfilenaam)
        Dim leeg As String
        Dim Reynoldsgetal As Integer
        Dim npoint As Integer
        leeg = parser1.ReadLine
        naam = parser1.ReadLine.ToString
        NI = CInt(parser1.ReadLine)
        Reynoldsgetal = CInt(parser1.ReadLine)
        npoint = CInt(parser1.ReadLine)

        For j = 1 To npoint
            leeg = parser1.ReadLine
            For I = 1 To NI
                ZI(I) = Double.Parse(CStr(parser1.ReadLine), New Globalization.CultureInfo("en-us"))
            Next
            For I = 1 To NI - 1
                X1 = 54 + 160 * XI(I) * 3            '800 is de ruimte aan de voorkant
                Y1 = 250 + 160 * ZI(I) / 3.2         '4870 is de ruimte van de bovenkant
                X2 = 54 + 160 * XI(I + 1) * 3
                Y2 = 250 + 160 * ZI(I + 1) / 3.2
                g.DrawLine(Pens.Blue, X1, Y1, X2, Y2)
            Next I
        Next j
    End Sub
End Class
 
Hallo joz1
Hier ging iets fout hier de volledige tekst
ik heb een redelijke oplossing gevonden (denk ik) moet het nog verder uit werken
Alleen wordt de picturebox in runtime geplaatst of het Formulier geplaatst
ik had dat liever anders gezien
ik heb verders nog niet gekeken naar de evt. oplossing van jou
maar het lijkt mij voor een newby ( in vb2010) als ik veel te ingewikkeld
grt john
 
OK.

Dit weghalen:

[cpp]''// to the Load event of the form.
Private pictureBox1 As New PictureBox()

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
pictureBox1.Location = New Point(48, 48)
pictureBox1.Height = 440
pictureBox1.Width = 660
pictureBox1.BorderStyle = BorderStyle.Fixed3D
pictureBox1.BackColor = Color.White
pictureBox1.Image = Image.FromFile("D:\visual studio 2010\Bitmap0.bmp")

''// Connect the Paint event of the PictureBox to the event handler method.
AddHandler pictureBox1.Paint, AddressOf Me.pictureBox1_Paint
''// Add the PictureBox control to the Form.
Me.Controls.Add(pictureBox1)
End Sub ''//Form1_Load[/cpp]

Een PictureBox toevoegen (PictureBox1 in dit voorbeeld).

En dit veranderen:

[cpp]Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)[/cpp]

Naar dit:

[cpp]Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint[/cpp]
 
hallo Joz1

Dat werkt goed in een proef opstelling, moet nu nog uitvinden hoe ik een verwijzing vind in het eigenlijke programma.
moet ik daar picture1.paint aanroepen ?? of load_profiel aanroepen dan, vraagt het programma om enkele declared of anders een geeft hij een error:
Argument not specified for parameters e en sender
dus dat moet ik nog zien op te lossen
grt john
 
Dan haal je die arguments gewoon weg :)
[CPP]Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint[/CPP]
wordt
[CPP]Private Sub pictureBox1_Paint() Handles PictureBox1.Paint[/CPP]
En dus:
[cpp]pictureBox1_Paint()[/cpp]
 
Hallo Joz1

Helaas ben ik weer terug zoals het begonnen is:
ik zie dat de tekening gemaakt wordt maar als het scherm er uiteindelijk vast er staat zie ik leeg scherm
vreemder wordt het helemaal als ik de bitmap als image
: pictureBox1.Image = Image.FromFile("D:\visual studio 2010\Bitmap0.bmp":
er bij wild schrijven (in picturebox1.paint) dan komt alles in een eindeloze lus terecht en blijft het de tekeningen en een leeg scherm zich eindeloos herhalen.
het scherm flikkert tussen een leeg scherm en de tekeningen heen en weer
je zou het eigenlijk moeten kunnen zien.
IK moet dit verder uitzoeken hoe dit mogelijk is.
maar ik heb vandaag geen tijd er voor, het komt in een later stadium wel
grt john
 
In het paint-event hoort dat dan ook niet te staan.
Probeer het eens in Form_Load.
 
hallo Joz1
Dat had ik natuurlijk ook geprobeerd.
heb het zelf in picture1 bij .image direct opgenomen.
Doch dan zie ik wel de Image tekening maar de profiel tekening flits even voorbij en is niet meer te zien in de uiteindelijke resultaat
Ik denk dat komt door de opbouw van het programma met twee schermen
1 introductie scherm en 1 programma scherm met divr. keuze mogelijkheid
heb het idee dat er enkele events twee maal doorlopen
moet het verder uitzoeken hier waarom dit gebeurd
grd john
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan