Vier 2-Dimensionale Punkte aus Koordinatenliste in mehrere Textboxen einfügen.

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Vier 2-Dimensionale Punkte aus Koordinatenliste in mehrere Textboxen einfügen.

    Hallo VB-Paradise,

    Ich versuche mich seit einiger Zeit an Visual Basic. Aktuell möchte ich ein kleines Programm schreiben, mit dem ich 2-Dimensionale Koordiaten aus einer Textdatei einlesen kann ( in eine Listbox). Das klappt auch so weit. Anschließend soll man vier beliebige Koordinatenpärchen aus der Listbox auswählen können, um den Schnittpunkt der zwei Geraden, die von den ausgewählten Punkten gebildet werden, zu berechnen. Das wie folgt aussieht:
    [Anhang: Bild 1]
    Mein Problem ist folgendens:

    Wenn ich auf einen Listeneintrag klicke, sollen die drei Koordinatenattribute Nr, X oder Y eines Punktes (P1,P2,P3,P4) in den Textboxen des gewünschten Punktes erscheinen. Ich konnte immerhin schon einen kleinen Teilerfolg verzeichen, jedoch wird dann in jede Textbox von Punkt 1 bis 4 die gleiche Koordinate geschrieben.

    [Anhang: Bild 2]

    Als nächstes habe ich mir überlegt, dass ganze, abhängig davon wo der Cursor gerade liegt (in einer der Textboxen eines Puntes), zu gestalte. Hierfür hab ich mir gedacht würde eine If-Schleife ganz gut passen und die sieht jetzt wie folgt aus:

    Zur Erklärung was was ist:

    y(), y(), nr() sind jeweils die Koordinateninformationen
    yTemp, xTemp, nTemp sind die ausgewählten Koordinaten


    VB.NET-Quellcode

    1. Private Sub LstPunkte_SelectedIndexChanged(ByVal sender As System.Object, _
    2. ByVal e As System.EventArgs) Handles LstPunkte.SelectedIndexChanged
    3. Dim i As Integer
    4. Try
    5. ReDim Preserve yTemp(nTemp)
    6. ReDim Preserve xTemp(nTemp)
    7. i = LstPunkte.SelectedIndex
    8. yTemp(nTemp) = y(i)
    9. xTemp(nTemp) = x(i)
    10. nTemp = nTemp + 1
    11. If Cursor.Current Is TxtP1.Text Or Cursor.Current Is TxtX1.Text Or Cursor.Current Is TxtY1.Text Then
    12. TxtP1.Text = CStr(nr(i))
    13. TxtY1.Text = CStr(y(i))
    14. TxtX1.Text = CStr(x(i))
    15. ElseIf Cursor.Current Is TxtP2.Text Or Cursor.Current Is TxtX2.Text Or Cursor.Current Is TxtY2.Text Then
    16. TxtP2.Text = CStr(nr(i))
    17. TxtY2.Text = CStr(y(i))
    18. TxtX2.Text = CStr(x(i))
    19. ElseIf Cursor.Current Is TxtP3.Text Or Cursor.Current Is TxtX3.Text Or Cursor.Current Is TxtY3.Text Then
    20. TxtP3.Text = CStr(nr(i))
    21. TxtY3.Text = CStr(y(i))
    22. TxtX3.Text = CStr(x(i))
    23. ElseIf Cursor.Current Is TxtP4.Text Or Cursor.Current Is TxtX4.Text Or Cursor.Current Is TxtY4.Text Then
    24. TxtP4.Text = CStr(nr(i))
    25. TxtY4.Text = CStr(y(i))
    26. TxtX4.Text = CStr(x(i))
    27. End If
    28. Catch ex As Exception
    29. MessageBox.Show(ex.Message, "Fehlerhinweis")
    30. End Try
    31. End Sub


    Das Problem ist, das jetzt gar nichts mehr passiert. Vielleicht kann mir ja einer von euch etwas auf die Sprünge helfen. :rolleyes:

    Vielen Dank schon ein Mal fürs lesen.

    Gruß Bill
    Bilder
    • Bild 1.png

      8,87 kB, 534×378, 164 mal angesehen
    • Bild 2.png

      12,68 kB, 540×376, 161 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BillFrankShepard“ ()

    vergiss das alles.
    Daten laden, speichern, verarbeiten
    Mach dir ein typisiertes Dataset mit einer Tabelle mit den Spalten ID, X, Y.
    Binde ein DataGridview daran, und du hast schonmal eine Maske, mit der du viele Punkte laden, speichern, anzeigen, zufügen, löschen, editieren kannst.

    Die 4 Punkte kannste als gebundene Comboboxen gestalten, aber das wäre die nächste Stufe. Erstmal, dass du Punkte eingeben kannst in ein typisiertes Dataset.
    Hallo,

    Danke für deine Tipps. Das ganze hat super funktioniert. Ich kann jetzt wie gewünscht Koordinaten eingeben und über 4 gebundene Comboboxen die passenden Punkte für meinen Geradenschnitt auswählen. Das klappt soweit ohne Probleme.
    Mein nächstes Problem ist jetzt, dass ich eine .txt Datei habe und diese .txt Datei enthält Koordinaten als Strings. Ich hab schon eine Sub-Prozedur geschrieben mit der man die Strings aus der .txt spliten kann und den jeweils passenden Arrays zuweisen kann. Das heißt es gibt ein array für die Punktnummer, eins für die y-Werte und eins für die x-Werte. Meine frage ist ob man den Inhalt der Arrays nun der jeweiligen Spalte im Datagrid zuweisen kann!?

    BillFrankShepard schrieb:

    dass ich eine .txt Datei habe und diese .txt Datei enthält Koordinaten als Strings.
    komisch.
    Was ich dir vorschlage erzeugt eine Xml-Datei, keine Text-Datei, und alles Einlesen und zurückschreiben wäre mit Dataset.ReadXml und /.WriteXml abgehandelt.

    ich glaub fast, von Daten laden, speichern, verarbeiten hast du garnix umgesetzt, denn damit würde man ja auch dem Datagrid keinerlei Spalten zuweisen.
    Spalten werden im typisierten Dataset angelegt, und mit Datagrid wird ühaupt nicht gearbeitet, sondern mit DatagridView.
    Hallo Erfinder,
    Mein Problem ist aber das ich das ganze für eine Studienarbeit schreiben muss. Und da wird eben gefordert das man das ganze als .txt abspeichern soll bzw. eine solche Datei auch ein einlesen können soll.
    Zum Vorwurf ich hätte es nicht umgesetzt kann ich nur sagen ich habe wohl meine Frage falsch formuliert. Mea culpa! ;)
    Das ganze sieht im moment so aus: Siehe Anhänge

    Die Einbindung der Daten des Datasets im Datgrid und den Comboboxen habe ich über die Databindings umgesetzt.

    Vlt ist die Fragestellung ja jetzt richtig.. =) Kann man die Inhalte eines Datasets an ein array übergeben? Und wenn ja wie?
    Bilder
    • DataSet.png

      100,76 kB, 1.366×768, 129 mal angesehen
    • Form1.png

      80,21 kB, 1.366×768, 126 mal angesehen

    BillFrankShepard schrieb:

    Und da wird eben gefordert das man das ganze als .txt abspeichern soll bzw. eine solche Datei auch ein einlesen können soll.

    Dann persistiere einfach mit

    VB.NET-Quellcode

    1. myDataset.WriteXml("DateiPfad\Dateiname.txt")
    Dann ists eine Text-Datei - steht zwar Text im xml-Format drin, aber xml-Code ist ja auch Text :P

    Ehe du da jetzt anfängst, einen Converter von .txt nach .xml zu schreiben, gibst du lieber deim Prof was hinter die Löffel, was dem einfällt, derart schwachsinnige Vorgaben zu machen.

    Die Einbindung der Daten des Datasets im Datgrid und den Comboboxen habe ich über die Databindings umgesetzt.
    na, ich hoffe, du hast fürs DGV und für jede Combobox eine eigene BindingSource eingerichtet, und daran gebunden.
    Damit wäre die Eingabe erledigt, und ich frage mich jetzt, warum du Dataset-Inhalte in Arrays umfüllen willst - sind Datasetse denn nicht gut? (doch das sind sie! ;))
    Hallo Erfinder,

    Vielen Dank noch ein Mal für deinen Tip mit dem Dataset. Das hat mir eine Menge Arbeit erspart!!!!!

    Ehe du da jetzt anfängst, einen Converter von .txt nach .xml zu schreiben, gibst du lieber deim Prof was hinter die Löffel, was dem einfällt, derart schwachsinnige Vorgaben zu machen.


    :D Ich werd mein bestes geben!


    na, ich hoffe, du hast fürs DGV und für jede Combobox eine eigene BindingSource eingerichtet, und daran gebunden.


    Selbstverständlich!

    Es klappt jetzt alles Wunderbar. Ich kann über ein openfiledialog xml-dateien einlesen und sie bearbeiten und dann wieder über einen savfiledialog speicher.
    Eine Frage habe ich noch kann man den openfiledialog und den savfiedialog etwas eleganter schreiben oder?

    Savefiledialog:

    VB.NET-Quellcode

    1. Private Sub BtnSpeichern_Click(sender As Object, e As EventArgs) Handles BtnSpeichern.Click
    2. Dim sfd As New SaveFileDialog
    3. sfd.InitialDirectory = "C:\"
    4. sfd.Filter = "XML-Datei (*.xml)|*.xml|" &
    5. " Alle Dateien (*.*)|*.*"
    6. sfd.Title = "Datei speichern unter"
    7. If sfd.ShowDialog() = DialogResult.OK Then
    8. DataSet1.WriteXml(sfd.FileName)
    9. MessageBox.Show("Speichern: " & sfd.FileName)
    10. Else
    11. MessageBox.Show("Abbruch")
    12. End If
    13. End Sub


    Openfiledialog:

    VB.NET-Quellcode

    1. Private Sub BtnOeffnen_Click(sender As Object, e As EventArgs) Handles BtnOeffnen.Click
    2. Dim ofd As New OpenFileDialog
    3. ofd.InitialDirectory = "C:\Temp"
    4. ofd.Filter = "XML-Datei (*.xml)|*.xml|" &
    5. " Alle Dateien (*.*)|*.*"
    6. ofd.Title = "Datei zum Öffnen auswählen"
    7. If ofd.ShowDialog() = DialogResult.OK Then
    8. Dim ds As New DataSet
    9. ds = DataSet1
    10. ds.ReadXml(ofd.FileName)
    11. MessageBox.Show("Öffnen: " & ofd.FileName)
    12. Else
    13. MessageBox.Show("Abbruch")
    14. End If
    15. End Sub


    Und noch ein Mal danke für deinen Tipp! =)
    so Dialoge kannste im Designer aufs Form schmeißen. Auch die Filter kannste bereits im Designer festlegen.
    Und im Form_Load legste das InitialDirectory fest - nirgends sonst.

    Dann fungiert der Dialog wie eine Klassenvariable (es ist ja auch eine), die sich die vom User gewählte Datei merkt. Beim nächsten Öffnen ist sie wieder voreingestellt, und kann einfach durchgeklickst werden.
    Bitte keine Messageboxen.
    Wenn ich in einem SaveFileDialog auf Ok klickse, dann gehe ich selbstverständlich davon aus, dass gesaved ist, und will nicht noch ne Messagebox wegklicksen müssen.

    Aber einfacher ists ohne File-Dialoge.
    Leg doch einfach die Datei codeseitig fest und gut ist. In einer richtigen Datenbank-Anwendung kann man auch nicht auswählen, welche Datenbank - das gäbe nur Chaos.

    Oder hast du auch vorgaben, dass die Textdatei auswählbar sein soll?


    Was soll übrigens das hier:

    VB.NET-Quellcode

    1. Dim ds As New DataSet
    2. ds = DataSet1
    3. ds.ReadXml(ofd.FileName)
    erst erstellst du ein New Dataset, und dann weist du ihm dein Dataset1 zu (was ja eine annere Klasse ist), und befüllstes dann - also informiere dich mal über das Schlüsselwort New - das schreibt man nicht einfach überallhin, sondern damit bezweckt man was, und hier hats nix verloren.
    Hier willst du Dataset1 befüllen, und dann tu das auch einfach:

    VB.NET-Quellcode

    1. DataSet1.ReadXml(ofd.FileName)
    feddich


    ich weiß jetzt nicht recht, was empfehlen. Einerseits lernst du viel, wenndedich mit meim Code auseinandersetzt, und ihn verunstaltest, annererseits kannichdir mein Code auch wirklich sehr empfehlen, also dassis schon ziemlich durchdacht, was in Daten laden, speichern, verarbeiten, post#2 in der Region "allgemein verwendbarer Persistier-Code" gecodet ist.
    Also das mit dem Validate, und dem tb.BeginLoadData, und der "Speichern?"-Frage an den User im Form_Closing, und dem Pling!-Sound, wenn gespeichert wurde, und das ganze Zeugs.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    BillFrankShepard schrieb:

    Mein Problem ist aber das ich das ganze für eine Studienarbeit schreiben muss. Und da wird eben gefordert das man das ganze als .txt abspeichern soll bzw. eine solche Datei auch ein einlesen können soll.
    Hämmerst Du die mit einem Steinbeil oder darfst Du schon Keilschrift oder Hieroglyphen verwenden?
    Ich kann mir nicht vorstellen, dass es in einer Studienarbeit solche Regularien gibt.
    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!
    @erfinder

    Oder hast du auch vorgaben, dass die Textdatei auswählbar sein soll?



    Ganz genau. Aber das Ganze hat sich jetzt eh erledigt, den der Proffessor meinte, eine xml-datei täte es auch. Mir solls recht sein :thumbsup:

    ich weiß jetzt nicht recht, was empfehlen. Einerseits lernst du viel, wenndedich mit meim Code auseinandersetzt, und ihn verunstaltest, annererseits kannichdir mein Code auch wirklich sehr empfehlen,


    Jip, da hast du wohl recht. Ich hab mich jetzt eher an deinem Grundgerüst entlanggehangelt und es funktioniert alles wie gewünscht. Insofern kann das Problem als gelöst gesehen werden.

    @rod

    Hämmerst Du die mit einem Steinbeil oder darfst Du schon Keilschrift oder Hieroglyphen verwenden?
    Ich kann mir nicht vorstellen, dass es in einer Studienarbeit solche Regularien gibt.

    ,
    Es stand halt in der Aufgabenstellung, dass eine .txt-datei mit Koordinaten eingelesen werden soll. Und ich, als jemand der noch nie etwas mit Datenbanken oder ähnlichem zu tun gehabt hat, hinterfragt dann so etwas nicht sofort. Letzten Endes hat sich das erledigt.
    Und zu deiner ersten Frage, wir dürfen seit neustem sogar schon Papyrus zum Notieren unserer Aufzeichnungen verwenden. :rolleyes:

    BillFrankShepard schrieb:

    Aber das Ganze hat sich jetzt eh erledigt, den der Proffessor meinte, eine xml-datei täte es auch.
    Das halte ich doch für ein ganz wichtiges zusätzliches Lern-Ergebnis dieser Aufgabe:
    Auch Vorgaben sind Teil der Software-Entwicklung und genauso soft (also veränderlich und ggfs. verbesserungsfähig) wie alles annere auch.

    ErfinderDesRades schrieb:

    Das halte ich doch für ein ganz wichtiges zusätzliches Lern-Ergebnis dieser Aufgabe:
    @BillFrankShepard: Im übrigen werden die meisten Fehler bei der Spezifikation gemacht :!:
    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!