none
Wie kann ich die Ausgabe eines Tick Events einer Konsolenanwendung nach rechts verschieben und in einer Liste ausgeben? RRS feed

  • 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.

    Samstag, 3. März 2018 20:26

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ß,
    Dimitar


    Bitte 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.

    Montag, 5. März 2018 13:55
    Administrator

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ß,
    Dimitar


    Bitte 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.

    Montag, 5. März 2018 13:55
    Administrator
  • 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.

    Dienstag, 27. April 2021 17:41