Hacer un menú básico como la época de antes en modo consola

Iniciado por Meta, 28 Marzo 2015, 18:10 PM

0 Miembros y 1 Visitante están viendo este tema.

Meta

Hola:

Quiero hacer un menú de configuración del puerto serie. No me centraré en como hacer funcionar el puerto serie, lo haré más delante y lo explica por aquí.

Quiero hacerlo de la mejor forma, a pesar que este tipo de técnica se usaba en la época de MS-DOS y más allá, me he encaprichado en hacerlo así ya por hobby, hehehehe. ;)

Quiero que me den ideas de como hacerlo, por ahora lo he hecho así muy básico, que pueda entrar en menús y submenus para vuelva a empezar del menú desde el principio.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO.Ports; // No olvidar.
using System.Threading;

namespace PuertoCOM_CS_PRUEBA
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Interfaz puerto serie - v0.01"; // Mostrar título en la ventana de la consola.

            string Comandos_teclado = Console.Read();

            string Menu_Principal = @"========== MENÚ PRINCIPAL ==========


            0) Menú principa.
            1) Interfaz.
            2) Configuración.
            3) Guardar configuración.
            4) Ayuda.";


            int switchExpression = 3;
            switch (switchExpression)
            {
                case 0:
                    Console.WriteLine(Menu_Principal);
                    break;
               
                case 1:
                    Console.WriteLine("===== INTERFAZ =====");
                    Console.WriteLine("Pulse 0 para vovler al menú principal.");
                    break;

                case 2:
                    Console.WriteLine("===== CONFIGURACIÓN =====");
                    Console.WriteLine("Pulse 0 para vovler al menú principal.");
                    break;

                case 3:
                    Console.WriteLine("===== Guadar configuración =====");
                    Console.WriteLine("Pulse 0 para vovler al menú principal.");
                    break;

                case 4:
                    Console.WriteLine("===== Ayuda =====");
                    Console.WriteLine("Pulse 0 para vovler al menú principal.");
                    break;

                default:
                    Console.WriteLine("No has elegido nunguna opción. Vuelva teclear del 0 al 4.");
                    break;
            }

        }
    }
}


Aquí todo sobre Swicht.

Pueden darme consejos de cómo lo harían ustedes.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Meta

Una mejora que funciona mejor.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO.Ports; // No olvidar.
using System.Threading;

namespace PuertoCOM_CS_PRUEBA
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Modal();
        }

        void Modal()
        {
            for (; ; )
            {
                Console.Title = "Interfaz puerto serie - v0.03"; // Mostrar título en la ventana de la consola.


                string Menu_Principal = @"========== MENÚ PRINCIPAL ==========


            0) Salir.
            1) Interfaz.
            2) Configuración.
            3) Guardar configuración.
            4) Ayuda.


";

                Console.Clear();
                Console.Write(Menu_Principal);
                ConsoleKeyInfo switchExpression = Console.ReadKey();
                switch (switchExpression.KeyChar)
                {
                    case '0':
                        return;

                    case '1':
                        new Interfaz().Modal();
                        break;

                    case '2':
                        new Configuracion().Modal();
                        break;

                    case '3':
                        new Guardar_Configuracion().Modal();
                        break;

                    case '4':
                        new Ayuda().Modal();
                        break;

                    default:
                        Console.WriteLine("No has elegido nunguna opción. Vuelva teclear del 0 al 4.");
                        break;
                }
            }

        }
    }

    class Interfaz
    {
        public void Modal()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== INTERFAZ =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Configuracion
    {
        public void Modal()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== CONFIGURACIÓN =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Guardar_Configuracion
    {
        public void Modal()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== Guadar configuración =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Ayuda
    {
        public void Modal()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== Ayuda =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }
}


Aún así quiero sugerencia para hacerlo lo mejor posible.

Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

Eleкtro

Cita de: Meta en 28 Marzo 2015, 18:10 PMPueden darme consejos de cómo lo harían ustedes.

Yo quizás lo hiciese de la siguiente manera...



Por un lado una Class para definir un item de menu:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' Defines a Console Menu Item.
   ''' </summary>
   Public NotInheritable Class ConsoleMenuItem

       ''' <summary>
       ''' Gets or sets the item text.
       ''' </summary>
       ''' <value>The item text.</value>
       Public Property Text As String

       ''' <summary>
       ''' Gets or sets the <see cref="ConsoleKey"/> that activates this item.
       ''' </summary>
       ''' <value>The <see cref="ConsoleKey"/> that activates this item.</value>
       Public Property Key As ConsoleKey

       ''' <summary>
       ''' Gets or sets the associated <see cref="Command"/> for this item.
       ''' </summary>
       ''' <value>The associated <see cref="Command"/> for this item.</value>
       Public Property Command As Action

   End Class


Con ello, compongo los items del menú y sub-menúes:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' The main menu items.
   ''' </summary>
   Private ReadOnly mainMenuItems As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Show first submenu",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems1)
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[2] Show second submenu",
                   .Key = ConsoleKey.D2,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems2)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The first submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems1 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print a 'Hello World!'",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             Console.WriteLine("Hello World!")
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The second submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems2 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print the current date.",
                   .Key = ConsoleKey.D1,
                   .Command = Sub()
                                  Console.WriteLine(Date.Today.ToLongDateString)
                              End Sub
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' A menu item that exists from console.
   ''' </summary>
   Private ReadOnly menuItemExit As New ConsoleMenuItem With
   {
       .Text = "[X] Exit...",
       .Key = ConsoleKey.X,
       .Command = AddressOf EndConsole
   }


El resto ya solo es darle el formato de texto deseado al menú, y procesar la entrada del teclado:

Código (vbnet) [Seleccionar]
   ''' <summary>
   ''' Defines the entry point of the application.
   ''' </summary>
   Public Sub Main()

       ShowMenu(mainMenuItems)
       System.Threading.Thread.Sleep(Integer.MaxValue)

   End Sub

   ''' <summary>
   ''' Shows a console menu.
   ''' </summary>
   ''' <param name="menuItems">The items that composes the menu.</param>
   ''' <param name="itemIndicator">A string that indicates the current menu item.</param>
   Private Sub ShowMenu(ByVal menuItems As IEnumerable(Of ConsoleMenuItem),
                        Optional ByVal itemIndicator As String = " -> ")

       ' The selected menu item.
       Dim selectedItem As ConsoleMenuItem = menuItems(0)

       ' The index of the selected menu item.
       Dim selectedIndex As Integer

       ' The object to read the user-input pressed key.
       Dim currentKey As ConsoleKey

       ' Flag that determines wether the user pressed a valid menu item key.
       Dim itemKeyIsPressed As Boolean

       ' Wait for a valid menu item key.
       Do Until itemKeyIsPressed

           ' Iterate the menu items to format the menu string.
           Dim sb As New System.Text.StringBuilder
           With sb

               sb.AppendLine("===============================")
               sb.AppendLine("=========== My Menu ===========")
               sb.AppendLine("===============================")
               sb.AppendLine()

               For Each menuItem As ConsoleMenuItem In menuItems
                   If menuItem Is selectedItem Then
                       sb.AppendLine(String.Format("{0}{1}", itemIndicator, menuItem.Text))
                   Else
                       sb.AppendLine(menuItem.Text.Insert(0, New String(" "c, itemIndicator.Length)))
                   End If
               Next menuItem

               sb.AppendLine()
               sb.AppendLine("===============================")

           End With

           ' Clear the screen.
           Console.Clear()

           ' Print the menu items.
           Console.WriteLine(sb.ToString)

           ' Wait for user-input.
           currentKey = Console.ReadKey(True).Key

           ' Handle the pressed key.
           Select Case currentKey

               Case ConsoleKey.DownArrow ' Decrease current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex < (menuItems.Count - 1) Then
                       selectedItem = menuItems(selectedIndex + 1)
                   Else
                       selectedItem = menuItems.First
                   End If

               Case ConsoleKey.UpArrow  ' Increase current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex <> 0 Then
                       selectedItem = menuItems(selectedIndex - 1)
                   Else
                       selectedItem = menuItems.Last
                   End If

               Case ConsoleKey.Enter ' Run the selected item's command.
                   itemKeyIsPressed = True
                   selectedItem.Command.Invoke()

               Case ConsoleKey.Backspace ' Return to previous menu (if any).
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = ConsoleKey.R).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

               Case Else
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = currentKey).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

           End Select

       Loop

   End Sub

   ''' <summary>
   ''' Terminates the application.
   ''' </summary>
   Private Sub EndConsole()

       Environment.Exit(exitCode:=0)

   End Sub





El source completo, en VB:

Código (vbnet) [Seleccionar]
Module Module1

   ''' <summary>
   ''' Defines a Console Menu Item.
   ''' </summary>
   Public NotInheritable Class ConsoleMenuItem

       ''' <summary>
       ''' Gets or sets the item text.
       ''' </summary>
       ''' <value>The item text.</value>
       Public Property Text As String

       ''' <summary>
       ''' Gets or sets the <see cref="ConsoleKey"/> that activates this item.
       ''' </summary>
       ''' <value>The <see cref="ConsoleKey"/> that activates this item.</value>
       Public Property Key As ConsoleKey

       ''' <summary>
       ''' Gets or sets the associated <see cref="Command"/> for this item.
       ''' </summary>
       ''' <value>The associated <see cref="Command"/> for this item.</value>
       Public Property Command As Action

   End Class

   ''' <summary>
   ''' A menu item that exists from console.
   ''' </summary>
   Private ReadOnly menuItemExit As New ConsoleMenuItem With
   {
       .Text = "[X] Exit...",
       .Key = ConsoleKey.X,
       .Command = AddressOf EndConsole
   }

   ''' <summary>
   ''' The main menu items.
   ''' </summary>
   Private ReadOnly mainMenuItems As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Show first submenu",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems1)
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[2] Show second submenu",
                   .Key = ConsoleKey.D2,
                   .Command = New Action(Sub()
                                             ShowMenu(subMenuItems2)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The first submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems1 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print a 'Hello World!'",
                   .Key = ConsoleKey.D1,
                   .Command = New Action(Sub()
                                             Console.WriteLine("Hello World!")
                                         End Sub)
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' The second submenu items.
   ''' </summary>
   Private ReadOnly subMenuItems2 As IEnumerable(Of ConsoleMenuItem) =
       {
           New ConsoleMenuItem With
               {
                   .Text = "[1] Print the current date.",
                   .Key = ConsoleKey.D1,
                   .Command = Sub()
                                  Console.WriteLine(Date.Today.ToLongDateString)
                              End Sub
               },
           New ConsoleMenuItem With
               {
                   .Text = "[R] Return",
                   .Key = ConsoleKey.R,
                   .Command = New Action(Sub()
                                             ShowMenu(mainMenuItems)
                                         End Sub)},
           menuItemExit
       }

   ''' <summary>
   ''' Defines the entry point of the application.
   ''' </summary>
   Public Sub Main()

       ShowMenu(mainMenuItems)
       System.Threading.Thread.Sleep(Integer.MaxValue)

   End Sub

   ''' <summary>
   ''' Shows a console menu.
   ''' </summary>
   ''' <param name="menuItems">The items that composes the menu.</param>
   ''' <param name="itemIndicator">A string that indicates the current menu item.</param>
   Private Sub ShowMenu(ByVal menuItems As IEnumerable(Of ConsoleMenuItem),
                        Optional ByVal itemIndicator As String = " -> ")

       ' The selected menu item.
       Dim selectedItem As ConsoleMenuItem = menuItems(0)

       ' The index of the selected menu item.
       Dim selectedIndex As Integer

       ' The object to read the user-input pressed key.
       Dim currentKey As ConsoleKey

       ' Flag that determines wether the user pressed a valid menu item key.
       Dim itemKeyIsPressed As Boolean

       ' Wait for a valid menu item key.
       Do Until itemKeyIsPressed

           ' Iterate the menu items to format the menu string.
           Dim sb As New System.Text.StringBuilder
           With sb

               sb.AppendLine("===============================")
               sb.AppendLine("=========== My Menu ===========")
               sb.AppendLine("===============================")
               sb.AppendLine()

               For Each menuItem As ConsoleMenuItem In menuItems
                   If menuItem Is selectedItem Then
                       sb.AppendLine(String.Format("{0}{1}", itemIndicator, menuItem.Text))
                   Else
                       sb.AppendLine(menuItem.Text.Insert(0, New String(" "c, itemIndicator.Length)))
                   End If
               Next menuItem

               sb.AppendLine()
               sb.AppendLine("===============================")

           End With

           ' Clear the screen.
           Console.Clear()

           ' Print the menu items.
           Console.WriteLine(sb.ToString)

           ' Wait for user-input.
           currentKey = Console.ReadKey(True).Key

           ' Handle the pressed key.
           Select Case currentKey

               Case ConsoleKey.DownArrow ' Decrease current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex < (menuItems.Count - 1) Then
                       selectedItem = menuItems(selectedIndex + 1)
                   Else
                       selectedItem = menuItems.First
                   End If

               Case ConsoleKey.UpArrow  ' Increase current item selection.
                   selectedIndex = menuItems.ToList.IndexOf(selectedItem)
                   If selectedIndex <> 0 Then
                       selectedItem = menuItems(selectedIndex - 1)
                   Else
                       selectedItem = menuItems.Last
                   End If

               Case ConsoleKey.Enter ' Run the selected item's command.
                   itemKeyIsPressed = True
                   selectedItem.Command.Invoke()

               Case ConsoleKey.Backspace ' Return to previous menu (if any).
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = ConsoleKey.R).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

               Case Else
                   Dim foundItem As ConsoleMenuItem =
                       (From item As ConsoleMenuItem In menuItems
                        Where item.Key = currentKey).FirstOrDefault

                   If foundItem IsNot Nothing Then
                       itemKeyIsPressed = True
                       selectedItem = foundItem
                       selectedItem.Command.Invoke()
                   End If

           End Select

       Loop

   End Sub

   ''' <summary>
   ''' Terminates the application.
   ''' </summary>
   Private Sub EndConsole()

       Environment.Exit(exitCode:=0)

   End Sub

End Module


Traducción online a C# (sin testear):
Código (csharp) [Seleccionar]

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

static class Module1
{
/// <summary>
/// Defines a Console Menu Item.
/// </summary>
public sealed class ConsoleMenuItem
{
/// <summary>
/// Gets or sets the item text.
/// </summary>
/// <value>The item text.</value>
public string Text { get; set; }

/// <summary>
/// Gets or sets the <see cref="ConsoleKey"/> that activates this item.
/// </summary>
/// <value>The <see cref="ConsoleKey"/> that activates this item.</value>
public ConsoleKey Key { get; set; }

/// <summary>
/// Gets or sets the associated <see cref="Command"/> for this item.
/// </summary>
/// <value>The associated <see cref="Command"/> for this item.</value>
public Action Command { get; set; }

}

/// <summary>
/// A menu item that exists from console.
/// </summary>
private static readonly ConsoleMenuItem menuItemExit = new ConsoleMenuItem {
Text = "[X] Exit...",
Key = ConsoleKey.X,
Command = EndConsole

};
/// <summary>
/// The main menu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> mainMenuItems = {
new ConsoleMenuItem {
Text = "[1] Show first submenu",
Key = ConsoleKey.D1,
Command = new Action(() => { ShowMenu(subMenuItems1); })
},
new ConsoleMenuItem {
Text = "[2] Show second submenu",
Key = ConsoleKey.D2,
Command = new Action(() => { ShowMenu(subMenuItems2); })
},
menuItemExit

};
/// <summary>
/// The first submenu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> subMenuItems1 = {
new ConsoleMenuItem {
Text = "[1] Print a 'Hello World!'",
Key = ConsoleKey.D1,
Command = new Action(() => { Console.WriteLine("Hello World!"); })
},
new ConsoleMenuItem {
Text = "[R] Return",
Key = ConsoleKey.R,
Command = new Action(() => { ShowMenu(mainMenuItems); })
},
menuItemExit

};
/// <summary>
/// The second submenu items.
/// </summary>
private static readonly IEnumerable<ConsoleMenuItem> subMenuItems2 = {
new ConsoleMenuItem {
Text = "[1] Print the current date.",
Key = ConsoleKey.D1,
Command = () => { Console.WriteLine(System.DateTime.Today.ToLongDateString); }
},
new ConsoleMenuItem {
Text = "[R] Return",
Key = ConsoleKey.R,
Command = new Action(() => { ShowMenu(mainMenuItems); })
},
menuItemExit

};
/// <summary>
/// Defines the entry point of the application.
/// </summary>

public static void Main()
{
ShowMenu(mainMenuItems);
System.Threading.Thread.Sleep(int.MaxValue);
}

/// <summary>
/// Shows a console menu.
/// </summary>
/// <param name="menuItems">The items that composes the menu.</param>
/// <param name="itemIndicator">A string that indicates the current menu item.</param>

private static void ShowMenu(IEnumerable<ConsoleMenuItem> menuItems, string itemIndicator = " -> ")
{
// The selected menu item.
ConsoleMenuItem selectedItem = menuItems(0);

// The index of the selected menu item.
int selectedIndex = 0;

// The object to read the user-input pressed key.
ConsoleKey currentKey = default(ConsoleKey);

// Flag that determines wether the user pressed a valid menu item key.
bool itemKeyIsPressed = false;

// Wait for a valid menu item key.

while (!(itemKeyIsPressed)) {
// Iterate the menu items to format the menu string.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
var _with1 = sb;

sb.AppendLine("===============================");
sb.AppendLine("=========== My Menu ===========");
sb.AppendLine("===============================");
sb.AppendLine();

foreach (ConsoleMenuItem menuItem in menuItems) {
if (object.ReferenceEquals(menuItem, selectedItem)) {
sb.AppendLine(string.Format("{0}{1}", itemIndicator, menuItem.Text));
} else {
sb.AppendLine(menuItem.Text.Insert(0, new string(' ', itemIndicator.Length)));
}
}

sb.AppendLine();
sb.AppendLine("===============================");


// Clear the screen.
Console.Clear();

// Print the menu items.
Console.WriteLine(sb.ToString);

// Wait for user-input.
currentKey = Console.ReadKey(true).Key;

// Handle the pressed key.
switch (currentKey) {

case ConsoleKey.DownArrow:
// Decrease current item selection.
selectedIndex = menuItems.ToList.IndexOf(selectedItem);
if (selectedIndex < (menuItems.Count - 1)) {
selectedItem = menuItems(selectedIndex + 1);
} else {
selectedItem = menuItems.First;
}

break;
case ConsoleKey.UpArrow:
// Increase current item selection.
selectedIndex = menuItems.ToList.IndexOf(selectedItem);
if (selectedIndex != 0) {
selectedItem = menuItems(selectedIndex - 1);
} else {
selectedItem = menuItems.Last;
}

break;
case ConsoleKey.Enter:
// Run the selected item's command.
itemKeyIsPressed = true;
selectedItem.Command.Invoke();

break;
case ConsoleKey.Backspace:
// Return to previous menu (if any).
ConsoleMenuItem foundItem = (from item in menuItemswhere item.Key == ConsoleKey.R).FirstOrDefault;

if (foundItem != null) {
itemKeyIsPressed = true;
selectedItem = foundItem;
selectedItem.Command.Invoke();
}

break;
default:
ConsoleMenuItem foundItem = (from item in menuItemswhere item.Key == currentKey).FirstOrDefault;

if (foundItem != null) {
itemKeyIsPressed = true;
selectedItem = foundItem;
selectedItem.Command.Invoke();
}
break;
}
}
}

/// <summary>
/// Terminates the application.
/// </summary>
private static void EndConsole()
{
Environment.Exit(exitCode: 0);
}
}

//=======================================================
//Service provided by Telerik (www.telerik.com)
//Facebook: facebook.com/telerik
//=======================================================


Saludos








Meta

Gracias.

Lo he estado analizando, a pesar de tener buenos resultados, para mi es complicado. Seguiré con lo que iba.

Tengo más o menos los menús hecho en modo consola gracias aquí. Ahora seguiré un paso más, la parte de configurar el puerto serie. A pesar que aquí lo indica, quiero hacerlo de otra manera, no de modo automático haciéndonte preguntas cada vez que inicias la aplicación sobre configurar el puerto serie.

Viendo el código base y que está vacío. En este momento quiero centrarme en el menú número 2. Configuración. Donde al pulsar el número 2 pueda configurar el puerto como queramos, los baudios, número del puerto y demás. Por supuesto, al iniciar nuestro programa C#, está configurado de modo predeterminado como cualquier otro programa.



Centrado en este código de abajo, quiero que se muestre los parámetros del puerto serie por defecto y que lo pueda cambiar. Supuestamente pulsado Tabular me cambia de posición en l aventana, pero este caso no lo hace.



Trozo de código que no me sale donde posicionar el cursor para introducir datos.

Código (csharp) [Seleccionar]
    class Configuracion
    {
        public void Modal_Configuracion()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine(@"
┌─────────────────────────────────────────────────────────────────────────────┐
│                               CONFIGURACIÓN                                 │
└─────────────────────────────────────────────────────────────────────────────┘

");
                //Console.WriteLine("Pulse 0 para vovler al menú principal.");

                Console.CursorVisible = true; // Mostrar cursor.
                Console.SetCursorPosition(10, 5); // Pisición del cursor.
                Console.Write("Puerto COM       :");
                Console.SetCursorPosition(10, 6);
                Console.Write("Bits por segundo :");
                Console.SetCursorPosition(10, 7);
                Console.Write("Bits de datos    :");
                Console.SetCursorPosition(10, 8);
                Console.Write("Paridad          :");
                Console.SetCursorPosition(10, 9);
                Console.Write("Bits de parada   :");
                Console.SetCursorPosition(10, 10);
                Console.Write("Control de flujo :");

                Console.ReadLine();
               

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }


Código Completo de lo que he hecho hasta ahora justo abajo.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO.Ports; // No olvidar.
using System.Threading;

namespace PuertoCOM_CS_PRUEBA
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Modal();
        }

        void Modal()
        {
            for (; ; )
            {
                Console.Title = "Interfaz puerto serie - v 0.03"; // Mostrar título en la ventana de la consola.

                string Menu_Principal = @"
╔═════════════════════════════════════════════════════════════════════════════╗
║                               MENÚ PRINCIPAL                                ║
╠═════════════════════════════════════════════════════════════════════════════╣
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                            0. Salir.                                        ║
║                            1. Interfaz.                                     ║
║                            2. Configuración.                                ║
║                            3. Guardar configuración.                        ║
║                            4. Información desde el dispositivo.             ║
║                            5. Ayuda.                                        ║
║                            6. Acerca de ...                                 ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
║                                                                             ║
╚═════════════════════════════════════════════════════════════════════════════╝
";
                Console.CursorVisible = false; // Ocultar cursor.
                Console.Clear(); // Limpiar pantalla.
                Console.Write(Menu_Principal); // Mostrar menú principal.
                ConsoleKeyInfo switchExpression = Console.ReadKey(); // Detactar una tecla del teclado.

                switch (switchExpression.KeyChar)
                {
                    case '0':
                        return;

                    case '1':
                        new Interfaz().Modal_Interfaz();
                        break;

                    case '2':
                        new Configuracion().Modal_Configuracion();
                        break;

                    case '3':
                        new Guardar_Configuracion().Modal_Guardar_Configuracion();
                        break;

                    case '4':
                        new Informacion().Modal_Informacion();
                        break;

                    case '5':
                        new Ayuda().Modal_Ayuda();
                        break;

                    case '6':
                        new Acerca_de().Modal_Acerca_de();
                        break;

                    default:
                        Console.WriteLine("No has elegido ninguna opción. Vuelva teclear del 0 al 68.");
                        break;
                }
            }

        }
    }

    class Interfaz
    {
        public void Modal_Interfaz()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== INTERFAZ =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Configuracion
    {
        public void Modal_Configuracion()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine(@"
┌─────────────────────────────────────────────────────────────────────────────┐
│                               CONFIGURACIÓN                                 │
└─────────────────────────────────────────────────────────────────────────────┘

");
                //Console.WriteLine("Pulse 0 para vovler al menú principal.");

                Console.CursorVisible = true; // Mostrar cursor.
                Console.SetCursorPosition(10, 5); // Pisición del cursor.
                Console.Write("Puerto COM       :");
                Console.SetCursorPosition(10, 6);
                Console.Write("Bits por segundo :");
                Console.SetCursorPosition(10, 7);
                Console.Write("Bits de datos    :");
                Console.SetCursorPosition(10, 8);
                Console.Write("Paridad          :");
                Console.SetCursorPosition(10, 9);
                Console.Write("Bits de parada   :");
                Console.SetCursorPosition(10, 10);
                Console.Write("Control de flujo :");

                Console.ReadLine();
               

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Guardar_Configuracion
    {
        public void Modal_Guardar_Configuracion()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== GUARDAR CONFIGURACIÓN =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Informacion
    {
        public void Modal_Informacion()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== INFORMACION =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Ayuda
    {
        public void Modal_Ayuda()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== AYUDA =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }

    class Acerca_de
    {
        public void Modal_Acerca_de()
        {
            for (; ; )
            {
                Console.Clear();
                Console.WriteLine("===== ACERCA DE ... =====");
                Console.WriteLine("Pulse 0 para vovler al menú principal.");

                ConsoleKeyInfo op = Console.ReadKey();

                switch (op.KeyChar)
                {
                    case '0':
                        return;

                    default:
                        break;
                }
            }
        }
    }
}


Saludos.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/