CLR: .Net / Mono / Boo / Otros CLR > C#

 datos por teclado y usando mouse

(1/2) > >>

picyo:
Estoy haciendo una calculadora, la cual le puedo ingresar datos por mouse, desde su teclado virtual. pero al igual que la de Windows, estoy tratando de introducirlos por teclado, es decir, si pulso el teclado virtual se escribira el numero al igual que si lo hago por el teclado convencional.
La parte del teclado convencional es la que me falla..en otros programas, introducia datos a un TextBox por teclado y sin problemas, dando el focus a un TextBox.
En este caso no se si he de darle focus al numero virtual ( por ejemplo el 9). El caso es que solo se me ha ocurrido hacer lo siguiente:

--- Código: ---private void bt_Digito_KeyPress(object sender, KeyPressEventArgs e)
        {
           
            etPantalla.Text = etPantalla.Text + e.KeyChar.ToString();
           
        }
--- Fin del código ---
Si antes no introduzco un numero con el teclado virtual ( usando el mouse), no puedo usar teclao numerico. una vez he escrito el 1r numero desde el teclado virtual, ya puedo teclear con el teclado numerico ( convencional). Como puedo escribir directamente con el teclado numerico convencional ?

ProfesorX:
Hola picyo, hay una manera facil, y no muy bien documentada de hacerlo en C#, si añades un "&" antes de la letra/numero en la propiedad Text de tu button, podras utilizar esa letra/numero para "pulsar" esa tecla como si utilizaras el raton (mouse) para pulsar el boton.

Te sugiero ademas que deshabilites (Enabled = false) tu textbox para evitar que "manualmente" modifiques el contenido de tu textbox, y mejor haz la modificacion del contenido com puros eventos y botones, añadiendo la funcionalidad que desees en los diferentes eventos, creando un metodo "general" para manejar tu Keypress event, tanto del formulario como de los botones.

En el siguiente ejemplo, te muestro como deberias manejar los eventos para teclas numericas y la tecla BackSpace (retroceso) con la que podrias borrar el contenido de tu textbox cuando lo tengas deshabilitado. Para añadir la funcionalidad de otras teclas (+, -, *, etc.) simplemente añade otros case dentro del metodo KeyPress_General, añade el metodo al evento Keypress de tu formulario y botones en tiempo de diseño. Puedes modificar la propiedad Text de todos tus botones dentro del metodo Form_Load, o lo puedes hacer en tiempo de diseño tambien, recuerda colocar un & antes de cada numero, ejemplo: &1, &2, &3, &4, etc.


--- Código: ---        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Enabled = false;
            // Puedes hacerlo en tiempo de diseño si lo deseas
            button1.Text = "&1";
            button2.Text = "&2";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = textBox1.Text + "2";
        }

        // Añade el siguiente metodo al evento Keypress de tu formulario
        // y tus botones
        private void KeyPress_General(object sender, KeyPressEventArgs e)
        {
            switch (e.KeyChar)
            {
                // Tecla BackSpace (Retroceso)
                case '\b':
                    if (textBox1.Text.Length > 0)
                        textBox1.Text = textBox1.Text.Substring(0, textBox1.Text.Length - 1);
                    break;
            }
        }

--- Fin del código ---

Saludos :)

picyo:
Hola! Bueno he probado el ejemplo y no se si hay algo que me deje..pero si, ahora al pulsar directamente por teclado, me aparece el número por pantalla..lo malo es que ademas, me sale el simbolo "&", y aparte que no ha de salir, claro, al hacer cualquier operación salta error. respecto a los métodos de Boton_KeyPress he dejado los que ya tenía, éstos no me han dado problemas. Si acaso pongo mi código modificado, a ver si hay algo que no he visto claro :

--- Código: ---private void Form1_Load(object sender, EventArgs e)
        {
            etPantalla.Enabled = false;
            btDigito1.Text = "&1";// de momento solo pruebo con el dígito 1
        }

--- Fin del código ---

Aqui pongo el código que uso para digitos ( Click) en teclado virtual

