Graph Zeichnen aus Listboxelementen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Crnk.

    Graph Zeichnen aus Listboxelementen

    Moin zusammen,
    und zwar schreibe ich gerade ein programm, welches zuerst über eine for-schleife ca 160 wertepaare berechnet und diese danach als einen xy-graph darstellen soll.
    gibt es befehle, die es möglich machen, dass die werte auch gleichzeitig direkt als punkte dargestellt werden und zum graph verbunden werden ?

    for i=0 to 160
    listbox1.item.add(i)
    listbox2.item.add(f(i))
    zeichnePunkt(i,f(i)) 'und dann noch verbinden..
    next

    und da kommt auch gleich das nächste problem:
    wenn ich die zueinander gehörenden werte in unterschiedliche listboxen schreibe, sind die scrollleisten leider unabhängig voneinander!
    gibt es da eine bessere lösung ?


    vorab vielen dank!
    mfg
    Crnk
    Gehst du davon aus, dass wir dir Sourcecodes posten oder dir einen Tipp geben, wie man es machen kann und du dieses Stichwort selbst recherchieren sollst (nur angenommen, du bist kein Scriptkiddie und weißt, was Eigeninitiative ist)?
    hier noch ein tipp: "wie koche ich effektiv leckere nudeln" antwort "topf"

    das einzige malprogramm, das ich bedienen kann, nennt sich igel und ist dafür eher ungeeignet.
    wenn ich im internet recherchiere, find ich meistens was mit picturebox, was anscheinend auch irgendwas mit gdi+ zu tun hat.
    eigentlich ist es programmiertechnisch doch kein aufwendiges programm, wenn ich eine anzahl n punkte habe, der n werte zugeordnet werden, und die dann mit strichen zu verbinden?!

    ich informier mich sehr wohl, nur komme ich über die simplen ansätze, die ich bereits programmiert hab, nicht hinaus.
    da hilft auch kein schlaues, in den raum geschmissenes, wörtchen.
    Willst Du einen Graphen aus 160 Wertepaaren machen?
    Nimm Excel, trage die Werte ein und erstelle einen Graphen.
    Willst Du programmieren lernen?
    Nimm ein VB-Buch und arbeite es durch. Wenn Du auf Seite 352 bist, solltest Du Dein Problem ohne Frage lösen können.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mahlzeit,
    habe mir jetzt "Dim g As Graphics = CreateGraphics()" erstellt und bin auch in der Lage damit Linien zu malen. Allerdings malt der Stift maximal in einem Bereich (0,0,500,500) - grob geschätzt. Habe ich die Möglichkeit diesen Bereich zu verändern ?
    Über den Clip-Befehl kann ich einen Bereich separieren, aber wie wende ich mein 'g' darauf an, damit es auch ausschließlich da landet ?

    Vorab besten Dank!
    Verlagere den Code in das Paint-Event, da ist die Malfläche so groß wie Dein Control.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. Dim g As Graphics '= CreateGraphics()
    3. g = e.Graphics
    4. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay, aber wie rufe ich den Code dann im laufenden Programm ab ?
    Vorher habe ich mit

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    mein Programm über einen Knopf abgerufen. Wenn ich den Code auslager, reagiert der nicht mehr auf meinen Knopf.
    Die optimale Lösung für mein Problem wäre die Zeichenfläche an die Größe und Position eines anderen Objektes anzupassen, beispielsweise einer PictureBox.
    So würde ich den Graphen genau in das dafür vorgesehene Feld einzeichnen und nicht "über den Rand malen"
    Dann nutze das Paint-Ereignis der PictureBox.

    VB.NET-Quellcode

    1. Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    2. g = e.Graphics
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,
    das funktioniert blendend.

    Ich habe mir überlegt, dass es sinnvoller ist, meine Wertepaare in Listen zu speichern, damit ich die einzelnen Elemente auch außerhalb meiner For-Schleife aufrufen kann!

    Allerdings gibt es da Probleme bei der Ausgabe.
    Wenn ich mir die Werte erstelle über

    VB.NET-Quellcode

    1. For i = 0 To 10
    2. xlist.Add(i)
    3. ylist.Add(20 * i)
    4. Next


    und dann ausgebe über

    VB.NET-Quellcode

    1. ListBox7.Items.Add(xlist)


    erhalte ich in der ListBox7 den Eintrag: (Auflistung)

    Gibt es ein Element, welches mir alle i-Einträge untereinander auflistet ?

    Vorab vielen Dank!
    Wie soll das aussehen?
    Vielleicht eine ComboBox?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es soll aussehen wie eine Tabelle.

    In dem Fall untereinander:
    0
    1
    2
    ...
    10

    Bei der ListBox folgt allerdings: (Auflistung)
    Bei der ComboBox wird mit dem Befehl

    VB.NET-Quellcode

    1. ComboBox2.Items.Add(xlist)
    das Gleiche ausgegeben: (Auflistung)
    Mit

    VB.NET-Quellcode

    1. ListBox7.Items.Add()

    fügst du der Liste ein Objekt hinzu.
    So wird also nur der Objekttyp eingegeben.


    Du kannst mit AddRange ein Objektarray hinzufügen.
    Dann könntest du die List mit .ToArray() konvertieren und einfügen.

    zB. so (aus dem Kopf):

    VB.NET-Quellcode

    1. Dim list As New List(Of Object)
    2. For i As Integer = 0 To 10
    3. list.Add(i)
    4. Next
    5. ListBox7.Items.AddRange(list.ToArray())
    Hallo Counter Bug,
    alles klar, verstanden und funktioniert perfekt.

    Jetzt habe ich noch ein Problem.
    Der Einfachheit halber poste ich mal meinen ganzen Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim startmasse, leermasse, brennschlusszeit, relgeschwindigkeit, velocity, acc, massenstrom, grav, hoehe, hb, hs, vb, htotal As Double
    3. Dim g As Graphics = CreateGraphics()
    4. Dim stift As New Pen(Color.Red, 2)
    5. Dim pbox As New PictureBox
    6. Dim xlist, ylist, tlist, vlist, alist, hlist As New List(Of Object)
    7. Dim test As Boolean
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. If ComboBox1.Text() = "" Then 'Keine vordefinierte Rakete wird gewählt
    10. ' If IsNumeric(startmassebox.Text & leermassebox.Text & brennschlusszeitbox.Text & geschwindigkeitbox.Text) Then 'Eingabegrößen sind Zahlen
    11. ' startmasse = startmassebox.Text
    12. ' leermasse = leermassebox.Text
    13. ' brennschlusszeit = brennschlusszeitbox.Text
    14. ' relgeschwindigkeit = geschwindigkeitbox.Text 'Get-Funktionen
    15. startmasse = 2900000
    16. leermasse = 820000
    17. brennschlusszeit = 160
    18. relgeschwindigkeit = 2600 'Werte für Testphase
    19. massenstrom = ((startmasse - leermasse) / brennschlusszeit) 'Definiere notwendige Zeitunabhängige Größen
    20. grav = 9.81 'Definiere Gravitation
    21. For i = 0 To brennschlusszeit
    22. vlist.Add((relgeschwindigkeit * Math.Log(startmasse / (startmasse - massenstrom * i))) - grav * i) 'v(t)= vrel ln( m0 / (m0 +mt)) – g * t + v0, v0 bei Stufenraketen, vorerst weggelassen
    23. alist.Add((massenstrom / (startmasse - massenstrom * i)) * relgeschwindigkeit - grav) 'a(t)= dv/dt = m/(m0 – mt) * vrel -g
    24. hlist.Add(((relgeschwindigkeit * (startmasse - (massenstrom * i))) / massenstrom) * ((startmasse / (startmasse - massenstrom * i)) - 1 - Math.Log(startmasse / (startmasse - massenstrom * i))) - 0.5 * grav * i * i) 'h(t)= (vrel (m0 –mt))/m * [m0 /(m0 –mt)-1- ln (m0 /(m0 –mt)] – 0,5 * g *t²
    25. tlist.Add(i)
    26. Next
    27. ListBox2.Items.AddRange(vlist.ToArray())
    28. ListBox4.Items.AddRange(alist.ToArray())
    29. ListBox6.Items.AddRange(hlist.ToArray())
    30. ListBox1.Items.AddRange(tlist.ToArray())
    31. ListBox3.Items.AddRange(tlist.ToArray())
    32. ListBox5.Items.AddRange(tlist.ToArray())
    33. hb = ((relgeschwindigkeit * leermasse) / massenstrom) * ((startmasse / leermasse) - 1 - Math.Log(startmasse / leermasse)) - 0.5 * grav * brennschlusszeit * brennschlusszeit
    34. vb = (relgeschwindigkeit * Math.Log(startmasse / leermasse)) - grav * brennschlusszeit
    35. hs = (vb * vb) / (2 * grav)
    36. htotal = hb + hs
    37. solver4.Text() = hb
    38. solver2.Text() = vb
    39. solver5.Text() = hs
    40. solver6.Text() = htotal 'Solverwerte
    41. test = True
    42. Else
    43. ' End If
    44. End If
    45. End Sub
    46. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    47. End Sub
    48. Private Sub form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs)
    49. 'Dim g As Graphics = e.Graphics
    50. End Sub
    51. Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    52. If test = True Then
    53. g = e.Graphics
    54. ' For i = 0 To brennschlusszeit - 1
    55. ' g.DrawLine(stift, xlist.Item(i), vlist.Item(i), xlist.Item(i + 1), vlist.Item(i + 1))
    56. ' Next
    57. For i = 0 To 10
    58. ylist.Add(20 * i)
    59. xlist.Add(i)
    60. Next
    61. For i = 0 To 9
    62. g.DrawLine(stift, xlist.Item(i), ylist.Item(i), xlist.Item(i + 1), ylist.Item(i + 1))
    63. Next
    64. 'g.DrawLine(stift, 50, 0, 200, 200) 'Teststrich, wird später mit velocity, acc und höhe verknüpft.
    65. End If
    66. End Sub
    67. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    68. End Sub
    69. End Class


    Problem ist: Ich zeichne schon bevor ich den Knopf klicke, bestimmte die Listen aber erst nachdem ich den Knopf klicke.
    Ich müsste also die Methode PictureBox1_Paint() erst nach dem Knopf-Klick starten. Wenn ich einfach nur Handles Button1.Click dahinter schreibe, funktioniert das nicht.
    Mit der bool'schen Variable springt er auch nicht erst da rein.

    Gibt es also eine Möglichkeit erst zu klicken, dann die Listen zu schreiben und dann zu zeichnen ?

    Gruß,
    Crnk
    Astrein. Eine Zeile und es geht.

    Wie verbinde ich denn jetzt meine 160 Zeitwerte mit den 160 Geschwindigkeits/Beschleunigungs - und Höhenwerten ?

    Die Zeitwerte sollen jeweils neben den anderen Werten erscheinen. Das passiert auch soweit, allerdings wenn ich eine Listbox scrolle, was bei 160 Werten notwendig ist, stehen auf ein mal die falschen Werte nebeneinander.

    Kann ich die Listboxen irgendwie miteinander verbinden, sodass ich quasi 3 Listboxpaare hab, die mit 3 Scrollrädern benutzt werden ?

    MfG