Mit Inhalten aufbauende Liste mit 10 Zeilen wiederholt schreiben und mit Leerzeilen auffüllen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von prinzip.

    Mit Inhalten aufbauende Liste mit 10 Zeilen wiederholt schreiben und mit Leerzeilen auffüllen

    Für die Ausgabe auf einer elektronischen Anzeigetafel gebe ich die Ergebnisse auf 10 Zeilen in einer Textdatei aus, die von der Anzeigetafelsoftware so verarbeitet werden kann.
    Nun soll zur Siegerehrung am Ende der Veranstaltung das Ergebnis zeilenweise von unten aufbauend sozusagen ausgerollt werden. Dafür habe wurden bisher immer die Tafelseiten mehrfach kopiert und entsprechend bearbeitet, so das auf der ersten Seite nur der letzte Platz gezeigt wurde, auf der nächsten dann die letzten beiden usw.. Da es meistens so um die 10 Teilnehmer sind, verschwinden die letzten Plätze dann natürlich bei mehr als 10 Teilnehmern, wenn die ersten Plätze gezeigt werden.

    Ich habe am Wochenende mal einen Code gestrickt, die soweit auch funktioniert. Damit können die Seiten nacheinander in der Software für die Anzeigetafel von unten nach oben durchgeblättert werden. Das geht aber sicherlich auch besser und einfacher. Ich bin aber schon froh, dass ich es überhaupt soweit hinbekommen habe. :)

    VB.NET-Quellcode

    1. ​Dim Tafeltext As New ArrayList ' Liste mit den Ergebniszeilen
    2. Tafeltext.Add(" 1. Schule Ost 9278")
    3. Tafeltext.Add(" 2. Schule West 9125")
    4. Tafeltext.Add(" 3. Schule ABC 9091")
    5. Tafeltext.Add(" 4. Schule Süd 9072")
    6. Tafeltext.Add(" 5. Schule XYZ 8786")
    7. Tafeltext.Add(" 6. Schule Ost 8786")
    8. Tafeltext.Add(" 7. Sportschule 8757")
    9. Tafeltext.Add(" 8. Schule Mitte 8649")
    10. Tafeltext.Add(" 9. GS Altenberg 8602")
    11. Tafeltext.Add("10. Bergschule 8519")
    12. Tafeltext.Add("11. Eliteschule 8311")
    13. Tafeltext.Add("12. Schule am Ende 8075")
    14. Dim b As Integer = 1
    15. Dim x As Integer = 1
    16. Dim s As Integer = Tafeltext.Count
    17. For I As Integer = Tafeltext.Count To 0 Step -1
    18. If s >= Tafeltext.Count - 10 Then ' bis 10 Zeilen Startpunkt zurücksetzen
    19. s = Tafeltext.Count - 1
    20. Else ' Blockversatz um eine Zeile pro Durchlauf
    21. b += 1
    22. s = Tafeltext.Count - b
    23. End If
    24. For T As Integer = 0 To x - b
    25. TextBox1.Text = Tafeltext(s).ToString & vbNewLine & TextBox1.Text
    26. s -= 1
    27. Next
    28. For L As Integer = 1 To 10 - x ' Bei weniger als 10 Zeilen mit Leerzeilen auffüllen
    29. TextBox1.Text = " " & L & vbNewLine & TextBox1.Text
    30. Next
    31. x += 1
    32. If s < 0 Then Exit For
    33. Next


    Nun sieht das mit dem ausrollen von unten sehr gut aus. Wenn allerdings weniger als 10 Teilnehmer dabei sind, landet der erste Platz nicht in der ersten Zeile. Wie kann ich in diesem Fall den Block jeweils passend nach oben rücken und unten mit Leerzeilen auffüllen?

    TIA
    @prinzip Warum so kompliziert?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim Tafeltext As New List(Of String)
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Tafeltext.AddRange({"", "", "", "", "", "", "", "", "", ""}) ' initial 10 Leerzeilen
    4. Tafeltext.Add(" 1. Schule Ost 9278")
    5. Tafeltext.Add(" 2. Schule West 9125")
    6. Tafeltext.Add(" 3. Schule ABC 9091")
    7. Tafeltext.Add(" 4. Schule Süd 9072")
    8. Tafeltext.Add(" 5. Schule XYZ 8786")
    9. Tafeltext.Add(" 6. Schule Ost 8786")
    10. Tafeltext.Add(" 7. Sportschule 8757")
    11. Tafeltext.Add(" 8. Schule Mitte 8649")
    12. Tafeltext.Add(" 9. GS Altenberg 8602")
    13. Tafeltext.Add("10. Bergschule 8519")
    14. Tafeltext.Add("11. Eliteschule 8311")
    15. Tafeltext.Add("12. Schule am Ende 8075")
    16. End Sub
    17. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    18. If Tafeltext.Count <= 0 Then
    19. Return
    20. End If
    21. Tafeltext.RemoveAt(0)
    22. TextBox1.Lines = Tafeltext.ToArray
    23. 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!
    Danke @RodFromGermany
    Ich habe mich möglicherweise nicht ganz verständlich ausgedrückt. Es ist aber auch nicht gerade einfach zu erklären.Dein wirklich schön übersichtlicher Code schreibt hier 10 Leerzeilen gefolgt von den Ergebnissen in 12 Zeilen. Benötigt werden aber entsprechend des Beispieles 12 x 10 Zeilen, die dann wie folgt aussehen:
    Spoiler anzeigen

    Quellcode

    1. 1. Schule Ost 9278
    2. 2. Schule West 9125
    3. 3. Schule ABC 9091
    4. 4. Schule Süd 9072
    5. 5. Schule XYZ 8786
    6. 6. Schule Ost 8786
    7. 7. Sportschule 8757
    8. 8. Schule Mitte 8649
    9. 9. GS Altenberg 8602
    10. 10. Bergschule 8519
    11. 2. Schule West 9125
    12. 3. Schule ABC 9091
    13. 4. Schule Süd 9072
    14. 5. Schule XYZ 8786
    15. 6. Schule Ost 8786
    16. 7. Sportschule 8757
    17. 8. Schule Mitte 8649
    18. 9. GS Altenberg 8602
    19. 10. Bergschule 8519
    20. 11. Eliteschule 8311
    21. 3. Schule ABC 9091
    22. 4. Schule Süd 9072
    23. 5. Schule XYZ 8786
    24. 6. Schule Ost 8786
    25. 7. Sportschule 8757
    26. 8. Schule Mitte 8649
    27. 9. GS Altenberg 8602
    28. 10. Bergschule 8519
    29. 11. Eliteschule 8311
    30. 12. Schule am Ende 8075
    31. 1
    32. 4. Schule Süd 9072
    33. 5. Schule XYZ 8786
    34. 6. Schule Ost 8786
    35. 7. Sportschule 8757
    36. 8. Schule Mitte 8649
    37. 9. GS Altenberg 8602
    38. 10. Bergschule 8519
    39. 11. Eliteschule 8311
    40. 12. Schule am Ende 8075
    41. 2
    42. 1
    43. 5. Schule XYZ 8786
    44. 6. Schule Ost 8786
    45. 7. Sportschule 8757
    46. 8. Schule Mitte 8649
    47. 9. GS Altenberg 8602
    48. 10. Bergschule 8519
    49. 11. Eliteschule 8311
    50. 12. Schule am Ende 8075
    51. 3
    52. 2
    53. 1
    54. 6. Schule Ost 8786
    55. 7. Sportschule 8757
    56. 8. Schule Mitte 8649
    57. 9. GS Altenberg 8602
    58. 10. Bergschule 8519
    59. 11. Eliteschule 8311
    60. 12. Schule am Ende 8075
    61. 4
    62. 3
    63. 2
    64. 1
    65. 7. Sportschule 8757
    66. 8. Schule Mitte 8649
    67. 9. GS Altenberg 8602
    68. 10. Bergschule 8519
    69. 11. Eliteschule 8311
    70. 12. Schule am Ende 8075
    71. 5
    72. 4
    73. 3
    74. 2
    75. 1
    76. 8. Schule Mitte 8649
    77. 9. GS Altenberg 8602
    78. 10. Bergschule 8519
    79. 11. Eliteschule 8311
    80. 12. Schule am Ende 8075
    81. 6
    82. 5
    83. 4
    84. 3
    85. 2
    86. 1
    87. 9. GS Altenberg 8602
    88. 10. Bergschule 8519
    89. 11. Eliteschule 8311
    90. 12. Schule am Ende 8075
    91. 7
    92. 6
    93. 5
    94. 4
    95. 3
    96. 2
    97. 1
    98. 10. Bergschule 8519
    99. 11. Eliteschule 8311
    100. 12. Schule am Ende 8075
    101. 8
    102. 7
    103. 6
    104. 5
    105. 4
    106. 3
    107. 2
    108. 1
    109. 11. Eliteschule 8311
    110. 12. Schule am Ende 8075
    111. 9
    112. 8
    113. 7
    114. 6
    115. 5
    116. 4
    117. 3
    118. 2
    119. 1
    120. 12. Schule am Ende 8075


    ...wobei die Ziffern in den Leerzeilen nur temporär zur Übersicht dienen.
    @prinzip Verstehe mein Beispiel und wende es auf Dein Problem an. ;)
    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 prinzip

    Habe mal was gemacht, bin aber nicht sicher, ob ich Dein Anliegen richtig verstanden habe.
    Habe als "Tafel " Labels genommen uns sie mit Label1 bis Label10 nummeriert. Deshalb das Controls("Label" & i).Text

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Tafeltext As New List(Of String)
    3. Dim anzahlTeilnehmer As Integer
    4. Const geschwindigkeit As Integer = 500
    5. Private Sub btn6_Click(sender As Object, e As EventArgs) Handles btn6.Click
    6. TafelLeeren()
    7. Tafeltext.Clear()
    8. Tafeltext.Add(" 1. Schule Ost 9278")
    9. Tafeltext.Add(" 2. Schule West 9125")
    10. Tafeltext.Add(" 3. Schule ABC 9091")
    11. Tafeltext.Add(" 4. Schule Süd 9072")
    12. Tafeltext.Add(" 5. Schule XYZ 8786")
    13. Tafeltext.Add(" 6. Schule Ost 8786")
    14. 'Tafeltext.Add(" 7. Sportschule 8757")
    15. 'Tafeltext.Add(" 8. Schule Mitte 8649")
    16. 'Tafeltext.Add(" 9. GS Altenberg 8602")
    17. 'Tafeltext.Add("10. Bergschule 8519")
    18. 'Tafeltext.Add("11. Eliteschule 8311")
    19. 'Tafeltext.Add("12. Schule am Ende 8075")
    20. Anzeigen()
    21. End Sub
    22. Private Sub btn10_Click(sender As Object, e As EventArgs) Handles btn10.Click
    23. TafelLeeren()
    24. Tafeltext.Clear()
    25. Tafeltext.Add(" 1. Schule Ost 9278")
    26. Tafeltext.Add(" 2. Schule West 9125")
    27. Tafeltext.Add(" 3. Schule ABC 9091")
    28. Tafeltext.Add(" 4. Schule Süd 9072")
    29. Tafeltext.Add(" 5. Schule XYZ 8786")
    30. Tafeltext.Add(" 6. Schule Ost 8786")
    31. Tafeltext.Add(" 7. Sportschule 8757")
    32. Tafeltext.Add(" 8. Schule Mitte 8649")
    33. Tafeltext.Add(" 9. GS Altenberg 8602")
    34. Tafeltext.Add("10. Bergschule 8519")
    35. 'Tafeltext.Add("11. Eliteschule 8311")
    36. 'Tafeltext.Add("12. Schule am Ende 8075")
    37. Anzeigen()
    38. End Sub
    39. Private Sub btn14_Click(sender As Object, e As EventArgs) Handles btn14.Click
    40. TafelLeeren()
    41. Tafeltext.Clear()
    42. Tafeltext.Add(" 1. Schule Ost 9278")
    43. Tafeltext.Add(" 2. Schule West 9125")
    44. Tafeltext.Add(" 3. Schule ABC 9091")
    45. Tafeltext.Add(" 4. Schule Süd 9072")
    46. Tafeltext.Add(" 5. Schule XYZ 8786")
    47. Tafeltext.Add(" 6. Schule Ost 8786")
    48. Tafeltext.Add(" 7. Sportschule 8757")
    49. Tafeltext.Add(" 8. Schule Mitte 8649")
    50. Tafeltext.Add(" 9. GS Altenberg 8602")
    51. Tafeltext.Add("10. Bergschule 8519")
    52. Tafeltext.Add("11. Eliteschule 8311")
    53. Tafeltext.Add("12. Schule am Ende 8075")
    54. Tafeltext.Add("13. Schule ganz am Ende 8000")
    55. Tafeltext.Add("14. Schule am Arsch 1101")
    56. Anzeigen()
    57. End Sub
    58. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    59. TafelLeeren()
    60. End Sub
    61. Private Sub Anzeigen()
    62. anzahlTeilnehmer = Tafeltext.Count
    63. If anzahlTeilnehmer <= 10 Then TeilnehmerBis10(anzahlTeilnehmer)
    64. If anzahlTeilnehmer > 10 Then TeilnehmerUeber10(anzahlTeilnehmer)
    65. End Sub
    66. Sub TeilnehmerBis10(anz As Integer)
    67. For i = anz To 1 Step -1
    68. Controls("Label" & i).Text = Tafeltext.Item(i - 1)
    69. Application.DoEvents()
    70. System.Threading.Thread.Sleep(geschwindigkeit)
    71. Next
    72. End Sub
    73. Sub TeilnehmerUeber10(anz As Integer)
    74. Dim n As Integer = 0
    75. Dim m As Integer
    76. For i = 10 To 1 Step -1
    77. Controls("Label" & i).Text = Tafeltext.Item(anz - 1 - n)
    78. n = n + 1
    79. Application.DoEvents()
    80. System.Threading.Thread.Sleep(geschwindigkeit)
    81. Next
    82. Do
    83. m = Tafeltext.Count - 10
    84. If m = 0 Then Exit Sub
    85. Dim k As Integer = 10
    86. Tafeltext.RemoveAt(Tafeltext.Count - 1)
    87. For i = Tafeltext.Count To Tafeltext.Count - 9 Step -1
    88. Controls("Label" & k).Text = Tafeltext.Item(i - 1)
    89. k = k - 1
    90. Next
    91. Application.DoEvents()
    92. System.Threading.Thread.Sleep(geschwindigkeit)
    93. Loop
    94. End Sub
    95. Sub TafelLeeren()
    96. For i = 1 To 10
    97. Controls("Label" & i).Text = String.Empty
    98. Next
    99. End Sub
    100. End Class



    Gruss
    Murmeli81

    RodFromGermany schrieb:

    @prinzip Verstehe mein Beispiel und wende es auf Dein Problem an. ;)

    Danke @RodFromGermany! Im wiederholten Aufruf wird also mit ​.RemoveAt(0) fotlaufend der erste Eintrag im Array entfernt, wodurch die verbleibenden Einträge jeweisl um eine Zeile nach oben rücken. Allerdings dürfen pro Durchlauf nicht mehr als 10 Zeilen ausgegeben bzw. in die Textdatei geschrieben werden. ​TextBox1.Lines = Tafeltext.GetRange(0, 10).ToArray bringt mich dann auch nicht weiter, da schließlich aufbauend mit dem letzten Platz begonnen werden soll, damit der 1. Platz erst zum Ende ganz oben gelistet wird. ?(

    Angepasster Code

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim Tafeltext As New List(Of String)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Tafeltext.AddRange({"", "", "", "", "", "", "", "", "", ""}) ' initial 10 Leerzeilen
    5. Tafeltext.Add(" 1. Schule Ost 9278")
    6. Tafeltext.Add(" 2. Schule West 9125")
    7. Tafeltext.Add(" 3. Schule ABC 9091")
    8. Tafeltext.Add(" 4. Schule Süd 9072")
    9. Tafeltext.Add(" 5. Schule XYZ 8786")
    10. Tafeltext.Add(" 6. Schule Ost 8786")
    11. Tafeltext.Add(" 7. Sportschule 8757")
    12. Tafeltext.Add(" 8. Schule Mitte 8649")
    13. Tafeltext.Add(" 9. GS Altenberg 8602")
    14. Tafeltext.Add("10. Bergschule 8519")
    15. Tafeltext.Add("11. Eliteschule 8311")
    16. Tafeltext.Add("12. Schule am Ende 8075")
    17. End Sub
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. If Tafeltext.Count <= 0 Then
    20. Return
    21. End If
    22. Tafeltext.RemoveAt(0)
    23. If Tafeltext.Count >= 10 Then
    24. TextBox1.Lines = Tafeltext.GetRange(0, 10).ToArray
    25. End If
    26. End Sub
    27. End Class


    Murmeli81 schrieb:

    Habe mal was gemacht, bin aber nicht sicher, ob ich Dein Anliegen richtig verstanden habe.
    Habe als &quot;Tafel &quot; Labels genommen uns sie mit Label1 bis Label10 nummeriert. Deshalb das Controls(&quot;Label&quot; &amp; i).Text


    Danke @Murmeli81, dass Du dir so viel Mühe gemacht hast. Es ist aber so, dass eine externe Software auf einem anderen PC im Netzwerk die Anzeigetafel mit Daten aus einer Textdatei bespielt. Das muss zudem selektiv analog zur Moderation bei der Siegerehrung erfolgen. Dein Codebeispiel ist mir aber sicher bei zukünftigen Ideen hilfreich, da die Anzeigetafel-Software auch mit einem Label pro Zeile für die grafische Ausgabe arbeitet. Ich habe da schon wieder Ideen im Kopf. :thumbup:

    prinzip schrieb:

    Allerdings dürfen pro Durchlauf nicht mehr als 10 Zeilen ausgegeben bzw. in die Textdatei geschrieben werden.
    Fang an und poste eine belastbare Aufgabenstellung.
    Die Problematik des 1. Posts ist, meine ich, gelöst.
    Außerdem sollst Du Dir die Anregungen unserer Snippets als Anhaltspunkt nehmen, Dein Problem zu lösen.
    Sieh Dir mal an Array.Reverse().
    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 schrieb:

    Die Problematik des 1. Posts ist, meine ich, gelöst.


    Jetzt ja. Ich hab es nun dank deiner Hilfe so umgebaut, dass es von oben 'ausgerollt wird. So gefällt es mir sogar noch besser. Das ganze schreibe ich dann aber anstelle in die Textbox passend in eine Datei.
    Besispiel mit Textbox

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Tafeltext As New List(Of String)
    3. Dim TafelCount As Integer = 0
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Tafeltext.Add(" 1. Schule Ost 9278")
    6. Tafeltext.Add(" 2. Schule West 9125")
    7. Tafeltext.Add(" 3. Schule ABC 9091")
    8. Tafeltext.Add(" 4. Schule Süd 9072")
    9. Tafeltext.Add(" 5. Schule XYZ 8786")
    10. Tafeltext.Add(" 6. Schule Ost 8786")
    11. Tafeltext.Add(" 7. Sportschule 8757")
    12. Tafeltext.Add(" 8. Schule Mitte 8649")
    13. Tafeltext.Add(" 9. GS Altenberg 8602")
    14. Tafeltext.Add("10. Bergschule 8519")
    15. Tafeltext.Add("11. Eliteschule 8311")
    16. Tafeltext.Add("12. Schule am Ende 8075")
    17. TafelCount = Tafeltext.Count
    18. Tafeltext.AddRange({"", "", "", "", "", "", "", "", "", ""}) ' initial 10 Leerzeilen
    19. End Sub
    20. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    21. If Tafeltext.Count <= 0 Then
    22. Return
    23. End If
    24. Tafeltext.Insert(0, "")
    25. If Tafeltext(TafelCount) <> "" Then 'verhindern, dass eine leere Zeile ausgerollt wird
    26. TextBox1.Lines = Tafeltext.GetRange(TafelCount, 10).ToArray
    27. End If
    28. End Sub
    29. End Class​

    Vielen Dank noch mal für die Denkanstöße. :)

    Hier das Beispiel als Download: Zeilenweise10fach.zip