Archive for 30 septiembre 2017

Capturar texto en mayúsculas en un objeto Memo en C++ Builder

septiembre 30, 2017

En C++ Builder, los objetos “Edit” tienen una propiedad llamada CharCase, esta propiedad tiene por defualt el valor ecNormal. Si queremos que todo lo que se capture en ese Edit esté en mayúsculas, basta conque cambies el valor de su propiedad CharCase de ecNormal a ecUpperCase.

Los objetos “Memo” no tienen la propiedad CharCase (no entiendo porque); así que si deseamos que todo lo que se capture en ese Memo esté en mayúsculas, debemos poner el siguiente código en el evento OnKeyPress:

if (Key >= 97 && Key <= 122)
    Key = Key - 32;

Sabemos que el código ASCII de la letra “a” minúscula es 97, el de la “b” es 98 y así sucesivamente hasta llegar a la letra “z” minúscula que es 122. El código ASCII de la letra “A” mayúscula es 65, el de la “B” es 66 y así sucesivamente hasta llegar a la letra “Z” mayúscula que es 90.

Esto significa que si restamos al código ASCII de cualquier letra minúscula el número 32, obtenemos la misma letra pero en mayúsculas. Por eso si la tecla pulsada está entre 97 y 122, la convertimos al código ASCII resultado de restarle 32. Esto no funciona para las vocales con acento, pero la solución es agregar un switch para cada uno de esos casos. La función completa del evento OnKeyPress del objeto Memo en el cual queremos que automáticamente se capture texto en mayúsculas incluidas las vocales con acento queda de la siguiente forma (asumimos que el objeto se llama Memo1)

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
{
 if (Key >= 97 && Key <= 122)
     Key = Key - 32;
 else
     switch(Key)
           {
            case 'á': Key = 'Á'; break;
            case 'é': Key = 'É'; break;
            case 'í': Key = 'Í'; break;
            case 'ó': Key = 'Ó'; break;
            case 'ú': Key = 'Ú';
           }
}

 

Anuncios