Hola
@You are not allowed to view links.
Register or Login, me disculpo si la siguiente respuesta no concuerda a tu pregunta pero te explico lo que pude entender de tu dilema.
Despues de haber creado la "
frase" se presiona
ENTER, y lo que quieres es elegir entre las opciones
ATRAS y
GUARDAR dibujando el simbolo
> antes de dicha opcion. Y que luego de seleccionar dicha opcion el programa te permita seguir editando la "
frase" antes creada. O me equivoco?
De no ser asi, te ofrezco una posible solucion.
Primero no necesitas usar tantas clases. Basta con:
using System;
Luego por simple mania y para poder redibujar la consola de una manera mas accesible cree la funcion
MainMenu:
private static void MainMenu(){
Console.Clear();
Console.SetCursorPosition(0, 0);
Console.Write("Nombre del relé 1: ");
Console.SetCursorPosition(0, 1);
for (int i = 0; i < roINDICE_ARRAY.Length; i++)
{
Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
}
Console.SetCursorPosition(2, 3);
Console.Write(roTEXTO[0]); // ATRÁS.
Console.SetCursorPosition(12, 3);
Console.Write(roTEXTO[1]); // GUARDAR.
}
Luego en las primeras lineas del bucle principal, se modifica de la siguiente manera:
while (true){
index = 0;
if(tecla == ConsoleKey.Enter || tecla == ConsoleKey.RightArrow || tecla == ConsoleKey.LeftArrow){
MainMenu();
}
Compara la tecla presionada anteriormente, cuando se esta en modo "
edicion", por asi decirlo, y solamente redibuja la pantalla si se presiono
ENTER,
-> o
<-, para asi tener que evitar llamar a la funcion
MainMenu y que parpadee mucho la consola.
Despues sigue la seccion de construir la "
frase" y mas abajo esta la nueva modificacion:
while((tecla = Console.ReadKey(true).Key) != ConsoleKey.Enter){
switch (tecla){
case ConsoleKey.RightArrow:
index = 1;
Console.SetCursorPosition(1, 3);
Console.Write(" ");
Console.SetCursorPosition(10, 3);
Console.Write(">");
break;
case ConsoleKey.LeftArrow:
Console.SetCursorPosition(10, 3);
Console.Write(" ");
Console.SetCursorPosition(1, 3);
Console.Write(">");
index = 0;
break;
case ConsoleKey.UpArrow:
case ConsoleKey.DownArrow:
Console.SetCursorPosition(coordenadaX, 1);
break;
}
}
Siendo la linea:
while((tecla = Console.ReadKey(true).Key) != ConsoleKey.Enter){
una condicion que se cumplira mientras no se precione la tecla
ENTER.
Luego el siguiente segmento que se ejecuta al presionar la tecla
->:
index = 1;
Console.SetCursorPosition(1, 3);
Console.Write(" ");
Console.SetCursorPosition(10, 3);
Console.Write(">");
el cual borra el
> escrito anteriormente al lado de
ATRAS y lo dibuja entes de la palabra
GUARDAR, ademas se le asigna
1 a la variable
index.
Lo mismo pero a la inversa si se presiona la tecla
<-:
Console.SetCursorPosition(10, 3);
Console.Write(" ");
Console.SetCursorPosition(1, 3);
Console.Write(">");
index = 0;
borra el
> que se encuentra al lado de
GUARDAR y lo dibuja al lado de
ATRAS, y se le asigna el valor de
0 a la variable
index. Asi se logra un "efecto" de navegacion entre las opciones disponibles ya que mientras no presiones
ENTER dibuja
> al lado de la opcion correspondiente.
Otra modificacion "significativa" seria en al funcion
Guardar:
private static void Guardar(){
guardarNombre = ""; // <--- Aqui
Console.Clear();
Console.SetCursorPosition(0, 1);
Console.Write("HAS GUARDADO ");
for (int a = 0; a < roINDICE_ARRAY.Length; a++)
{
guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
}
Console.SetCursorPosition(0, 2);
Console.Write(guardarNombre);
Console.ReadKey(); // <--- Aqui
}
Primero "resetear" la variable
guardarNombre para evitar agregar los datos antes "seteados", y la llamada a
Console.ReadKey() para mostrar el mensaje por pantalla sin que se esfume de una vez.
Por ultimo este segmento de codigo es innecesario:
for (int a = 0; a < 2; a++)
{
Console.SetCursorPosition(1 + (10 * a), 3);
if (a == index)
{
Console.Write(">");
}
else
{
Console.Write(" ");
}
}
Concluyendo, tu codigo podria quedar de la siguiente manera:
using System;
namespace LCD_nombre_archivo_consola_08
{
class Program
{
static string guardarNombre = "";
static int coordenadaX = 0;
private static ConsoleKey tecla;
// Caracteres de este array.
static readonly char[] roALFANUMERICO = new char[]
{
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
'¿', '?', '(', ')', '[', ']', '{', '}','=', '$','&', '"', ' '
};
// Dirección del carácter del array. El 80 presenta al espacio del array roALFANUMERICO.
static readonly int[] roINDICE_ARRAY = new int[]
{
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
};
private static readonly string[] roTEXTO = new string[] { "ATRÁS", "GUARDAR" };
static int index = 0;
static void Main(string[] args)
{
// Título de la pantalla.
Console.Title = "Cambiar nombre";
Inicio();
}
private static void MainMenu(){
Console.Clear();
Console.SetCursorPosition(0, 0);
Console.Write("Nombre del relé 1: ");
Console.SetCursorPosition(0, 1);
for (int i = 0; i < roINDICE_ARRAY.Length; i++)
{
Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
}
Console.SetCursorPosition(2, 3);
Console.Write(roTEXTO[0]); // ATRÁS.
Console.SetCursorPosition(12, 3);
Console.Write(roTEXTO[1]); // GUARDAR.
}
#region Inico.
private static void Inicio()
{
Console.SetWindowSize(20, 5);
Console.BackgroundColor = ConsoleColor.Gray;
Console.ForegroundColor = ConsoleColor.Black;
MainMenu();
while (true)
{
index = 0;
if(tecla == ConsoleKey.Enter || tecla == ConsoleKey.RightArrow || tecla == ConsoleKey.LeftArrow){
MainMenu();
}
Console.SetCursorPosition(coordenadaX, 1);
tecla = Console.ReadKey(true).Key;
switch (tecla)
{
case ConsoleKey.RightArrow:
if (coordenadaX < 15)
{
coordenadaX++;
}
break;
case ConsoleKey.LeftArrow:
if (coordenadaX > 0)
{
coordenadaX--;
}
break;
case ConsoleKey.UpArrow:
roINDICE_ARRAY[coordenadaX]++;
if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
{
roINDICE_ARRAY[coordenadaX] = 0;
}
Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
break;
case ConsoleKey.DownArrow:
roINDICE_ARRAY[coordenadaX]--;
if (roINDICE_ARRAY[coordenadaX] < 0)
{
roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
}
Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
break;
case ConsoleKey.Enter:
Console.SetCursorPosition(1, 3);
Console.CursorVisible = false;
Console.Write(">");
while((tecla = Console.ReadKey(true).Key) != ConsoleKey.Enter){
switch (tecla)
{
case ConsoleKey.RightArrow:
index = 1;
Console.SetCursorPosition(1, 3);
Console.Write(" ");
Console.SetCursorPosition(10, 3);
Console.Write(">");
break;
case ConsoleKey.LeftArrow:
Console.SetCursorPosition(10, 3);
Console.Write(" ");
Console.SetCursorPosition(1, 3);
Console.Write(">");
index = 0;
break;
case ConsoleKey.UpArrow:
case ConsoleKey.DownArrow:
Console.SetCursorPosition(coordenadaX, 1);
break;
}
}
if (index == 0){
Atras();
}
if (index == 1){
Guardar();
}
break;
}
}
}
#endregion
private static void Atras()
{
Console.Clear();
Console.SetCursorPosition(0, 1);
Console.Write("HAS PULSADO ATRÁS ");
Console.ReadKey(); // Pulse cualquier tecla para salir.
}
private static void Guardar()
{
guardarNombre = "";
Console.Clear();
Console.SetCursorPosition(0, 1);
Console.Write("HAS GUARDADO ");
for (int a = 0; a < roINDICE_ARRAY.Length; a++)
{
guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
}
Console.SetCursorPosition(0, 2);
Console.Write(guardarNombre);
Console.ReadKey();
}
}
}
Espero te sirva de algo, saludos.