Benutzer mit den meisten Antworten
Wie kann ich die Ausgabe eines Tick Events einer Konsolenanwendung nach rechts verschieben und in einer Liste ausgeben?

Frage
-
Ich kann eine Marquee oder von mir benannte Lichtzeile nur von oben nach unten verschieben. Ich würde die Lichtzeile aber gerne auch von links nach rechts verschieben. Und da ich die Möglichkeit erwähnen kann die Lichtzeile auch in eine Menüsteuerung einbauen. Die Menüsteuerung sind Zahlen von eins bis fünf die ich von oben nach unten oder von unten nach oben im kreis steuern kann um eine Wahlmöglichkeit zu bieten. Die folgenden Codes sollen das verdeutlichen und sind für eine VB.net Konsolenanwendung geeignet. Erstens der Lichtzeilen Code.
Module Module1 Dim aTimer As New System.Timers.Timer Const marqueeText As String = "The quick brown fox... " Dim sb As New System.Text.StringBuilder Dim direction As Boolean = False Sub Main() aTimer.AutoReset = True aTimer.Interval = 100 '1/10 second AddHandler aTimer.Elapsed, AddressOf tick aTimer.Start() Console.ReadKey() End Sub Private Sub tick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) If sb.Length = 0 Then sb.Append(marqueeText) If direction Then sb.Insert(0, sb(sb.Length - 1)) sb.Remove(sb.Length - 1, 1) Else sb.Append(sb(0)) sb.Remove(0, 1) End If
Console.CursorVisible = False Console.CursorLeft = 10 'keine sichtbare Änderung Console.CursorTop = 10 'sichtbare Änderung Console.Write("{0}{1}", vbCr, sb.ToString) End Sub End Module
Mit dem Befehl Console.CursorTop = 10 kann ich die Zeile nach unten und nach oben verschieben, doch kann ich leider den Effekt mit dem Befehl Console.CursoreLeft = 10 nicht für eine Verschiebung von links nach rechts erreichen.
Zweitens der Menüsteuerungscode.
Module Module1 Dim MenuList As New List(Of String) Sub PrintMenu(highlight As Integer, left As Integer, top As Integer) Dim Nickvektor() As Integer = {1, 2, 3, 4, 5} For I = 0 To MenuList.Count - 1 Console.CursorLeft = left Console.CursorTop = top + I If I = highlight Then Console.Write("{0}", "[" & Nickvektor(I) & "]") Else Console.Write(MenuList(I)) End If Next End Sub Sub Main() Console.CursorVisible = False Dim x As Integer = 0 Dim Nickvektor() As String = {" "} For counter As Integer = 0 To 0 Do For Each s In Nickvektor MenuList.Add(s) Next x += 1 Loop Until x = 5 Next Console.SetCursorPosition(10, 16) Console.Write("[ ]") Dim CurrentItem As Integer = 0 Dim CurrentKey As ConsoleKey While CurrentKey <> ConsoleKey.Enter PrintMenu(CurrentItem, 10, 10) CurrentKey = Console.ReadKey(True).Key Select Case CurrentKey Case ConsoleKey.DownArrow CurrentItem += 1 Case ConsoleKey.UpArrow CurrentItem -= 1 End Select CurrentItem = (CurrentItem + MenuList.Count) Mod MenuList.Count End While End Sub End Module
Ich kann mit dem Code zwischen den Zahlen eins bis fünf wechseln und verwende dafür die Pfeil nach oben und Pfeil nach unten Tasten. Der zweite teil meines Problems ist das ich die Lichtzeile auf höhe der Zahl drei in der Menüsteuerung erscheinen lassen möchte doch nicht weiß wie ich das erreichen kann.
Antworten
-
Hallo Stefan,
Mit dem Befehl Console.CursorTop = 10 kann ich die Zeile nach unten und nach oben verschieben, doch kann ich leider den Effekt mit dem Befehl Console.CursoreLeft = 10 nicht für eine Verschiebung von links nach rechts erreichen.
Dies ist auf das Wagenrücklaufzeichen vbCr zurückzuführen, das den Cursor nach links (an die Anfangsposition) verschiebt.
Console.CursorVisible = False Console.CursorLeft = 30 Console.CursorTop = 10 Console.Write("{0}", sb.ToString)
Der zweite teil meines Problems ist das ich die Lichtzeile auf höhe der Zahl drei in der Menüsteuerung erscheinen lassen möchte doch nicht weiß wie ich das erreichen kann.
Sieh Dir folgenden Beispielcode an. Es wird überprüft, ob CurrentItem 2 ist (drittes Element) und dann der Timer gestartet. Bei Bedarf kann er auch beim Übergang auf 4 oder 2 gestoppt werden (auskommentiert).
Module Module1 Dim MenuList As New List(Of String) Dim aTimer As New System.Timers.Timer Const marqueeText As String = "The quick brown fox... " Dim sb As New System.Text.StringBuilder Dim direction As Boolean = False Sub PrintMenu(highlight As Integer, left As Integer, top As Integer) Dim Nickvektor() As Integer = {1, 2, 3, 4, 5} For I = 0 To MenuList.Count - 1 Console.CursorLeft = left Console.CursorTop = top + I If I = highlight Then Console.Write("{0}", "[" & Nickvektor(I) & "]") Else Console.Write(MenuList(I)) End If Next End Sub Sub Main() Console.CursorVisible = False aTimer.AutoReset = True aTimer.Interval = 100 '1/10 second AddHandler aTimer.Elapsed, AddressOf tick Dim x As Integer = 0 Dim Nickvektor() As String = {" "} For counter As Integer = 0 To 0 Do For Each s In Nickvektor MenuList.Add(s) Next x += 1 Loop Until x = 5 Next Console.SetCursorPosition(10, 16) Console.Write("[ ]") Dim CurrentItem As Integer = 0 Dim CurrentKey As ConsoleKey While CurrentKey <> ConsoleKey.Enter If CurrentItem = 2 Then aTimer.Start() ' Beim Übergang auf 2 oder 4 kann der Timer gestoppt werden: 'Else 'If aTimer.Enabled Then ' aTimer.Stop() 'End If End If PrintMenu(CurrentItem, 10, 10) CurrentKey = Console.ReadKey(True).Key Select Case CurrentKey Case ConsoleKey.DownArrow CurrentItem += 1 Case ConsoleKey.UpArrow CurrentItem -= 1 End Select CurrentItem = (CurrentItem + MenuList.Count) Mod MenuList.Count End While End Sub Private Sub tick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) If sb.Length = 0 Then sb.Append(marqueeText) If direction Then sb.Insert(0, sb(sb.Length - 1)) sb.Remove(sb.Length - 1, 1) Else sb.Append(sb(0)) sb.Remove(0, 1) End If Console.CursorVisible = False Console.CursorLeft = 20 Console.CursorTop = 12 'Beim ersten Element CursorTop=10, beim dritten 12 Console.Write("{0}", sb.ToString) End Sub End Module
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Montag, 12. März 2018 12:40
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 23. März 2018 08:48
Alle Antworten
-
Hallo Stefan,
Mit dem Befehl Console.CursorTop = 10 kann ich die Zeile nach unten und nach oben verschieben, doch kann ich leider den Effekt mit dem Befehl Console.CursoreLeft = 10 nicht für eine Verschiebung von links nach rechts erreichen.
Dies ist auf das Wagenrücklaufzeichen vbCr zurückzuführen, das den Cursor nach links (an die Anfangsposition) verschiebt.
Console.CursorVisible = False Console.CursorLeft = 30 Console.CursorTop = 10 Console.Write("{0}", sb.ToString)
Der zweite teil meines Problems ist das ich die Lichtzeile auf höhe der Zahl drei in der Menüsteuerung erscheinen lassen möchte doch nicht weiß wie ich das erreichen kann.
Sieh Dir folgenden Beispielcode an. Es wird überprüft, ob CurrentItem 2 ist (drittes Element) und dann der Timer gestartet. Bei Bedarf kann er auch beim Übergang auf 4 oder 2 gestoppt werden (auskommentiert).
Module Module1 Dim MenuList As New List(Of String) Dim aTimer As New System.Timers.Timer Const marqueeText As String = "The quick brown fox... " Dim sb As New System.Text.StringBuilder Dim direction As Boolean = False Sub PrintMenu(highlight As Integer, left As Integer, top As Integer) Dim Nickvektor() As Integer = {1, 2, 3, 4, 5} For I = 0 To MenuList.Count - 1 Console.CursorLeft = left Console.CursorTop = top + I If I = highlight Then Console.Write("{0}", "[" & Nickvektor(I) & "]") Else Console.Write(MenuList(I)) End If Next End Sub Sub Main() Console.CursorVisible = False aTimer.AutoReset = True aTimer.Interval = 100 '1/10 second AddHandler aTimer.Elapsed, AddressOf tick Dim x As Integer = 0 Dim Nickvektor() As String = {" "} For counter As Integer = 0 To 0 Do For Each s In Nickvektor MenuList.Add(s) Next x += 1 Loop Until x = 5 Next Console.SetCursorPosition(10, 16) Console.Write("[ ]") Dim CurrentItem As Integer = 0 Dim CurrentKey As ConsoleKey While CurrentKey <> ConsoleKey.Enter If CurrentItem = 2 Then aTimer.Start() ' Beim Übergang auf 2 oder 4 kann der Timer gestoppt werden: 'Else 'If aTimer.Enabled Then ' aTimer.Stop() 'End If End If PrintMenu(CurrentItem, 10, 10) CurrentKey = Console.ReadKey(True).Key Select Case CurrentKey Case ConsoleKey.DownArrow CurrentItem += 1 Case ConsoleKey.UpArrow CurrentItem -= 1 End Select CurrentItem = (CurrentItem + MenuList.Count) Mod MenuList.Count End While End Sub Private Sub tick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) If sb.Length = 0 Then sb.Append(marqueeText) If direction Then sb.Insert(0, sb(sb.Length - 1)) sb.Remove(sb.Length - 1, 1) Else sb.Append(sb(0)) sb.Remove(0, 1) End If Console.CursorVisible = False Console.CursorLeft = 20 Console.CursorTop = 12 'Beim ersten Element CursorTop=10, beim dritten 12 Console.Write("{0}", sb.ToString) End Sub End Module
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Montag, 12. März 2018 12:40
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Freitag, 23. März 2018 08:48
-
Nachdem verlassen einer Zählstelle wird nicht nur der Wert 2 von der dimensionierten Variable currentItem angepasst. Auch der Speicher I wegen dem Wert MenuList.Count .
Den skalierten Wert kann ich noch immer nicht finden.
Ich übe weiter einen Anfang zu setzen.
Danke.