Debug: Funktioniert, Erstellen: Funktioniert nicht

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Debug: Funktioniert, Erstellen: Funktioniert nicht

    Heyho Leute,

    ich versteh gerade etwas ganz und gar nicht. Und zwar:
    Ich habe folgenden Code:

    VB.NET-Quellcode

    1. Dim wgnr As String = CStr(list_wgnr.Items.Item(list_wgnr.SelectedIndex))
    2. Dim wgrp As String = CStr(list_wgrp.Items.Item(list_wgrp.SelectedIndex))
    3. For i As Integer = 0 To list_in3.Items.Count - 1
    4. Dim gewaehlt As String = CStr(cmb_vehicle_in_repgroup.Items.Item(cmb_vehicle_in_repgroup.SelectedIndex))
    5. Dim bearbeiten As String = CStr(list_in3.Items.Item(i))
    6. If gewaehlt = bearbeiten Then
    7. Dim xyz As String
    8. If list_in3.SelectedIndex < 10 Then
    9. xyz = "0" & CStr(i)
    10. Else
    11. xyz = CStr(i)
    12. End If
    13. rep_list.Add({cmb_rgruppe.SelectedIndex & xyz & wgnr, wgrp})
    14. List_Repaints()
    15. lbl_saved.Text = "Es wurden nicht alle Änderungen gespeichert!"
    16. Exit For
    17. End If
    18. Next


    Kurze Erklärung:
    wgnr = Nummer eines Fahrzeuges
    wgrp = Lackierung eines Fahrzeuges
    list_in3 = ListBox
    cmb_vehicle_in_repgroup = Fahrzeug in Gruppe

    gewaehlt = Aktuell markiertes Fahrzeug in cmb_vehicle_in_repgroup
    bearbeiten = Zum auslesen des Index benötigtes Fahrzeug in list_in3
    rep_list = Array mit Daten

    Wenn ich das ganze Debugge und mir einen Haltepunkt an die Schleife setze und Schritt für Schritt durchgehe und mir den Inhalt der Variablen anschaue, stimmt alles und funktioniert bestens. Ich kann egal in welcher Gruppe ich mich befinde jedem Fahrzeug eine Lackierung zuweisen.
    Genau der gleiche Code funktioniert bei normalem Debuggen ohne Haltepunkt bzw. beim Erstellen des Projektes allerdings nicht mehr. Es tritt auch kein Fehler auf, es geschieht einfach nicht das, was geschehen soll. Er fügt - egal in welcher Gruppe - einmal eine Lackierung hinzu, alles weitere wird gekonnt ignoriert.

    Setze ich wieder einen Haltepunkt funktioniert wieder alles bestens und der Code arbeitet so wie er soll.

    Woran könnte das liegen? Kann mir da jemand helfen dieses Problem zu beheben?

    LG
    FranzBauer
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!
    Wo wird der Code aufgerufen?

    FranzBauer schrieb:

    Ich kann egal in welcher Gruppe ich mich befinde jedem Fahrzeug eine Lackierung zuweisen.

    Was bedeutet das? Ich sehe, dass der Code in der For-Schleife exakt einmal ausgeführt wird, wenn gewählt=bearbeitet ist und dann wird mit Exit die Schleife verlassen.

    FranzBauer schrieb:

    Er fügt - egal in welcher Gruppe - einmal eine Lackierung hinzu, alles weitere wird gekonnt ignoriert.

    Deswegen verstehe ich nicht, was der Unterschied sein soll. Es soll ja nur einmal ausgeführt werden...

    Ansonsten gibt es

    VB.NET-Quellcode

    1. list_wgnr.Items.SelectedItem

    ist deutlich kürzer zu lesen. Und mit .ToString am Ende hast du deinen String, "CStr" ist veraltet. Das gleiche für ComboBox.
    Okay, ich erklär es mal:


    Ich habe 3 Fahrzeuge und 3 Gruppen. Jede Gruppe ist für sich voneinander getrennt und nur die Liste "list_in3" hat eine gemeinsame Eigenschaft:
    Den Index der Fahrzeuge. Diesen muss ich auslesen um sicherzustellen dass der richtige Index zugewiesen wird. Der Index ist in den Gruppen selbst unbekannt. Klar?

    Die Liste sieht so aus (zufallsbasiert):

    Quellcode

    1. KFZ2
    2. KFZ3
    3. KFZ1


    Jede Gruppe bekommt ein Fahrzeug zugewiesen:

    Quellcode

    1. KFZ2 -> Gruppe1
    2. KFZ3 -> Gruppe2
    3. KFZ1 -> Gruppe3

    Nun möchte ich den Fahrzeugen in den einzelnen Gruppen eine Lackierung zuweisen. Dazu muss ich checken, welchen Index das Fahrzeug hat. Also frage ich in der Schleife ab (die jedes Element durchgeht), ob der Name des Fahrzeuges dem eine Farbe zugewiesen werden soll GLEICH dem Namen ist, der aktuell in der For-Schleife "gewählt" ist. Ist dieser gleich, wird die Farbe hinzugefügt und die Schleife verlassen, da alle anderen Einträge sowieso ungleich sind, da jedes Fahrzeug nur einmal vorkommt. Ist der Name der Fahrzeuge gleich, so wird der Index in "list_in3" abgefragt und zusammen mit anderen Informationen in einem Array gespeichert.

    Im Debug mit Haltepunkt (zum testen und anschauen der einzelnen Variablen) funktioniert das ganze ohne Probleme und sieht am Ende so aus:

    Quellcode

    1. KFZ1: Blau (Index: 2)
    2. KFZ2: Grün (Index: 0)
    3. KFZ3: Rot (Index: 1)


    Wenn ich allerdings den Haltepunkt entferne und den Code einfach so durchlaufen lasse, sieht das so aus:

    Quellcode

    1. KFZ1: Blau (Index: 2)
    2. KFZ2: --- (Index: -)
    3. KFZ3: --- (Index: -)

    Sprich, den Fahrzeugen wird keine Farbe mehr zugewiesen sowie der Index wird auch nicht ausgelesen.

    Die Schleife wird für jedes Fahrzeug einmal aufgerufen, sprich voneinander getrennt, sollte also problemlos funktionieren, da für jedes Fahrzeug einzeln abgefragt wird.

    Quellcode

    1. KFZ1: (Fahrzeug wird bunt Wenn in Liste "gefunden")
    2. KFZ2: (Fahrzeug wird bunt Wenn in Liste "gefunden")
    3. KFZ3: (Fahrzeug wird bunt Wenn in Liste "gefunden")


    Fällt mir gerade ein: Kann es sein, dass einfach das Abfragen der Werte der ListBox zu schnell geschieht und das Programm einfach keine Werte zurück gibt? Da beim Haltepunkt ja Schritt für Schritt gesprungen wird und so genug Zeit bleibt, die Infos zu bekommen... Wenn das möglich sein könnte: Wie behebe ich das? Mit z.B. Application.DoEvents?

    LG
    FranzBauer
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!
    'Tschuldigung, total verpeilt.

    Kurz gesagt: Über diese Methode:

    VB.NET-Quellcode

    1. For i As Short = 0 To gruppen - 1
    2. Dim wgnr As String = CStr(list_wgnr.Items.Item(list_wgnr.SelectedIndex))
    3. Dim wgrp As String = CStr(list_wgrp.Items.Item(list_wgrp.SelectedIndex))
    4. For i As Integer = 0 To list_in3.Items.Count - 1
    5. Dim gewaehlt As String = CStr(cmb_vehicle_in_repgroup.Items.Item(cmb_vehicle_in_repgroup.SelectedIndex))
    6. Dim bearbeiten As String = CStr(list_in3.Items.Item(i))
    7. If gewaehlt = bearbeiten Then
    8. Dim xyz As String
    9. If list_in3.SelectedIndex < 10 Then
    10. xyz = "0" & CStr(i)
    11. Else
    12. xyz = CStr(i)
    13. End If
    14. rep_list.Add({cmb_rgruppe.SelectedIndex & xyz & wgnr, wgrp})
    15. List_Repaints()
    16. lbl_saved.Text = "Es wurden nicht alle Änderungen gespeichert!"
    17. Exit For
    18. End If
    19. Next
    20. Next


    So besser zu verstehen? Auf jeden Fall wir bei jedem Zuweisen einer Farbe abgefragt, ob das Fahrzeug in der Liste steht. Und ja, die Funktionen sind veraltet, das ersetze ich :)
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!
    Pass auf:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. MacheBunt()
    3. End Sub
    4. Private Sub MacheBunt()
    5. Dim kennz As String = liste_kennzeichen.SelectedItem.ToString
    6. Dim farbe As String = liste_farbe.SelectedItem.ToString
    7. For i As Integer = 0 To fahrzeugliste.Items.Count - 1
    8. Dim gewaehlt As String = fahrzeug_in_gruppe.SelectedItem.ToString
    9. Dim bearbeiten As String = fahrzeugliste.SelectedItem.ToString
    10. If gewaehlt = bearbeiten Then
    11. Dim fahrzeugindex As String
    12. If fahrzeugliste.SelectedIndex < 10 Then
    13. fahrzeugindex = "0" & i.ToString
    14. Else
    15. fahrzeugindex = i.ToString
    16. End If
    17. ' Hinzufügen zu einem Array
    18. rep_list.Add({cmb_rgruppe.SelectedIndex & fahrzeugindex & kennz, farbe})
    19. List_Repaints() ' Ausgabe der Daten in eine ListBox
    20. Exit For
    21. End If
    22. Next
    23. End Sub


    So. Das ist alles, was zu dieser Funktion gehört. Die Funktion selbst wird über den Button aufgerufen. Noch was? :)
    Wie gesagt: Der Code funktioniert im "Einzelschritt-Modus", allerdings im normalen Gebrauch eben nicht!

    Aber mal eine Frage zwischendurch: Man hört immer wieder, dass CStr, CInt etc. veraltet wären. Warum schlägt mir Visual Basic genau diese dann immer vor anstatt z.B. "ToString" zu verwenden?
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!
    BTW: Zwei verschachtelte Schleifen, die beide die gleiche index Variable verwenden ("i") ??? Bei mir meckert der Compiler und läßt so was gar nicht zu

    EDIT. Aha und schon wieder ne neue Version ... @OP: Kannst du mal bitte Code so posten, dass er Sinn ergebit?


    CInt() etc sind NICHT veraltet. Sie arbeiten teilweise nur anders als andere Funktionen: stackoverflow.com/questions/423820/integer-parse-vs-cint


    EDIT: gewählt und bearbeiten in der Schleife sind nicht vom Schleifenindex abhängig, also gehören sie VOR die Schleife. If bearbeitet = gewählt müsste dann auch vor die Schleife. Dann wäre die Schleife aber leer. Also irgendwie ergibt der Code vorwärts und rückwärts keinen Sinn!

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

    FranzBauer schrieb:

    Noch was? :)

    Ja, wie kommst du auf die Idee, dass alle Fahrzeige abgearbeitet werden, wenn nur ausgewähltes Fahrzeug (aus der ComboBox) genommen wird?

    Der letzte Code ist falsch, denn "bearbeiten" "gewählt" (bei deinen Namen kommt man total durcheinander) soll natürlich weiterhin als (i) genommen werden, deswegen die Schleife (@picoflop: ). Und ich sehe nur eine Schleife, nicht 2.

    Und benenne deine ComboBox um, damit man erkennt, dass es eine ist, so ist der Code wieder unübersichtlich.
    @picoflop
    Stimmt, da ist noch eine Schleife, wozu auch immer, denn vorher war sie nicht da und später auch nicht. :?: Aber vielleicht wurde sie ja doch mal aufgerufen, das würde erklären, warum die Fahrzeuge mehrmals aufgerufen wurden. :?:

    Wobei ich mich jetzt frage, woher "farbe" kommt, welches bei Add hinzugefügt wird, es wird doch gar nicht geändert. :?:

    Aber den TE scheint sein Problem nicht besonders zu interessieren...
    @sonne75, @picoflop:
    Ja, wie kommst du auf die Idee, dass alle Fahrzeige abgearbeitet werden, wenn nur ausgewähltes Fahrzeug (aus der ComboBox) genommen wird?
    Ich versuch es euch zu erklären: Man hat eine Liste mit allen Fahrzeugen, die Global für eine ganze Datei (die wird am Ende erstellt, ist aber momentan uninteressant) gilt. Daraus wählt man welche, die einer Gruppe zugewiesen werden. Diese ausgewählten Fahrzeuge kommen zur Übersicht, damit man auch sieht, welche Fahrzeuge in der Gruppe sind, in eine ComboBox. Dort kann man diese auswählen und eben eine Lackierung hinzufügen. Allerdings kann ich nicht den Index der ComboBox nehmen, da der Index hier nicht stimmt. Das Spiel, wofür das Programm entstehen soll, benötigt am Ende den Index der globalen Fahrzeugliste!

    Also versuche ich mittels der Schleife die globale Fahrzeugliste durchzugehen und den Fahrzeugindex der globalen Fahrzeugliste herauszufinden.
    Das versuch(t)e ich mittels obigem Code zu erreichen, was aber mal überhaupt nicht klappte.
    Warum ergibt der Code denn (für euch) an sich so keinen Sinn?
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!

    FranzBauer schrieb:

    Warum ergibt der Code denn (für euch) an sich so keinen Sinn?

    Welcher? Du hast 3 Mal unterschiedlichen Code gepostet und der letzte ergibt nun mal wirklich keinen Sinn, weil der Schleifenindex beim Vergleich nicht berücksichtigt wird, wie vorher. Der 2.Code hat irgendeine wilde Schleife drumrum, die noch dazu denselben Zähler hat wie die innere - macht auch keinen Sinn. Und der 1.Code nimmt nur den ausgewählten Wert aus der ComboBox, also nur 1 Fahrzeug.

    Das, was du schreibst, passt überhaupt zu keinem Code.

    VB.NET-Quellcode

    1. Dim wgnr As String = CStr(list_wgnr.Items.Item(list_wgnr.SelectedIndex))
    2. Dim wgrp As String = CStr(list_wgrp.Items.Item(list_wgrp.SelectedIndex))
    3. Dim fahrzeugauscombobox As String = cmb_vehicle_in_repgroup.SelectedItem.ToString
    4. For i As Integer = 0 To list_in3.Items.Count - 1
    5. Dim aktuellesfahrzeug As String = list_in3.Items.Item(i).ToString
    6. If fahrzeugauscombobox = aktuellesfahrzeug Then
    7. Dim fahrzeugindex As String
    8. If list_in3.SelectedIndex < 10 Then
    9. fahrzeugindex = "0" & i.ToString
    10. Else
    11. fahrzeugindex = CStr(i)
    12. End If
    13. rep_list.Add({cmb_rgruppe.SelectedIndex & fahrzeugindex & wgnr, wgrp})
    14. List_Repaints() '' Nur zum Auflisten der Lackierungen
    15. lbl_saved.Text = "Es wurden nicht alle Änderungen gespeichert!"
    16. Exit For
    17. End If
    18. Next


    Das ist der aktuelle Code. Von dem sollte man auch in Zukunft ausgehen, lass oben den Schwachsinn weg. Ich verwirre mich mehr selbst als alles andere.
    Bitte um Verständnis, ich bin in letzter Zeit nicht das Logikgenie...
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!
    So, dieser Code entspricht dem 1. (vom Sinn her), von dem bin ich die ganze Zeit ausgegangen.

    Du hast EIN Fahrzeug, das aktuelle aus der Combobox. Dann läufs du in der Schleife die Liste deiner Fahrzeuge durch, und wenn du es gefunden hast, weist du ihm die Werte zu. Dann springst du aus der Schleife raus.
    D.h. am Ende hast du genau EIN Wert hinzugefügt. Genau das macht dein Programm auch, aber du beschwerst dich, dass es nicht funktionieren würde, weil du es gerne hättest, dass alle Fahrzeuge durchlaufen werden oder wie?
    In eine ListBox/ComboBox gehören keine Strings, sondern Instanzen von Klassen. Das Gefrickel mit Strings endet genau da, wo Du jetzt bist. Nämlich in einer Sackgasse.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Der Code funktioniert. Das weiß ich nun nach 30 Minuten testen. Frage ist: Warum hat sogar der Fehlerhafte Code anfangs im Einzelschritt-Modus funktioniert? Das check ich nicht.
    Jetzt funktioniert es, mehrmals getestet, auch beim Nicht-Debuggen. Hatte hier angefragt, weil es selbst nach einer Stunde testen nicht funktioniert hat. Trotzdem danke, vor allem an picoflop für den Link.

    Ich lass euch jetzt erstmal in Ruhe mit meiner Dummheit :D :whistling:


    LG
    Ich hasse es wenn einem direkt vorgeworfen wird, ohne dass die Frage überhaupt durchgelesen wurde, dass man nur fertien Code will. Schade dass es sich hier so entwickelt hat :(
    "Windows Vista Home Premium x32" - Wann kapieren endlich alle, dass es kein "x32" gibt? 32 Bit oder x86!

    FranzBauer schrieb:

    Warum ergibt der Code denn (für euch) an sich so keinen Sinn?

    Weil er keinen Sin ergibt? EDR würde jetzt sagen, dass dein Datenmodell Mist ist. Dem schließe ich mich an ;)

    Mal zum nachgrübeln, was da wohl läuft:
    (Man braucht offensichtlich 1 Listbox und 2 Comboboxen)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Class Lackierung
    3. Public Property Name As String
    4. Public Shared Operator =(ByVal a As Lackierung, b As Lackierung) As Object
    5. If a.Name = b.Name Then Return True
    6. Return False
    7. End Operator
    8. Public Shared Operator <>(ByVal a As Lackierung, b As Lackierung) As Object
    9. If a.Name = b.Name Then Return False
    10. Return True
    11. End Operator
    12. End Class
    13. Private Class Auto
    14. Public Property Modell As String
    15. Public Property Nummer As Integer
    16. Public Property Lackierung As Lackierung
    17. End Class
    18. Private AlleAutos As New List(Of Auto)
    19. Private AlleLackarten As New List(Of Lackierung)
    20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    21. For i = 1 To 10
    22. AlleLackarten.Add(New Lackierung With {.Name = "LackNr " & i})
    23. Next
    24. ' dummy liste bilden
    25. For i = 1 To 100
    26. AlleAutos.Add(New Auto With {.Modell = "Bumf " & i, .Nummer = i, .Lackierung = AlleLackarten(0)})
    27. Next
    28. lstAlleAutos.DataSource = AlleAutos
    29. lstAlleAutos.DisplayMember = "Modell"
    30. cmbLackierung.DataSource = AlleLackarten
    31. cmbLackierung.DisplayMember = "Name"
    32. End Sub
    33. Private Sub lstAlleAutos_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstAlleAutos.SelectedIndexChanged
    34. cmbGewaehlteAutos.DataSource = Nothing
    35. cmbGewaehlteAutos.DataSource = lstAlleAutos.SelectedItems
    36. cmbGewaehlteAutos.DisplayMember = "Modell"
    37. End Sub
    38. Private Sub cmbGewaehlteAutos_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbGewaehlteAutos.SelectedIndexChanged
    39. If cmbGewaehlteAutos.SelectedItem IsNot Nothing Then
    40. cmbLackierung.SelectedItem = DirectCast(cmbGewaehlteAutos.SelectedItem, Auto).Lackierung
    41. End If
    42. End Sub
    43. Private Sub cmbLackierung_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbLackierung.SelectedIndexChanged
    44. If cmbLackierung.SelectedItem IsNot Nothing Then
    45. DirectCast(cmbGewaehlteAutos.SelectedItem, Auto).Lackierung = cmbLackierung.SelectedItem
    46. End If
    47. End Sub
    48. End Class