--- Código: ---private void btDigito_Click(object sender, EventArgs e)
        {
            Button objButton = (Button)sender;
            if (ultimaEntrada != Entrada.DIGITO) // al principio es NINGUNA
            {
                if (objButton.Text == "0") return; // return devuelve el control para que otro lo recoja
                etPantalla.Text = "";
                ultimaEntrada = Entrada.DIGITO;
                comaDecimal = false;
            }
            etPantalla.Text  += objButton.Text;
           
        }

--- Fin del código ---

y el que mas has dicho:

--- Código: ---private void bt_Digito_KeyPress(object sender, KeyPressEventArgs e)
        {

            switch (e.KeyChar)
            {
                // Tecla BackSpace (Retroceso)
                case '\b':
                    if (etPantalla.Text.Length > 0)
                        etPantalla.Text = etPantalla.Text.Substring(0, etPantalla.Text.Length - 1);
                    break; 
                // el siguiente case lo he puesto para ver si escribia sin el simbolo "&", pero ha sido en balde
              /*
                 case '1':
                    etpantalla.Text=etpantalla.Text+"1";
              */
               
                     
            }
           
        }

--- Fin del código ---

ProfesorX:
El problema viene de la siguiente linea:

--- Código: ---        etPantalla.Text  += objButton.Text;

--- Fin del código ---

estas asignando el valor de la propiedad Text de tu boton a la propiedad Text de tu Textbox, y dado que la propiedad Text contiene "&1", es por eso que añade "&1" al TextBox.

Esa es la razon por la que en mi ejemplo yo manejaba el evento click de cada boton por separado, si no lo notaste:


--- Código: ---        private void button1_Click(object sender, EventArgs e)
        {
            etPantalla.Text = etPantalla.Text + "1";
        }

--- Fin del código ---

en lugar de

--- Código: ---        private void button1_Click(object sender, EventArgs e)
        {
            Button objButton = (Button)sender;
            etPantalla.Text += objButton.Text;
        }

--- Fin del código ---

Ya que añades & a la propiedad Text del button, entonces el evento Keypress para ese button ya no es capturado, por eso el case '1' del evento keypress tampoco funciona.

Si insistes en utilizar un metodo general llamado btDigito_Click para todos tus eventos de botones en lugar de un metodo individual para cada boton, entonces pense en otra solucion, elimina entonces el & de la propeidad Text del boton, y maneja entonces el eventi keypress desde el metodo general bt_Digito_KeyPress:


--- Código: ---        private void Form2_Load(object sender, EventArgs e)
        {
            etPantalla.Enabled = false;
            // Ya no utilices el & para poder
            // capturar el evento keypress en el metodo
            // bt_Digito_KeyPress
            btDigito1.Text = "1";
            btDigito2.Text = "2";
        }

        private void btDigito_Click(object sender, EventArgs e)
        {
            Button objButton = (Button)sender;
            if (ultimaEntrada != Entrada.DIGITO) // al principio es NINGUNA
            {
                if (objButton.Text == "0") return; // return devuelve el control para que otro lo recoja
                etPantalla.Text = "";
                ultimaEntrada = Entrada.DIGITO;
                comaDecimal = false;
            }
            etPantalla.Text += objButton.Text;

        }

        private void bt_Digito_KeyPress(object sender, KeyPressEventArgs e)
        {

            switch (e.KeyChar)
            {
                // Tecla BackSpace (Retroceso)
                case '\b':
                    if (etPantalla.Text.Length > 0)
                        etPantalla.Text = etPantalla.Text.Substring(0, etPantalla.Text.Length - 1);
                    break;
                // Ahora que eliminaste el &
                // si podras capturar el keypress aca
                case '1':
                    etPantalla.Text = etPantalla.Text + "1";
                    break;
                case '2':
                    etPantalla.Text = etPantalla.Text + "2";
                    break;
            }
        }

--- Fin del código ---

Pruebalo ahora y comenta como te fue.

Saludos :)

picyo:
hola! Ya habia probado esto, y lo que sale es que solo reconoce una vez la pulsación. Si borras la pantalla, debes volber a pulsar un botón desde el teclado virtual, y luego ya puedes seguir con el normal...

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa