none
Cambiar letras RRS feed

  • Pregunta

  • Hola:

    Programando en modo consola. Usando solo las flechas del teclado y la tecla Enter quierlo cambiar un nombre en pantalla tal como aparece en este vídeo en el minuto :30. No veas todo el vídeo.

    Ver vídeo.

    En la pantalla pone.

    Escriba un nombre. Como máximo de 16 caracteres de largo.

    Segundo paso, sale el cursor parpadeando, indicado donde estás. Tal como se muestra en el vídeo. Estan todas las letras del abecedario, incluyendo el punto, coma y los números.

    Después habrá dos opciones para elegir.

    > Atrás y > Guardar.

    Atrás vuelve al menú de atrás, cosa que no haremos en esta ocasión porque es un ejemplo, al menos si lo señala dede el teclado el >. Y Guardar, que al pulsar Enter se guarda los datos, en P sería en un fichero, en un microcontrolador sería en su EERPOM interna o externa si tiene alguno. Cosa que en este sentido no lo vamos a usar.

    Esto parace un reto de muertos. Tiene pinta de muy complicado y extenso.

    Saludos.

    PD: Uso Visual studio Community 2019.


    http://electronica-pic.blogspot.com

    lunes, 30 de marzo de 2020 18:42

Respuestas

  • Hola Metaconta

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que para que la comunidad de foros te pueda asesorar mejor, es necesario que formules la pregunta de forma clara y específica

     

    Te recomiendo revisar el siguiente link que contiene una guía para crear consultas efectivas que te sirvan para obtener más y mejores respuestas

    https://social.technet.microsoft.com/wiki/contents/articles/33401.guia-para-formular-preguntas-en-el-foro.aspx

     

    Viendo el video que enviaste, deseas crear un programa capaz de interactuar con las flechas, Enter y otra tecla para ir hacia Atras cierto? Necesitas cambiar un nombre con ese formato y poder guardarlo.

    Tienes algun programa ya desarrollado o te tira algun error? Para nosotros es un placer atender tus consultas y ayudarte con investigaciones o ideas, pero lastimosamente no podemos hacer las tareas o trabajos que nos postees.

    Lluvia de ideas:

    EDIT: **Por eficiencia del programa es recomendado utilizar array de caracteres para manejar los textos**

    1 - Podrias utilizar una interfaz con Windows forms donde tengas listas de adyacencia entre Etiquetas, asi cada vez que se recibe el evento de flechas, podrias pasarte hacia los lados o bien si son las felchas arriba y abajo, podrias cambiar el texto de la Etiqueta, pasando la letra actual a la que sigue (debes tener una estructura de datos con todo el alfabeto, ya sea un String o podrias usar una lista circular para manejar cuando ya se dio una vuelta entera al alfabeto).

    2 - Otra podria ser en consola, utilizando la misma idea anterior, crear estructuras de datos para el display (lo que se vea en pantalla como el ejemplo de File Name: AAAAAAAA.TXT, podria ser una cadena de caracteres o String) y para las letras del alfabeto y para desplegarlo en pantalla, cada vez que se oprima una tecla (usando eventos), haces un clear de la consola para vaciarla, cambias lo que corresponda segun la tecla oprimida y luego haces un print del display. Por ejemplo:

    Imaginemos que tienes un indice en esa estructura de datos y para saber donde estas escribiendo uses una flecha impresa en consola con un espaciado segun el index
    (Digamos que estamos corriendolo por primera vez y el index esta en la primera posicion de la lista)

    File Name: AAAAAAAA.TXT

                        ↑ 

    PD: Con el codigo ASCII ALT + 24 puedes escribir una flecha hacia arriba para indicar donde estamos ↑

    Siguiendo la idea, si oprimes la flecha derecha, seria borrar la consola, aumentar el index y volver a imprimir en pantalla el display, no olvidando que la flecha debe tener un espacio mas que antes (por eso aumentamos el indice)

    File Name: AAAAAAAA.TXT

                          ↑ 

    Ahora bien si le das flecha hacia arriba, tendras que acceder a la lista del display, cambiar esa posicion a la siguiente letra, una vez hecho eso, vuelves a imprimir y quedaria:

    File Name: ABAAAAAA.TXT

                          ↑ 

    Espero te ayudara con la idea logica y la abstraccion, te adjunto algunos links por si gustas aprender mas sobre eventos, estucturas de datos o indexacion:

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/
    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/

    https://docs.microsoft.com/en-us/iis/extensions/smooth-streaming-client/circularlist-t-class-microsoft-web-media-diagnostics_1

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/using-indexers

    Siempre es un gusto atender tus preguntas.

    Gracias por usar los foros de MSDN.

     

    Luis Diego Mora

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.



    lunes, 30 de marzo de 2020 20:00
    Moderador
  • hola

    Lo unico que se me ocurre es algo como esto

    Gui.cs

    el cual fue explicado en la charla

    Retro.NET

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 30 de marzo de 2020 20:18
  • Hola Metaconta

    Ahora te escribo este programita. 

    Ya está. Este fue un poco más liviano.

    using System;
    
    namespace ConsoleAppChangeLetter
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.SetWindowSize(20, 4);
    
                int position = 0;
                ConsoleKey key;
    
                char[] chars = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'Ñ', 'O', 'P', 
                    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                int[] positions = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
    
                Console.SetCursorPosition(0, 2);
                Console.Write("AAAAAAAA");
    
                while (true) 
                {
                    Console.SetCursorPosition(position, 2);
    
                    key = Console.ReadKey(true).Key;
                    if (key == ConsoleKey.RightArrow && position < 8 - 1)
                        position++;
                    else if (key == ConsoleKey.LeftArrow && position > 0)
                        position--;
                    else if (key == ConsoleKey.UpArrow)
                    {
                        positions[position]++;
                        if (positions[position] >= chars.Length) 
                            positions[position] = 0;
                        Console.Write(chars[positions[position]]);
                    }
                    else if (key == ConsoleKey.DownArrow) 
                    {
                        positions[position]--;
                        if (positions[position] < 0) 
                            positions[position] = chars.Length - 1;
                        Console.Write(chars[positions[position]]);
                    }
                }
            }
        }
    }
    

    Espero te sea útil.

    Saludos

    Pablo


    • Marcado como respuesta Metaconta martes, 31 de marzo de 2020 0:48
    martes, 31 de marzo de 2020 0:07
  • Si, si pones 7 es lo mismo, yo puse 8 - 1 como indicando que 8 es el límite y se le resta 1 que es la última posición del vector.

    positions es un array que contiene las posiciones (8) de todas las letras, esas posiciones son los índices que comienzan en 0, que corresponde a la letra A, y pueden ir hasta chars.Length - 1, que sería el número 9. O sea, si yo voy hasta la letra 3 y muevo para arriba y para abajo, y después me corro para la derecha y muevo otra letra, cuando vuelvo a la letra 3 está en donde la dejé, y así todas. 

    Entonces, el array positions contiene la posición de las 8 letras (dentro del array chars, que contiene las letras y los números), y positions[position] se refiere a la posición de la letra que está en edición, ya que cuando te moves a la derecha y a la izquierda, position sube y baja, y con el el cursor.

    Cuando hago 

    positions[position]++;

    estoy aumentando en 1 la posición 'position' (que es donde está el cursor de la letra en edición) de la matriz positions, por ejemplo, el valor de positions[3], suponiendo que position vale 3, si era 'B', pasa a ser 'C'. Y si era '9', pasa a ser 'A', no se si te fijaste que si te pasas por arriba se empieza desde abajo, y viceversa.

    • Marcado como respuesta Metaconta martes, 31 de marzo de 2020 1:57
    martes, 31 de marzo de 2020 1:35

Todas las respuestas

  • Hola Metaconta

     

    Gracias por levantar tu consulta en los foros de MSDN. Estamos analizando su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

     

    Gracias por usar los foros de MSDN.

     


    Oscar Navarro

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    lunes, 30 de marzo de 2020 19:20
    Moderador
  • Hola Metaconta

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que para que la comunidad de foros te pueda asesorar mejor, es necesario que formules la pregunta de forma clara y específica

     

    Te recomiendo revisar el siguiente link que contiene una guía para crear consultas efectivas que te sirvan para obtener más y mejores respuestas

    https://social.technet.microsoft.com/wiki/contents/articles/33401.guia-para-formular-preguntas-en-el-foro.aspx

     

    Viendo el video que enviaste, deseas crear un programa capaz de interactuar con las flechas, Enter y otra tecla para ir hacia Atras cierto? Necesitas cambiar un nombre con ese formato y poder guardarlo.

    Tienes algun programa ya desarrollado o te tira algun error? Para nosotros es un placer atender tus consultas y ayudarte con investigaciones o ideas, pero lastimosamente no podemos hacer las tareas o trabajos que nos postees.

    Lluvia de ideas:

    EDIT: **Por eficiencia del programa es recomendado utilizar array de caracteres para manejar los textos**

    1 - Podrias utilizar una interfaz con Windows forms donde tengas listas de adyacencia entre Etiquetas, asi cada vez que se recibe el evento de flechas, podrias pasarte hacia los lados o bien si son las felchas arriba y abajo, podrias cambiar el texto de la Etiqueta, pasando la letra actual a la que sigue (debes tener una estructura de datos con todo el alfabeto, ya sea un String o podrias usar una lista circular para manejar cuando ya se dio una vuelta entera al alfabeto).

    2 - Otra podria ser en consola, utilizando la misma idea anterior, crear estructuras de datos para el display (lo que se vea en pantalla como el ejemplo de File Name: AAAAAAAA.TXT, podria ser una cadena de caracteres o String) y para las letras del alfabeto y para desplegarlo en pantalla, cada vez que se oprima una tecla (usando eventos), haces un clear de la consola para vaciarla, cambias lo que corresponda segun la tecla oprimida y luego haces un print del display. Por ejemplo:

    Imaginemos que tienes un indice en esa estructura de datos y para saber donde estas escribiendo uses una flecha impresa en consola con un espaciado segun el index
    (Digamos que estamos corriendolo por primera vez y el index esta en la primera posicion de la lista)

    File Name: AAAAAAAA.TXT

                        ↑ 

    PD: Con el codigo ASCII ALT + 24 puedes escribir una flecha hacia arriba para indicar donde estamos ↑

    Siguiendo la idea, si oprimes la flecha derecha, seria borrar la consola, aumentar el index y volver a imprimir en pantalla el display, no olvidando que la flecha debe tener un espacio mas que antes (por eso aumentamos el indice)

    File Name: AAAAAAAA.TXT

                          ↑ 

    Ahora bien si le das flecha hacia arriba, tendras que acceder a la lista del display, cambiar esa posicion a la siguiente letra, una vez hecho eso, vuelves a imprimir y quedaria:

    File Name: ABAAAAAA.TXT

                          ↑ 

    Espero te ayudara con la idea logica y la abstraccion, te adjunto algunos links por si gustas aprender mas sobre eventos, estucturas de datos o indexacion:

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/
    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/strings/

    https://docs.microsoft.com/en-us/iis/extensions/smooth-streaming-client/circularlist-t-class-microsoft-web-media-diagnostics_1

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/using-indexers

    Siempre es un gusto atender tus preguntas.

    Gracias por usar los foros de MSDN.

     

    Luis Diego Mora

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.



    lunes, 30 de marzo de 2020 20:00
    Moderador
  • hola

    Lo unico que se me ocurre es algo como esto

    Gui.cs

    el cual fue explicado en la charla

    Retro.NET

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 30 de marzo de 2020 20:18
  • Hola Metaconta

    Ahora te escribo este programita. 

    Ya está. Este fue un poco más liviano.

    using System;
    
    namespace ConsoleAppChangeLetter
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.SetWindowSize(20, 4);
    
                int position = 0;
                ConsoleKey key;
    
                char[] chars = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'Ñ', 'O', 'P', 
                    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                int[] positions = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
    
                Console.SetCursorPosition(0, 2);
                Console.Write("AAAAAAAA");
    
                while (true) 
                {
                    Console.SetCursorPosition(position, 2);
    
                    key = Console.ReadKey(true).Key;
                    if (key == ConsoleKey.RightArrow && position < 8 - 1)
                        position++;
                    else if (key == ConsoleKey.LeftArrow && position > 0)
                        position--;
                    else if (key == ConsoleKey.UpArrow)
                    {
                        positions[position]++;
                        if (positions[position] >= chars.Length) 
                            positions[position] = 0;
                        Console.Write(chars[positions[position]]);
                    }
                    else if (key == ConsoleKey.DownArrow) 
                    {
                        positions[position]--;
                        if (positions[position] < 0) 
                            positions[position] = chars.Length - 1;
                        Console.Write(chars[positions[position]]);
                    }
                }
            }
        }
    }
    

    Espero te sea útil.

    Saludos

    Pablo


    • Marcado como respuesta Metaconta martes, 31 de marzo de 2020 0:48
    martes, 31 de marzo de 2020 0:07
  • Buenas gente:

    La idea es muy buena.

    Estaba viendo las ideas tuyas. Es bueno guardar el alfabeto y cambiar.

    Estaba comparando cual es el más adecuado a parte de lo que comentaste, también en estas. Ventajas y desventajas.

    1. Array.
    2. Dictionary.
    3. Enum.
    4. List.

    Los que tenga mucha experiencia en programación, sabrán cual es adecuado.

    Si me llevo por el array (no se si es el más adecuado para lo que quiero hacer), tendría que hacerlo así. Por la explicación que he entendido arriba.

    		string[] weekDays2 = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
    			"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",
    		 ".", ",", "-", "_"};

    ;)


    http://electronica-pic.blogspot.com

    martes, 31 de marzo de 2020 0:15
  • Hola Metaconta

    Ahora te escribo este programita. 

    Ya está. Este fue un poco más liviano.

    using System;
    
    namespace ConsoleAppChangeLetter
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.SetWindowSize(20, 4);
    
                int position = 0;
                ConsoleKey key;
    
                char[] chars = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'Ñ', 'O', 'P', 
                    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                int[] positions = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
    
                Console.SetCursorPosition(0, 2);
                Console.Write("AAAAAAAA");
    
                while (true) 
                {
                    Console.SetCursorPosition(position, 2);
    
                    key = Console.ReadKey(true).Key;
                    if (key == ConsoleKey.RightArrow && position < 8 - 1)
                        position++;
                    else if (key == ConsoleKey.LeftArrow && position > 0)
                        position--;
                    else if (key == ConsoleKey.UpArrow)
                    {
                        positions[position]++;
                        if (positions[position] >= chars.Length) 
                            positions[position] = 0;
                        Console.Write(chars[positions[position]]);
                    }
                    else if (key == ConsoleKey.DownArrow) 
                    {
                        positions[position]--;
                        if (positions[position] < 0) 
                            positions[position] = chars.Length - 1;
                        Console.Write(chars[positions[position]]);
                    }
                }
            }
        }
    }

    Espero te sea útil.

    Saludos

    Pablo


    TE me adelantaste 10 minutos. JAjajajaja.

    Voy a probarlo.

    ¿Por qué así?

     char[] chars = new char[] { 'A', 'B', 'C', 'D

    En vez de así.

     char[] { 'A', 'B', 'C', 'D


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 31 de marzo de 2020 0:21
    martes, 31 de marzo de 2020 0:20
  • Es 

    char[] chars = new char[] { 'A', 'B', 'C', 'D', ........

    porque estoy creando y guardando en la variable chars todos los caracteres necesarios.

    Además no existe algo como

    char[] { 'A', 'B', 'C', 'D', ........

    Qué sería esto? No estoy asignando a nada, ni hay operador new, ...

    martes, 31 de marzo de 2020 0:31
  • Perdón.

    char[] { 'A', 'B', 'C', 'D', ........ solo así no.

    Así.

    nombreVariable = char[] { 'A', 'B', 'C', 'D', ........

    He probado tu programa, funciona perfecto.

    Voy a ampliar algunas cosas más que ya contaré.


    http://electronica-pic.blogspot.com


    • Editado Metaconta martes, 31 de marzo de 2020 0:49
    martes, 31 de marzo de 2020 0:45
  • Para crear matrices, o arrays o vectores (de 1 o más dimensiones) se utiliza el operador new, que crea objetos o instancias de matrices u otros objetos en otros casos.
    martes, 31 de marzo de 2020 0:48
  • positions[position]++;

    Por lo que entiendo, corrígeme si me equivoco, positions es el array que tiene muchos ceros.

    [position]++ la posición dentro del array y como tiene ++ añade una posición de más.

    También otra cosa.

    ¿Por qué abajo 8 - 1?

                    if ((key == ConsoleKey.RightArrow) && (position < 8 - 1))
                    {
                        position++;
                    }

    Si se cuenta del 0 al 7 que son 8, no pondría un 8. Para luego poner 8 - 1, simplemente pongo un 7. Lo he puesto y funciona bien. Es deicr, si pongo un 7, ya que que en realidad el 0 cuenta, que son 8 en total.


    http://electronica-pic.blogspot.com



    • Editado Metaconta martes, 31 de marzo de 2020 1:08
    martes, 31 de marzo de 2020 0:58
  • Si, si pones 7 es lo mismo, yo puse 8 - 1 como indicando que 8 es el límite y se le resta 1 que es la última posición del vector.

    positions es un array que contiene las posiciones (8) de todas las letras, esas posiciones son los índices que comienzan en 0, que corresponde a la letra A, y pueden ir hasta chars.Length - 1, que sería el número 9. O sea, si yo voy hasta la letra 3 y muevo para arriba y para abajo, y después me corro para la derecha y muevo otra letra, cuando vuelvo a la letra 3 está en donde la dejé, y así todas. 

    Entonces, el array positions contiene la posición de las 8 letras (dentro del array chars, que contiene las letras y los números), y positions[position] se refiere a la posición de la letra que está en edición, ya que cuando te moves a la derecha y a la izquierda, position sube y baja, y con el el cursor.

    Cuando hago 

    positions[position]++;

    estoy aumentando en 1 la posición 'position' (que es donde está el cursor de la letra en edición) de la matriz positions, por ejemplo, el valor de positions[3], suponiendo que position vale 3, si era 'B', pasa a ser 'C'. Y si era '9', pasa a ser 'A', no se si te fijaste que si te pasas por arriba se empieza desde abajo, y viceversa.

    • Marcado como respuesta Metaconta martes, 31 de marzo de 2020 1:57
    martes, 31 de marzo de 2020 1:35

  • estoy aumentando en 1 la posición 'position' (que es donde está el cursor de la letra en edición) de la matriz positions, por ejemplo, el valor de positions[3], suponiendo que position vale 3, si era 'B', pasa a ser 'C'. Y si era '9', pasa a ser 'A', no se si te fijaste que si te pasas por arriba se empieza desde abajo, y viceversa.

    Sí, si me fijé y mucho en el cual estoy agradecido. Pensé que el código era muy largo y tedioso. Pero no.

    Gracias.


    http://electronica-pic.blogspot.com

    martes, 31 de marzo de 2020 1:57
  • Hilo cerrado

    viernes, 3 de abril de 2020 19:44
    Moderador