1

コードに問題があります。

ユーザーが現在選択していることを示すために、メニュー画面のオプションの両側にアイコンを点滅させようとしています。問題は、カーソルを同時に点滅させ、ユーザーが入力しているキーを読み取ってカーソルの位置を移動できるようにしたいことです。これを行う方法、または現在のセットアップよりも簡単な方法はありますか?

私はまだ学んでいるので、どんな助けも大歓迎です、ありがとう。

Sub Main()
    Dim KeyPressed As String
    Dim Pos As Integer
    Dim MenuSelection As Integer = 1
    PreStuff()
    DisplayMenu()
    Cursor(MenuSelection, False)
    Do
        KeyPressed = GetKeyPressed()
        If KeyPressed = "ConsoleKey.DownArrow" And Pos = 1 Then
            MenuSelection = 2
        ElseIf KeyPressed = "ConsoleKey.DownArrow" And Pos = 2 Then
            MenuSelection = 1
        ElseIf KeyPressed = "ConsoleKey.UpArrow" And Pos = 1 Then
            MenuSelection = 2
        ElseIf KeyPressed = "ConsoleKey.UpArrow" And Pos = 2 Then
            MenuSelection = 1
        End If
    Loop Until KeyPressed = "ConsoleKey.Enter"
    Cursor(0, True)
End Sub

Sub PreStuff()
    Console.Title = "Populatio - Pre Alpha"
    Console.SetWindowSize(80, 25)
    Console.CursorVisible = False
End Sub

Function GetKeyPressed()
    Dim KeyChoice As String
    KeyChoice = Console.ReadKey().ToString
    Return KeyChoice
End Function


Sub Cursor(ByVal Op As Integer, ByVal State As Boolean)
    Do
        Select Case Op
            Case 1 And State = False
                Console.SetCursorPosition(32, 5)
                Console.Write("►")
                Console.SetCursorPosition(43, 5)
                Console.Write("◄")
                State = True
            Case 1 And State = True
                Console.SetCursorPosition(32, 5)
                Console.Write(" ")
                Console.SetCursorPosition(43, 5)
                Console.Write(" ")
                State = False
            Case 2 And State = False
                Console.SetCursorPosition(34, 7)
                Console.Write("►")
                Console.SetCursorPosition(41, 7)
                Console.Write("◄")
                State = True
            Case 2 And State = True
                Console.SetCursorPosition(34, 7)
                Console.Write(" ")
                Console.SetCursorPosition(41, 7)
                Console.Write(" ")
                State = False
        End Select
        System.Threading.Thread.Sleep(500)
    Loop Until Op = 0
    Console.SetCursorPosition(32, 5)
    Console.Write(" ")
    Console.SetCursorPosition(43, 5)
    Console.Write(" ")
    Console.SetCursorPosition(34, 7)
    Console.Write(" ")
    Console.SetCursorPosition(41, 7)
    Console.Write(" ")
End Sub

Sub DisplayMenu()
    Console.WriteLine("╔═════════════════════════════════════════════════════════════════════════════╗")
    Console.WriteLine("║                            Populatio! By Alx                                ║")
    Console.WriteLine("╠═════════════════════════════════════════════════════════════════════════════╣")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                 New Game                                    ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                   Exit                                      ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.WriteLine("║                                                                             ║")
    Console.Write("╚═════════════════════════════════════════════════════════════════════════════╝")
End Sub
4

2 に答える 2

0

本質的に単一のループで実行できるように機能を問題なく分割しない限り、各ループを個別のスレッドで実行する必要があります。複雑なテーマですが、学ぶ価値があります:

http://msdn.microsoft.com/en-us/library/eed6swsx(v=vs.80).aspx

于 2013-03-27T17:29:46.783 に答える
0

ブラッドが言ったように、マルチスレッディングはおそらく前進する方法ですが、続行する前に他のイベントの処理を開始するようにシステムに指示するDoEventメソッドを使用して、必要なことを達成できる可能性があります。

直前に DoEvents を貼り付けてみてください

    Loop Until KeyPressed = "ConsoleKey.Enter"

これにより、Cursor メソッドを再度実行できるようになるため、ループは次のようになります...

Do
    KeyPressed = GetKeyPressed()
    If KeyPressed = "ConsoleKey.DownArrow" And Pos = 1 Then
        MenuSelection = 2
    ElseIf KeyPressed = "ConsoleKey.DownArrow" And Pos = 2 Then
        MenuSelection = 1
    ElseIf KeyPressed = "ConsoleKey.UpArrow" And Pos = 1 Then
        MenuSelection = 2
    ElseIf KeyPressed = "ConsoleKey.UpArrow" And Pos = 2 Then
        MenuSelection = 1
    End If
    DoEvents
Loop Until KeyPressed = "ConsoleKey.Enter"
于 2014-05-01T08:36:32.830 に答える