• Domingo 22 de Diciembre de 2024, 16:49

Autor Tema:  datos por teclado y usando mouse  (Leído 3896 veces)

picyo

  • Visitante
datos por teclado y usando mouse
« en: Lunes 15 de Agosto de 2011, 02:59 »
0
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: [Seleccionar]
private void bt_Digito_KeyPress(object sender, KeyPressEventArgs e)
        {
           
            etPantalla.Text = etPantalla.Text + e.KeyChar.ToString();
           
        }
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

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:datos por teclado y usando mouse
« Respuesta #1 en: Lunes 15 de Agosto de 2011, 06:02 »
0
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: [Seleccionar]
        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;
            }
        }

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

picyo

  • Visitante
Re:datos por teclado y usando mouse
« Respuesta #2 en: Lunes 15 de Agosto de 2011, 12:45 »
0
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: [Seleccionar]
private void Form1_Load(object sender, EventArgs e)
        {
            etPantalla.Enabled = false;
            btDigito1.Text = "&1";// de momento solo pruebo con el dígito 1
        }

Aqui pongo el código que uso para digitos ( Click) en teclado virtual
Código: [Seleccionar]
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;
           
        }

y el que mas has dicho:
Código: [Seleccionar]
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";
              */
               
                     
            }
           
        }

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:datos por teclado y usando mouse
« Respuesta #3 en: Lunes 15 de Agosto de 2011, 19:36 »
0
El problema viene de la siguiente linea:
Código: [Seleccionar]
        etPantalla.Text  += objButton.Text;

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: [Seleccionar]
        private void button1_Click(object sender, EventArgs e)
        {
            etPantalla.Text = etPantalla.Text + "1";
        }

en lugar de
Código: [Seleccionar]
        private void button1_Click(object sender, EventArgs e)
        {
            Button objButton = (Button)sender;
            etPantalla.Text += objButton.Text;
        }

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: [Seleccionar]
        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;
            }
        }

Pruebalo ahora y comenta como te fue.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

picyo

  • Visitante
Re:datos por teclado y usando mouse
« Respuesta #4 en: Miércoles 17 de Agosto de 2011, 19:09 »
0
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...

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:datos por teclado y usando mouse
« Respuesta #5 en: Miércoles 17 de Agosto de 2011, 23:05 »
0
Si borras la pantalla, debes volber a pulsar un botón desde el teclado virtual, y luego ya puedes seguir con el normal...

Por lo que comentas, parece que no estas capturando el evento Keypress en el boton de borrado de pantalla, ya antes te dije que debes capturar el evento Keypress para todos tus controles, inclusive para el formulario, no solo para los botones de los digitos, ya que el evento Keypress funciona solo si el control tiene el foco, pero si pulsas otro boton que no sea el digito, y no capturas el evento Keypress para ese boton, logicamente no te reconocera el que pulses un digito.

Puedes hacerlo desde el diseñador (lo mas recomendable) o en el metodo Load de tu formulario, te dejo a continuacion un ejemplo de como hacerlo manualmente en el metodo Load, suponiendo que el boton de borrado se llama btClear y el metodo que controla el eventp KeyPress se llama bt_Digito_KeyPress como en tu ejemplo anterior:

Código: [Seleccionar]
        private void Form1_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";
            // Añades el evento KeyPress al boton de borrado
            this.btClear.KeyPress += new KeyPressEventHandler(this.bt_Digito_KeyPress);
            // Añades el evento KeyPress al Formulario
            this.KeyPress += new KeyPressEventHandler(this.bt_Digito_KeyPress);
        }

Saludos :)
« última modificación: Miércoles 17 de Agosto de 2011, 23:09 por ProfesorX »

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

picyo

  • Visitante
Re:datos por teclado y usando mouse
« Respuesta #6 en: Sábado 20 de Agosto de 2011, 18:25 »
0
Hola! perdona por la tardanza!
ha ido perefcto!
si realmente me figuraba que el problema era que al pulsar el botón virtual, éste se quedaba el foco, y el teclado lo perdía. L forma que se para poner un focus era sólo ésta :
Código: [Seleccionar]
etpantalla.Focus() ( lo pongo de  como ejemlo , ¿eh?)
pero no sabia como hacer focus de la pulsación del teclado. Ahora si! Grácias!