Problem mit der Bildschirmausgabe

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Problem mit der Bildschirmausgabe

    Hallo liebe Mitglieder,
    Habe vor ca. 20 Jahren mal C und Fortran gelernt, tat mich aber schwer. Nun habe ich VB entdeckt und starte einen Neuanfang. Klappt auch soweit ganz gut.
    Möchte alle Lottozahlen aus Datei einlesen und in einem Zahlenfeld der Reihe nach alle Ziehungen farbig anzeigen. Geht alles, aber nur wenn ich nach jeder
    eingelesenen und zugewiesenen Zahlenreihe eine msgbox aufrufe werden sie sichtbar. muß dann immer ok drücken dann gehts weiter. Wie kann ich das automatisch
    machen lassen also ohne dieser Krücke. Ist mein erstes Forum und hoffe ich drücke mich nicht unverständlich aus.
    Die txt.Datei ist so aufgebaut:
    12;23;4;6;12;34
    1;9;33;44;45;3
    usw....

    Quellcode

    1. Public Class Form2
    2. Private Zahlen As New List(Of Label)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.TopMost = True
    5. Dim x As Integer = 0
    6. Dim y As Integer = 0
    7. For i As Integer = 1 To 49
    8. Dim tmpLabel As New Label
    9. tmpLabel.Location = New Point(x, y)
    10. tmpLabel.Text = i.ToString()
    11. tmpLabel.AutoSize = False
    12. tmpLabel.Size = New Size(35, 35)
    13. tmpLabel.BorderStyle = BorderStyle.FixedSingle
    14. tmpLabel.BackColor = Color.White
    15. tmpLabel.TextAlign = ContentAlignment.MiddleCenter
    16. Zahlen.Add(tmpLabel)
    17. Me.Controls.Add(tmpLabel)
    18. x += 37
    19. If i Mod 7 = 0 Then
    20. y += 37
    21. x = 0
    22. End If
    23. Next
    24. End Sub
    25. Private Sub anzeige()
    26. Dim iLotto As Integer
    27. Dim lines() As String = System.IO.File.ReadAllLines("d:\zahlen-test.txt")
    28. For Each line In lines
    29. Dim parts() As String = line.Split(";")
    30. For i = 0 To parts.Length - 1
    31. iLotto = CInt(Val(parts(i)))
    32. Zahlen(iLotto - 1).BackColor = Color.Red
    33. Next
    34. MsgBox(6) 'hier sollte sich die Bildschirmanzeige aktualisieren und ausgegeben werden ohne dem Umweg über die Box
    35. System.Threading.Thread.Sleep(2000)
    36. For Each oLabel As Label In Zahlen
    37. oLabel.BackColor = Color.White
    38. Next
    39. Next
    40. End Sub
    41. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    42. anzeige()
    43. End Sub
    44. End Class


    Ich hoffe es versteht mich jemand und mein erster Post ist formell soweit in Ordnung.
    Vielen herzlichen Dank im Voraus

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

    na super, das wars
    habe schon mit me probiert aber irgendwann sieht man vor lauter Bäumen den Wald nicht mehr.
    ist mein Code soweit in Ordnung ? ich mein stilistisch ?
    auf jeden Fall herzlichen Dank für die schnelle Hilfe
    Danke
    Das ist eine gefährliche Frage :|

    Mitunter wir hier über die "Reine Lehre" - sprich "korrekten Code" - recht hitzig diskutiert.

    Was Du nicht mehr benutzen solltest, ist die VAL-Funktion in Zeile 35.

    Daas kannst Du statdessen so machen:

    VB.NET-Quellcode

    1. Dim iLotto As Integer
    2. If Integer.TryParse(parts(i), iLotto) Then
    3. Zahlen(iLotto - 1).BackColor = Color.Red
    4. End If


    und dann auch die Dim-Anweisung in ZZeile 29 rausnehmen.

    Mit obigem Code wird erst geprüfft, ob eine Umwandlung möglich ist.

    Es geht auch in einer Zeile:
    (dann aber ohne die Prüfung)

    VB.NET-Quellcode

    1. Zahlen(Integer.Parse(parts(i))-1).BackColor = Color.Red

    Ist soweit i.O. bis auf die Labels. Warum machst du diese nicht schon im Designer ? Außerdem, 49 Labels sind erstaunlich ungünstig, ich würde ein eigenes Control erstellen, aber das übersteigt womöglich noch deine Kompetenzen.
    Das Problem ist, du instanzierst jedes Label unter dem gleichen Namen. Das kann später zu Komplikationen führen.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @xd-franky-5
    wenn dieser gesplittet wird kommt ja wieder ein String dabei heraus.
    Komplett falsch, beim Teilen entstehen mindestens 2 Strings was eigentlich schon für ein Array spricht.

    .Split() gibt ein String-Array zurück folglich kann man doch auch gar nicht anders als ein String-Array zu verwenden, oder? Weil für eine List müsste das ja so aussehen:

    VB.NET-Quellcode

    1. For Each sItem In line.Split(CChar(";")) 'Da fehlt im übrigen ein CChar() sieht nach Option Strict Off aus...
    2. Testliste.Add(sItem)
    3. Next


    @Hudlach warum in Zeile 34 denn auf einmal so kompliziert?
    Statt den ganzen

    Quellcode

    1. For i=0 To parts.Length - 1
    -Mist kannst du einfach wieder (wie in den beiden Schleifen davor)

    Quellcode

    1. For Each sPart As String in parts
    machen.

    Und selbst wenn, müsste Zeile 38 dann nicht

    Quellcode

    1. Next i
    lauten?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „radio-ffk“ ()

    hier mit CChar um sich zu fuchteln ist schwachsinn.
    Das ist korrekt:

    VB.NET-Quellcode

    1. Dim parts() As String = line.Split(";"c)


    radio-ffk schrieb:

    mindestens 2 Strings

    Nope, wenn man mit den StringSplitOptions Arbeitet, kann man durchaus auch ein Array mit nur einem String erhalten, sofern sich der "Splitter", warum auch immer, am Ende befindet.

    radio-ffk schrieb:

    Weil für eine List müsste das ja so aussehen:
    Testliste.Add(sItem)
    Du hast wohl die .AddRange Methode vergessen, die liebend gerne ganze Arrays aufnimmt. ;) Und nu bin ich fertig :D

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „EaranMaleasi“ ()

    Wenn Du das

    Hudlach schrieb:

    VB.NET-Quellcode

    1. System.Threading.Thread.Sleep(2000)
    weglässt, ist die Information sofort sichtbar.
    Wenn Du einen 2-Sekunden-Takt brauchst, nimm einen Timer.
    Lies die Datei vorher ein und werte die Zeilen im Timer-Tick-Event aus.
    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!
    @'RodFromGermany

    weglässt, ist die Information sofort sichtbar


    wenn er das weglässt dann ist die Information doch sofort wieder weg und er sieht nur das letzte Ergebnis.

    Ich denke, die Pause dient nur zum prüfen, ob der Code tut was er soll.

    torf160 schrieb:

    und er sieht nur das letzte Ergebnis.
    Dann soll @Hudlach bitte mal beschreiben, was passieren soll.
    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 alle,
    bin überwältigt von soviel Anteilnahme, vielen Dank. Das Prog läuft soweit wunderbar.
    Habe eingangs versucht zu erklären was passieren soll.
    Alle Lottozahlen aus einer TXT Datei einlesen und in einem Zahlenfeld von 1 bis 49 der Reihe nach alle Ziehungen grafisch farbig anzeigen
    lassen. Die 2 Sekundenpause ist nur dazu da die 6 farbig unterlegten Zahlen auch 2 Sekunden zu sehen. Ohne dieser Pause ginge das einfach zu schnell
    und die nächsten 6 Zahlen wären schon da.
    nochmal danke
    noch eine dringende Empfehlung: Visual Studio - Empfohlene Einstellungen

    Du scheinst zwar die wichtigsten Paradigmen von Objektorientierung zu verstehen, aber ein paar kleine Fehler sind dir dennoch unterlaufen, weil bei dir Strict Off ist.
    Besser von Anfang an vb.net so einrichten, dass es als Sprache auch was taugt.