Capturar sólo números en C++ Builder

En ocasiones necesitamos validar que en un control TEdit el usuario sólo pueda teclear números. Lo que hay que hacer es poner el siguiente código en el evento OnKeyPress de nuestro TEdit.

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if (!((Key >= ‘0’ && Key <= '9') || Key == '\b'))     Key = 0; } [/sourcecode] Lo que hace este código es ignorar la tecla pulsada si dicha tecla no está dentro del rango de 0 a 9 y tampoco es el backspace (retroceso). Si queremos que los números estén alineados a la derecha, el truco es no utilizar un TEdit, sino un control TMemo haciendolo del tamaño deseado y seleccionando la opción taRightJustify en la propiedad Alignment e indicando el número máximo de caracteres en la propiedad MaxLength.

Etiquetas: , ,

25 comentarios to “Capturar sólo números en C++ Builder”

  1. Jorge Says:

    Gracias por este aporte, tengo una pregunta, si queremos aceptar números decimales como lo hacemos?, considerando que dependiendo a la configuracion hay equipos que el separador de decimales es ‘,’ y en otros ‘.’.

    • rtmex Says:

      Hola Jorge, agregando el punto decimal quedaría algo como esto;

      {
      if (!((Key >= '0' && Key <= '9') || Key == '\b' || Key == '.')))
      Key = 0;
      }

      Para validar punto o coma según el país, yo haría un módulo de configuración en la aplicación y que el usuario seleccione si el separador de decimales es el punto o la coma, dependiendo de eso asignaría un valor a una varibale global y con eso podrías hacer algo como esto:

      if (variable==1)
      {
      if (!((Key >= '0' && Key = '0' && Key <= '9') || Key == '\b' || Key == ',')))
      Key = 0;
      }

  2. Azhy Says:

    Valla esta entrada me acaba de salvar una duda, muchas gracias, buen blog.

  3. gabo Says:

    hola… gracias por la ayuda, pero quisiera solo introducir letras no puntos, comas y otro caracter. encontre esto para delphi, pero quisiera esto para builder, ayudenme.

    if not( key in [‘a’..’z’,’ñ’,’A’..’Z’,’Ñ’,#32,#8]) then
    key := #0;
    end;

    • rtmex Says:

      El siguiente código te permite capturar sólo letras, espacios y el backspace

      if(!((UpCase(Key) >= ‘A’ && UpCase(Key) <= 'Z') || Key == 'ñ' || Key == 'Ñ' || Key == ' ' || Key == '\b'))
      Key = 0;

  4. Aldemar Says:

    Buenas tardes, se que respondiste la pregunta de como aceptar números decimales considerando como separador de decimales la coma (,). Pero quisiera saber como se hace para que dicha coma aparezca una sola vez. Gracias.

    • rtmex Says:

      Hola

      Suponiendo que tienes un TEdit que se llama Edit1, y sólo quieres aceptar números, el punto y el backspace, y además quieres que sólo aparezca una vez el punto, El código es el siguiente:

      void __fastcall TF_Ejemplo::Edit1KeyPress(TObject *Sender, char &Key)
      {
       if(!((Key >= '0' && Key <= '9') || Key == '.' || Key == '\b'))
          Key = 0;
       else
           if (Key == '.')
              {
               //sólo acepta un punto
               if (Edit1->Text.Pos(".") > 0)
                   Key = 0;
              }
      }
      
      • Aldemar Says:

        Me aparecen varios puntos.

        Quiero que solo aparezca por ejemplo:

        55.88

        Y no:

        55…88 o tampoco 55.8.9.8

        Lo quiero saber para sumar números decimales.

        Gracias.

      • Aldemar Says:

        Perdón ya vi el problema. Si sirve. Lo que pasa es que yo lo tenia como Edit3. Gracias y disculpa.

  5. Aldemar Says:

    Buenas noches, una pregunta:

    Quiero generar una factura para N número de personas. ¿Como hago eso?. Porque se generarla para una sola persona, pero no para varias.

    Yo se que con un ciclo “for” se puede, pero como hago para que que la forma se detenga y me deje llenar los datos para una segunda persona.

    Gracias.

    • rtmex Says:

      Hola

      ¿Las facturas van a ser idénticas y sólo va a cambiar los datos del cliente (y el número de factura desde luego)?
      Si es así, lo ideal es que tengas un catálogo de clientes en donde ya esté la información de facturación de cada uno, y en tu forma de facturación te aparezcan en un grid los nombres de los clientes y de ahi selecciones todos a quienes les vas a hacer la factura. Una vez seleccionados los clientes y llenado la factura, es decir, indicado los productos que se van a facturar, al hacer click en el botón aceptar, en un ciclo vas generando las facturas para cada uno de los clientes seleccionados.

      Si esto no es lo que necesitas, describe más detalladamente lo que deseas hacer para poder ayudarte

      Saludos

  6. Aldemar Says:

    Ya resolví el problema anterior de generar una factura para varias personas. Si tengo alguna duda vuelvo y pregunto.

    Ahora tengo es esta:

    ¿Como hago para hallar el promedio de personas masculinas y femeninas desde un archivo: .txt?

    Se consultar el nombre de una persona en un archivo .txt y mostrar los datos en un Label por medio de un boton, pero no se hallar el promedio de personas masculinas y femeninas que hay en el archivo .txt.

    Así hice el código para consultar el nombre de una persona y mostrar los datos en un Label (el nombre es ingresado por un usuario en un LabelEdit):

    void __fastcall TForm2::B1Click(TObject *Sender)
    {
    if(!FileExists(“archivos/DATOS.txt”)) //si el archivo no existe
    MessageDlg(“El archivo DATOS.txt no existe”, mtWarning, TMsgDlgButtons() <>nombre;
    leer>>edad;
    leer>>sexo;

    ban=0;

    while(!leer.eof() && ban==0) //Mientras no sea el fin del archivo
    {
    if(Form2->LE1->Text==AnsiString(nombre))
    {
    ban=1;

    cadena=”Los datos de: ” + AnsiString(nombre) + “son:\n”;

    cadena+=”Edad: ” + AnsiString(edad) + “\n”;
    cadena+=”Sexo: ” + AnsiString(sexo);
    Form2->L1->Caption=cadena;
    }
    else
    {
    leer>>nombre;
    leer>>edad;
    leer>>sexo;
    }
    }

    if(ban==0)
    Form2->L1->Caption=”El nombre no existe en DATOS.txt”;

    leer.close();
    }
    }

    Gracias.

    • rtmex Says:

      Creo que la solución es que cada vez que leas el campo sexo, cheques si es masculino o femenimo; cada vez que sea masculino incrementas un contador por ejemplo “cantm” y cada vez que sea femenino incrementas otro contador, por ejemplo “cantf”. Al final divides cantm entre cantm+cantf para obtener el promedio de hombres y para el promedio de mujeres divides cantf entre catm+cantf.
      Es eso lo que quieres?

      Saludos

      • Aldemar Says:

        Gracias hermano. Ya lo había hecho, y quedó muy parecido a lo que dijiste. Lo hice para saber el porcentaje.

        Hice esto:

        ifstream leer_m(“archivos/DATOS.txt”); // para leer el .txt otra vez

        leer_m>>nombre;
        leer_m>>edad;
        leer_m>>sexo;

        while(!leer_m.eof() && veces==0) //entra al ciclo una sola vez porque veces se hace 1 la 2da vez
        {
        cont=cont+1;

        if(strcmp(sexo,”Masculino”)==0)
        cont_m=cont_m+1;
        else
        cont_f=cont_f+1;

        leer_m>>nombre;
        leer_m>>edad;
        leer_m>>sexo;

        }

        cont_masculino=cont_m;
        cont_femenino=cont_f;

        promedio=”El porcentaje de personas de sexo masculino es: ” + AnsiString((cont_masculino/cont)*100) + “%”;
        promedio+=”\nEl porcentaje de personas de sexo femenino es: ” + AnsiString((cont_femenino/cont)*100) + “%”;

        Form2->L2->Caption=promedio;

        veces=veces+1; //la variable veces es global
        leer_m.close();

  7. Aldemar Says:

    Otra pregunta. ¿Como hago para guardar la ruta completa de un archivo en un archivo *.txt?

  8. Rosa Says:

    cómo le hago para que se valide si el numero agregado sea mayor que 3?

  9. Pedro Says:

    Amigo, tengo un problema no me jala el codigo

  10. juancarlos Says:

    Buenas tardes amigo tengo varias inquietudes, primero estoy manejando varias ventanas o varios form, y no logro hacer lectura o escritura de las variables definidas en un form en otro form. la segunda inquietud es que estoy manejando Edit para los números y no logro que salga el cero solo antes de la coma, y también me gustaría que al dar enter pase al otro Edit. gracias por la yuda y pronta respuesta

    • rtmex Says:

      Hola

      Supongamos que tienes un form A y un form B, y en form B quieres usar variables definidas en tu form A. Para eso, debes declarar en la sección public del .h de tu form A dichas variables, y en tu form B hacer un include del .h de tu form A

      Para que cuando pulses enter en un control pase el foco al siguiente control, en tu form debes poner en el evento OnKeyPress el siguiente código

      if(Key == VK_RETURN)
        {
         Key=0;
         Perform(WM_NEXTDLGCTL,0,0); // Manda el foco al siguiente control
        }
      

      No entendí lo de “no logro que salga el cero solo antes de la coma”

      Saludos

      • Juancarlos Says:

        Voy a intentar gracias, y es que los ceros no los escribe queda el espacio en blanco y no los anota en los tedit

  11. Heder Says:

    Hola compañeros, como le podria hacer con un programa que tengo, se trata del resultado de una operacion me aparesca en un label, pero el resultado tiene decimales, pero yo solo quiero quiero que aparesca dos decimales como 15.153 +122.4233 = 157.5763, yo solo quiero que me aparesca en el label 157.57, agradeseria mucho su ayuda n.n

  12. Freddy Guevara Ruiz Says:

    Hola compañeros, como le podria hacer con un programa que tengo, se trata del resultado de una operacion me aparesca en un label, pero el resultado tiene decimales, pero yo solo quiero quiero que aparesca dos decimales como 15.153 +122.4233 = 157.5763, yo solo quiero que me aparesca en el label 157.57, agradeseria mucho su ayuda n.n

    • rtmex Says:

      Utiliza la función Pos para encontrar la posción del punto decimal dentro de la cadena, y con la función substr sólo tomas el número de caracteres desde el inicio hasta 2 posiciones depués de la posición en donde encontraste el punto decimal.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: