Übung List of

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Übung List of

    Es geht um eine Übung und ich komme einfach nicht weiter.

    Habe es mit For I To .... etc versucht...
    Die Liste soll einfach nur im TimerTick ausgegeben werden.

    lbl_zahl zählt hoch aber
    lbl_wort spring sofort auf "Neun" ... Im Debusfenster stehen aller Werte der Liste

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim zahlwort As New List(Of String) From {"Null", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    3. Dim zaehler As Integer = 0
    4. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Timer1.Start()
    6. End Sub
    7. Private Sub ausgabezahler()
    8. For Each item As String In zahlwort
    9. lbl_wort.Text = item
    10. Debug.Write(item & " ")
    11. Next
    12. zaehler = zaehler + 1
    13. lbl_zahl.Text = zaehler.ToString
    14. End Sub
    15. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    16. ausgabezahler()
    17. End Sub
    18. End Class
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @Amelie Ich finde es sehr gut, dass Du Dich mit Übungsaufgaben befasst und nicht nur mit "größeren" Projekten. :thumbup:
    Innerhalb einer Prozedur kannst Du 1000 Worte in ein Label eintragen, angezeigt wird aber nur das letzte, da zwischendurch das Label nicht upgedatet wird.
    Update die Label und bremse die GUI etwas aus, dann geht es (Sleep() ist allerdings in diesem Kontext ein NoGo :!: ):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim zahlwort As New List(Of String) From {"Null", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    3. Dim zaehler As Integer = 0
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Timer1.Start()
    6. End Sub
    7. Private Sub ausgabezahler()
    8. For Each item As String In zahlwort
    9. lbl_wort.Text = item
    10. lbl_wort.Update()
    11. 'Debug.Write(item & " ")
    12. Threading.Thread.Sleep(20)
    13. Next
    14. zaehler = zaehler + 1
    15. lbl_zahl.Text = zaehler.ToString
    16. lbl_zahl.Update()
    17. End Sub
    18. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    19. ausgabezahler()
    20. End Sub
    21. End Class

    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!
    Geht es nicht darum, bei jedem Tic den aktuellen Zähler um eins zu erhöhen?

    Falls ja, brauchst keine Schleife. Deklariere eine Klassenvariable „index“ (integer). Nimm im Tic event den jeweiligen Eintrag innerhalb der Liste und gib dessen Wert im Label aus. Dann erhöhe den Index um 1.

    Label.Text = MeineListe(index)
    index += 1

    Zudem immer prüfen, ob das Item mit dem index überhaupt vorhanden ist. Falls nicht, entsprechend reagieren.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @RodFromGermany
    @mrMo

    Habe nun 2 funktionierende Varianten.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frm_main
    2. Dim zahlwort As New List(Of String) From {"Null", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
    3. Dim zaehler As Integer = -1
    4. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Timer1.Start()
    6. ausgabezahlerwort()
    7. End Sub
    8. Private Sub ausgabezahler()
    9. If zaehler < zahlwort.Count - 1 Then
    10. zaehler = zaehler + 1
    11. lbl_zahl.Text = zaehler.ToString
    12. lbl_wort2.Text = zahlwort(zaehler)
    13. Else
    14. lbl_info.Text = "Fertig"
    15. Timer1.Stop()
    16. Exit Sub
    17. End If
    18. End Sub
    19. Private Async Sub ausgabezahlerwort()
    20. For Each item As String In zahlwort
    21. Await Task.Delay(1000)
    22. lbl_wort.Text = item
    23. Next
    24. End Sub
    25. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    26. ausgabezahler()
    27. End Sub
    28. End Class

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Amelie schrieb:

    Habe nun 2 Varianten.
    Fein!

    ...

    ...

    Und - welche funktioniert, und welche nicht, und inwiefern nicht?
    Oder warum teilst du das überhaupt mit?

    Du könntest auch den Thread-Titel ändern, weil dein Problem hat nix mit List(Of T) zu tun, sondern betrifft periodische Änderungen der Anzeige (GUI-Updates).

    Amelie schrieb:

    Habe nun 2 funktionierende Varianten.
    OK.
    Nun formuliere eine Aufgabenstellung und überprüfe, welche Lösung sie erfüllt.
    Und:
    Beim nächsten Mal formulierst Du die Aufgabe bzw. das Problem im Eröffnungs-Post. ;)
    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!

    Amelie schrieb:

    Ich möchte das ggf noch ausbauen.
    Ah - verstehe.

    Imo gibts da kaum noch was zum Ausbauen.
    Deine Varianten sind im wesentlichen die beiden Grund-Varianten, die's gibt. :thumbup:
    • Variante 1: Eine Art "State-Machine", die je Timer-Tick jeweils einen Zustand weiter-rückt.
      Dieses erfordert Klassen-weit gültige Objekte. Mindestens eines - meist sogar mehrere (Timer, Wortliste, Aktueller WortIndex).
      (Mich deucht, hier fliessen Erfahrungen aus deinem Ampelsteuerung-Projekt ein)
    • Variante 2: Async.
      Hiermit kann man den gesamten Vorgang innerhalb einer Methode lokal abhandeln - "Ausbau":

      VB.NET-Quellcode

      1. Public Class frm_main[/list]
      2. Private Sub frm_main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      3. ausgabezahlerwort()
      4. End Sub
      5. Private Async Sub ausgabezahlerwort()
      6. Dim zahlwort = {"Null", "Ein", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht", "Neun"}
      7. For Each item In zahlwort
      8. lbl_wort.Text = item
      9. Await Task.Delay(1000)
      10. Next
      11. End Sub
      12. End Class


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

    Ich find das gut wie @Amelie das macht. So eignet man sich langsam solides Grundwissen an das langfristigen zum Erfolg führt. Da können sich die meisten hier eine ordentliche Scheibe abschneiden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen