none
Desplazamiento de cadenas de caracteres RRS feed

  • Pregunta

  • Hola:

    En modo consola C# 2019. Quiero hacer un desplazamiento tal como se muestra en este vídeo.

    Ver vídeo.

    Ya que este LCD se comporta como la consola de C#.

    ¿Qué técnican usan exactamente para lograrlo?

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 28 de marzo de 2020 22:27

Respuestas

  • Hola Metaconta

    Ahora te hago el programita.

    Ya está. 

    Extrañaba tus preguntas.

    using System;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            static void Main(string[] args)
            {
                string TextoDePrueba = "Texto de Prueba";
                string TextoMostrado = "";
                int position = 0;
                int sentido = 1;
                ConsoleKey tecla;
                
                Console.SetWindowSize(40, 5);
    
                DateTime tiempo = DateTime.Now;
                while (true) 
                {
                    tiempo = tiempo.AddMilliseconds(250);
                    // avanza una letra cada 250 milisegundos, que lo podes cambiar
    
                    if (Console.KeyAvailable) 
                    {
                        if ((tecla = Console.ReadKey(true).Key) == ConsoleKey.RightArrow)
                            sentido = 1;
                        else if (tecla == ConsoleKey.LeftArrow)
                            sentido = -1;
                        else if (tecla == ConsoleKey.Escape)
                            break;
                    }
    
                    if (position >= 0)
                    {
                        Console.SetCursorPosition(position, 1);
                        Console.Write(" ");
                    }
                    if (position + TextoDePrueba.Length - 1 < 40)
                    {
                        Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                        Console.Write(" ");
                    }
                    position += sentido;
                    if (position == 40)
                        position = -TextoDePrueba.Length + 1;
                    else if (position == -TextoDePrueba.Length) 
                        position = 40;
    
                    if (position < 0)
                        TextoMostrado = TextoDePrueba.Substring(-position);
                    else if (position + TextoDePrueba.Length >= 40)
                        TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                    else
                        TextoMostrado = TextoDePrueba;
    
                    Console.SetCursorPosition(position < 0 ? 0 : position, 1);
                    
                    Console.Write(TextoMostrado);
    
                    while (DateTime.Now < tiempo) 
                        ;
                }
            }
        }
    }
    

    Ojalá te sea útil.

    Saludos

    Pablo


    • Marcado como respuesta Metaconta domingo, 29 de marzo de 2020 2:12
    sábado, 28 de marzo de 2020 23:48
  • Hola

    Algo que olvidé decirte que no se si te diste cuenta es que con las teclas derecha e izquierda haces que el texto cambie de sentido, o sea, pase de ir hacia la izquierda o hacia la derecha.

    Lo que hice con el reloj, hace que se incluya en los 250 milisegundos el tiempo que tarda en imprimir el texto y chequear si hay una tecla pulsada (o sea, entre que transcurren los 250 ms, se ejecuta el código, no separado), si uso Thread.Sleep() ese tiempo sería sin incluir lo dicho, y si uso un timer creo que el costo del sistema es exactamente el mismo que lo que hice, pero si queres que lo cambie, decime y trato de hacerlo con Timer, debería ser lo mismo, quizás un poco más de código. 

    No entiendo el nuevo challenge, ¿que venga de izquierda a derecha y que se detenga al llegar al borde izquierdo? ¿Me lo explicas mejor? O sea, ¿y después que hace? Bueno, hasta entender eso bien, voy a agregarle una función de pausa, así lo podes detener donde quieras. 

    Con la tecla P lo pausas, pero podes cambiar la tecla.

    using System;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            static void Main(string[] args)
            {
                string TextoDePrueba = "Texto de Prueba";
                string TextoMostrado = "";
                int position = 0;
                int sentido = 1;
                bool pausado = false;
                ConsoleKey tecla;
    
                Console.SetWindowSize(40, 5);
    
                DateTime tiempo = DateTime.Now;
                while (true)
                {
                    tiempo = tiempo.AddMilliseconds(250);
                    // avanza una letra cada 250 milisegundos, que lo podes cambiar
    
                    if (Console.KeyAvailable)
                    {
                        if ((tecla = Console.ReadKey(true).Key) == ConsoleKey.RightArrow)
                            sentido = 1;
                        else if (tecla == ConsoleKey.LeftArrow)
                            sentido = -1;
                        else if (tecla == ConsoleKey.Escape)
                            break;
                        else if (tecla == ConsoleKey.P)
                            pausado = !pausado;
                    }
    
                    if (position >= 0)
                    {
                        Console.SetCursorPosition(position, 1);
                        Console.Write(" ");
                    }
                    if (position + TextoDePrueba.Length - 1 < 40)
                    {
                        Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                        Console.Write(" ");
                    }
                    if (pausado == false)
                        position += sentido;
                    if (position == 40)
                        position = -TextoDePrueba.Length + 1;
                    else if (position == -TextoDePrueba.Length)
                        position = 40;
    
                    if (position < 0)
                        TextoMostrado = TextoDePrueba.Substring(-position);
                    else if (position + TextoDePrueba.Length >= 40)
                        TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                    else
                        TextoMostrado = TextoDePrueba;
    
                    Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                    Console.Write(TextoMostrado);
    
                    while (DateTime.Now < tiempo)
                        ;
                }
            }
        }
    }
    

    Saludos

    • Marcado como respuesta Metaconta domingo, 29 de marzo de 2020 13:37
    domingo, 29 de marzo de 2020 13:05
  • Ok, aquí te paso lo último pedido con código mínimo.

    using System;
    using System.Timers;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            private static Timer timer;
            private static string TextoDePrueba = "Texto de Prueba";
            private static string TextoMostrado = "";
            private static int position = 39;
            private static int sentido = -1;
            private static ConsoleKey tecla;
    
            static void Main(string[] args)
            {
                Console.SetWindowSize(40, 5);
    
                timer = new Timer();
                timer.Interval = 250;
                timer.AutoReset = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);            
                timer.Enabled = true;
    
                Console.ReadLine();
            }
    
            private static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (position + TextoDePrueba.Length - 1 < 40)
                {
                    Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                    Console.Write(" ");
                }
                position += sentido;
                if (position == 40)
                    position = -TextoDePrueba.Length + 1;
                else if (position == -TextoDePrueba.Length)
                    position = 40;
    
                if (position == 0)
                    timer.Enabled = false;
    
                if (position < 0)
                    TextoMostrado = TextoDePrueba.Substring(-position);
                else if (position + TextoDePrueba.Length >= 40)
                    TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                else
                    TextoMostrado = TextoDePrueba;
    
                Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                Console.Write(TextoMostrado);
            }
        }
    }
    
    
    Saludos

    • Marcado como respuesta Metaconta lunes, 30 de marzo de 2020 3:02
    domingo, 29 de marzo de 2020 18:40

Todas las respuestas

  • Hola Metaconta

    Ahora te hago el programita.

    Ya está. 

    Extrañaba tus preguntas.

    using System;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            static void Main(string[] args)
            {
                string TextoDePrueba = "Texto de Prueba";
                string TextoMostrado = "";
                int position = 0;
                int sentido = 1;
                ConsoleKey tecla;
                
                Console.SetWindowSize(40, 5);
    
                DateTime tiempo = DateTime.Now;
                while (true) 
                {
                    tiempo = tiempo.AddMilliseconds(250);
                    // avanza una letra cada 250 milisegundos, que lo podes cambiar
    
                    if (Console.KeyAvailable) 
                    {
                        if ((tecla = Console.ReadKey(true).Key) == ConsoleKey.RightArrow)
                            sentido = 1;
                        else if (tecla == ConsoleKey.LeftArrow)
                            sentido = -1;
                        else if (tecla == ConsoleKey.Escape)
                            break;
                    }
    
                    if (position >= 0)
                    {
                        Console.SetCursorPosition(position, 1);
                        Console.Write(" ");
                    }
                    if (position + TextoDePrueba.Length - 1 < 40)
                    {
                        Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                        Console.Write(" ");
                    }
                    position += sentido;
                    if (position == 40)
                        position = -TextoDePrueba.Length + 1;
                    else if (position == -TextoDePrueba.Length) 
                        position = 40;
    
                    if (position < 0)
                        TextoMostrado = TextoDePrueba.Substring(-position);
                    else if (position + TextoDePrueba.Length >= 40)
                        TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                    else
                        TextoMostrado = TextoDePrueba;
    
                    Console.SetCursorPosition(position < 0 ? 0 : position, 1);
                    
                    Console.Write(TextoMostrado);
    
                    while (DateTime.Now < tiempo) 
                        ;
                }
            }
        }
    }
    

    Ojalá te sea útil.

    Saludos

    Pablo


    • Marcado como respuesta Metaconta domingo, 29 de marzo de 2020 2:12
    sábado, 28 de marzo de 2020 23:48
  • Muy bueno.

    Esperabas que usabas el Thread o el Timer, no el reloj, ejejjejejejje.

    ¿No será mejor usar el timer?

    Buen trabajo, funciona.

    Un mini ejemplo que no mensioné.

    Quiero que se comporte de otra manera.

    Que no haya nada en pantalla. Al ejecutar el programa, aparezca por cada 250 ms (como en tu ejemplo), desde la derecha a la izquierda, cuando llegue a la coordenada 0, 0. Se detiene el Texto.

    PD: No esperaba que me echaras de menos, si esperaba que aparecieras. ;)


    http://electronica-pic.blogspot.com



    • Editado Metaconta domingo, 29 de marzo de 2020 2:40
    domingo, 29 de marzo de 2020 2:14
  • Hola

    Algo que olvidé decirte que no se si te diste cuenta es que con las teclas derecha e izquierda haces que el texto cambie de sentido, o sea, pase de ir hacia la izquierda o hacia la derecha.

    Lo que hice con el reloj, hace que se incluya en los 250 milisegundos el tiempo que tarda en imprimir el texto y chequear si hay una tecla pulsada (o sea, entre que transcurren los 250 ms, se ejecuta el código, no separado), si uso Thread.Sleep() ese tiempo sería sin incluir lo dicho, y si uso un timer creo que el costo del sistema es exactamente el mismo que lo que hice, pero si queres que lo cambie, decime y trato de hacerlo con Timer, debería ser lo mismo, quizás un poco más de código. 

    No entiendo el nuevo challenge, ¿que venga de izquierda a derecha y que se detenga al llegar al borde izquierdo? ¿Me lo explicas mejor? O sea, ¿y después que hace? Bueno, hasta entender eso bien, voy a agregarle una función de pausa, así lo podes detener donde quieras. 

    Con la tecla P lo pausas, pero podes cambiar la tecla.

    using System;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            static void Main(string[] args)
            {
                string TextoDePrueba = "Texto de Prueba";
                string TextoMostrado = "";
                int position = 0;
                int sentido = 1;
                bool pausado = false;
                ConsoleKey tecla;
    
                Console.SetWindowSize(40, 5);
    
                DateTime tiempo = DateTime.Now;
                while (true)
                {
                    tiempo = tiempo.AddMilliseconds(250);
                    // avanza una letra cada 250 milisegundos, que lo podes cambiar
    
                    if (Console.KeyAvailable)
                    {
                        if ((tecla = Console.ReadKey(true).Key) == ConsoleKey.RightArrow)
                            sentido = 1;
                        else if (tecla == ConsoleKey.LeftArrow)
                            sentido = -1;
                        else if (tecla == ConsoleKey.Escape)
                            break;
                        else if (tecla == ConsoleKey.P)
                            pausado = !pausado;
                    }
    
                    if (position >= 0)
                    {
                        Console.SetCursorPosition(position, 1);
                        Console.Write(" ");
                    }
                    if (position + TextoDePrueba.Length - 1 < 40)
                    {
                        Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                        Console.Write(" ");
                    }
                    if (pausado == false)
                        position += sentido;
                    if (position == 40)
                        position = -TextoDePrueba.Length + 1;
                    else if (position == -TextoDePrueba.Length)
                        position = 40;
    
                    if (position < 0)
                        TextoMostrado = TextoDePrueba.Substring(-position);
                    else if (position + TextoDePrueba.Length >= 40)
                        TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                    else
                        TextoMostrado = TextoDePrueba;
    
                    Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                    Console.Write(TextoMostrado);
    
                    while (DateTime.Now < tiempo)
                        ;
                }
            }
        }
    }
    

    Saludos

    • Marcado como respuesta Metaconta domingo, 29 de marzo de 2020 13:37
    domingo, 29 de marzo de 2020 13:05
  • Muy bueno lo de la pausa pulsando p.

    Prefiero controlarlo con el timer aunque sea un poco más de código.

    Lo explico de otra manera. Este es otro ejemplo.

    1. Aparece la pantalla en negro, sin texto alguno.
    2. Por cada 250 ms, el texto aparece desde la derecha de la pantalla, hacia la izquierda.
    3. Cuando llegue a la derecha del todo, que es la posición de la pantalla 0, 0. El texto se detiene.
    4. Ya no hay que hacer más nada.

    Solo eso.


    http://electronica-pic.blogspot.com

    domingo, 29 de marzo de 2020 13:37
  • Es un poco más de código, y un poco más de complicación, pero no importa, aquí está, arranca desde la derecha y al llegar al borde izquierdo se detiene y ahí tenes que darle Enter para terminar, aunque si le das Enter antes termina antes, porque si no le pongo un Console.ReadLine() al final de Main() directamente termina el programa, no espera que el timer se ejecute. Por eso, en parte, es más complicado. 

    using System;
    using System.Timers;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            private static Timer timer;
            private static string TextoDePrueba = "Texto de Prueba";
            private static string TextoMostrado = "";
            private static int position = 39;
            private static int sentido = -1;
            private static bool pausado = false;
            private static ConsoleKey tecla;
    
            static void Main(string[] args)
            {
                Console.SetWindowSize(40, 5);
    
                timer = new Timer();
                timer.Interval = 250;
                timer.AutoReset = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);            
                timer.Enabled = true;
    
                Console.ReadLine();
            }
    
            private static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (Console.KeyAvailable)
                {
                    if ((tecla = Console.ReadKey(true).Key) == ConsoleKey.RightArrow)
                        sentido = 1;
                    else if (tecla == ConsoleKey.LeftArrow)
                        sentido = -1;
                    else if (tecla == ConsoleKey.Escape)
                        timer.Stop();
                    else if (tecla == ConsoleKey.P)
                        pausado = !pausado;
                }
    
                if (position >= 0)
                {
                    Console.SetCursorPosition(position, 1);
                    Console.Write(" ");
                }
                if (position + TextoDePrueba.Length - 1 < 40)
                {
                    Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                    Console.Write(" ");
                }
                if (pausado == false)
                    position += sentido;
                if (position == 40)
                    position = -TextoDePrueba.Length + 1;
                else if (position == -TextoDePrueba.Length)
                    position = 40;
    
                if (position == 0)
                    timer.Enabled = false;
    
                if (position < 0)
                    TextoMostrado = TextoDePrueba.Substring(-position);
                else if (position + TextoDePrueba.Length >= 40)
                    TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                else
                    TextoMostrado = TextoDePrueba;
    
                Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                Console.Write(TextoMostrado);
            }
        }
    }
    
    
    Ahora te hago lo de los menús en Win Forms, que lo vi de casualidad, porque está en el Sub Foro de Windows Forms, no en el de C# que es el que veo siempre directamente, pero bueno, lo tenía que ver y lo vi por suerte. 

    domingo, 29 de marzo de 2020 15:01
  • Gracias.

    En este ejemplo, olvidarse de pulsa flechas derecha e izquierda. Solo hace los 4 puntos arriba mensionado y ya está.

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 29 de marzo de 2020 16:02
  • Ok, aquí te paso lo último pedido con código mínimo.

    using System;
    using System.Timers;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            private static Timer timer;
            private static string TextoDePrueba = "Texto de Prueba";
            private static string TextoMostrado = "";
            private static int position = 39;
            private static int sentido = -1;
            private static ConsoleKey tecla;
    
            static void Main(string[] args)
            {
                Console.SetWindowSize(40, 5);
    
                timer = new Timer();
                timer.Interval = 250;
                timer.AutoReset = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);            
                timer.Enabled = true;
    
                Console.ReadLine();
            }
    
            private static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (position + TextoDePrueba.Length - 1 < 40)
                {
                    Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                    Console.Write(" ");
                }
                position += sentido;
                if (position == 40)
                    position = -TextoDePrueba.Length + 1;
                else if (position == -TextoDePrueba.Length)
                    position = 40;
    
                if (position == 0)
                    timer.Enabled = false;
    
                if (position < 0)
                    TextoMostrado = TextoDePrueba.Substring(-position);
                else if (position + TextoDePrueba.Length >= 40)
                    TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                else
                    TextoMostrado = TextoDePrueba;
    
                Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                Console.Write(TextoMostrado);
            }
        }
    }
    
    
    Saludos

    • Marcado como respuesta Metaconta lunes, 30 de marzo de 2020 3:02
    domingo, 29 de marzo de 2020 18:40
  • Funciona tal como lo quiero. Hay comentarios que puse porque no entiendo bien cosas.

    using System;
    using System.Timers;
    
    namespace DesplazamientoDeTexto
    {
        class Program
        {
            private static Timer timer;
            private static string TextoDePrueba = "Texto de Prueba";
            private static string TextoMostrado = "";
            private static int position = 39;
            private static int sentido = -1;
            private static ConsoleKey tecla;
    
            static void Main(string[] args)
            {
                Console.SetWindowSize(40, 5);
    
                timer = new Timer();
                timer.Interval = 250;
                timer.AutoReset = true;
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);            
                timer.Enabled = true;
    
                Console.ReadLine();
            }
    
            private static void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                // Si posision más todo la longutud del texto menos 1 es menor que 40.
                if (position + TextoDePrueba.Length - 1 < 40)
                {
                    Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
                    Console.Write(" "); // deja un byte en blaco.
                }
                
                // Suma de position más sentido y se almacena en la misma variable, position.
                position += sentido;
                
                // ¿Position es igual a 40?            
                if (position == 40) // Sí. Guarda todos los caracteres o esa cadena de bytes más la suma de 1. Lo que no entiendo es el menos delante del -TextoDerueba.
                    position = -TextoDePrueba.Length + 1;
                else if (position == -TextoDePrueba.Length) // No. Entonces guarda 40 en la variable position.
                    position = 40;
                
    
                // ¿Position igual a 0?  
                if (position == 0)
                    timer.Enabled = false; // Sí. Detiene el tiempo.
    
                // Si position en menor que 0.
                if (position < 0)
    // Aquí abajo no se que significa o que hace exactamente.
                    TextoMostrado = TextoDePrueba.Substring(-position);
                else if (position + TextoDePrueba.Length >= 40)
                    TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
                else
                    TextoMostrado = TextoDePrueba;
    
    // Como un if-else pero medio raro. Si position es menor que 0, IIgual a 0, sino, es position. 
                Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    
                Console.Write(TextoMostrado);
            }
        }
    }

    A parte de todo esto.

    ¿En qué se diferencia timer.Enable = false con timer.Stop()?

    Para mi hacen lo mismo.


    http://electronica-pic.blogspot.com

    domingo, 29 de marzo de 2020 23:30
  • Hola

      // Si posision más todo la longutud del texto menos 1 es menor que 40.
      if (position + TextoDePrueba.Length - 1 < 40)
      {
           Console.SetCursorPosition(position + TextoDePrueba.Length - 1, 1);
           Console.Write(" "); // deja un byte en blaco.
      }

    Si el extremo derecho del Texto de prueba es menor que la anchura (que es 40) entonces borra el último caracter de la derecha para que no quede repetido "atrás" del Texto que va hacia la izquierda

    // Suma de position más sentido y se almacena en la misma variable, position.
    position += sentido;

    La variable posicion va (o puede ir, dependiendo de las flechas, aunque acá se las sacamos) desde 40 (límite derecho) hasta -TextoDePrueba.Length, TAL QUE así, el Texto puede ir de derecha a izquierda, hasta desaparecer por la izquierda, y lo mismo hacia la derecha; cuando va hacia la izquierda, la variable sentido vale -1, así posicion va disminuyendo, hasta que llega a -TextoDePrueba.Length, donde la cadena desapareció por la izquierda, y lo mismo para la derecha cuando sentido vale 1. En este último caso esto no llega a suceder, pero igual, posicion comienza en 40 y sentido comienza valiendo -1, pero termina todo cuando posicion llega a 0 (o 1, no recuerdo).

    // ¿Position es igual a 40?            
    if (position == 40) // Sí. Guarda todos los caracteres o esa cadena de bytes más la suma de 1. Lo que no entiendo es el menos delante del -TextoDerueba.
        position = -TextoDePrueba.Length + 1;
    else if (position == -TextoDePrueba.Length) // No. Entonces guarda 40 en la variable position.
        position = 40;

    Cuando posicion llega al límite derecho (que es 40) la cadena desapareció por la derecha, entonces se asigna a posición el valor de -TextoDePrueba.Length (la longitud de la cadena NEGATIVA), para que aparezca por la izquierda la punta derecha de la cadena. Ahora que veo esto digo cómo no lo saqué eso, porque en este último ejemplo no se usa. Del mismo modo cuando para cuando desaparece por la izquierda, posicion valdrá 40 para que asome por la derecha la punta izquierda del Texto.

    // ¿Position igual a 0?  
    if (position == 0)
        timer.Enabled = false; // Sí. Detiene el tiempo.

    Efectivamente cuando la punta izquierda de la cadena llega al extremo izquierdo, tal como solicitaste, se detiene el tiempo. Y ahí le das Enter para terminar el programa. Sólo hay algo malo en esto, que si te equivocas y pulsas Enter antes, también se termina el programa. Honestamente no encontré forma de evitar eso (usando el Timer), o sea, que el método Main() llegue a su fin, y que espere a que se detenga el Timer sin concluir, por eso le tuve que poner el Console.ReadLine() al final de Main(), pero lo malo es eso, que tocas Enter y se termina, en cualquier momento. Si queres, trato de corregirlo, recién ahora se me está ocurriendo algo como poner un bucle "infinito" y que se interrumpa (con break;) cuando se detiene el Timer, pero no estoy seguro que funcione. 

               // Si position en menor que 0.
               if (position < 0)
    // Aquí abajo no se que significa o que hace exactamente.
                   TextoMostrado = TextoDePrueba.Substring(-position);
               else if (position + TextoDePrueba.Length >= 40)
                   TextoMostrado = TextoDePrueba.Substring(0, 40 - position);
               else
                   TextoMostrado = TextoDePrueba;
    
    // Como un if-else pero medio raro. Si position es menor que 0, IIgual a 0, sino, es position. 
                Console.SetCursorPosition(position < 0 ? 0 : position, 1);

    Esto no lo saqué de la última versión? (o me estoy acordando mal ... o ya se me fundió ja ja)

    El método SubString() devuelve un nuevo objeto String (no modifica a quien lo llama), si le pasas un solo parámetro, devuelve la cadena a partir de ese índice, si le pasas un 2do parámetro, lo mismo pero desde el índice y solo la cantidad de caracteres que indica el 2do parámetro.

    Si posicion es menor que 0, o sea, una parte por la izquierda de la cadena está tapada, voy a mostrar la cadena a partir del caracter que es el positivo de lo que es negativo posicion, y el negativo del negativo es positivo, por eso el índice que le paso a SubString() en la 1ra es -posicion. Por el otro lado, si posicion + TextoDePrueba.Length es mayor que 40, es que parte de la derecha de la cadena está tapada (pero la punta izquierda no), por eso ahí le paso a SubString() 0 como índice de comienzo, y 40 - position como longitud, que es la cantidad de caracteres que hay entre donde comienza (en cada momento) la cadena y el límite derecho (que es 40), o sea hasta donde se ve antes del límite derecho. Si no se da ninguna de las 2 anteriores condiciones, (un else solito), muestra directamente la cadena como es, que no estará tapada por ningún extremo.

    // Como un if-else pero medio raro. Si position es menor que 0, IIgual a 0, sino, es position. 
    Console.SetCursorPosition(position < 0 ? 0 : position, 1);
    Si se da lo primero (de lo anterior), la cadena (cortada por izquierda) se muestra desde la posición 0, límite izquierdo, ya que está cortada por izquierda. Si se da lo 2do o 3ro, se imprime desde la posición pura (y se corta por derecha) porque esa posición es visible, no como en el otro caso que es negativa. 

    Si, es lo mismo timer.Enabled = false; que timer.Stop();, y timer.Enabled = true; que timer.Start();

    Saludos


    lunes, 30 de marzo de 2020 1:21
  • Eres el mejor.

    Muchas gracias.


    http://electronica-pic.blogspot.com

    lunes, 30 de marzo de 2020 3:11