Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   onKeyPress es caracter no numérico (https://www.clubdelphi.com/foros/showthread.php?t=10495)

Giniromero 20-05-2004 19:29:23

onKeyPress es caracter no numérico
 
Hola,

Estoy trabajando con Delphi6 e interbase 7.

En mi aplicación, tengo una ventana en la que se puede buscar un cliente, de entre los que tengo en la BD.

Este se puede buscar por el número de cliente, o por el nombre.

También tengo un radioGroup, para que el usuario seleccione por que campo quiere buscar.

Tengo un TEdit, que es donde se escribe lo que quiero buscar.

El caso es que como me daba error al insertar letras, cuando estamos buscando por el campo numérico, le puse en el onkeypress código para que detectase que eran letras y no número, y diera un error.

Ahora tengo que ampliar el código, de modo que:
1) cuando se busque en el campo numérico, (numero de cliente), y se introduzcan letras, que se cambie el campo de busqueda al de nombre de cliente, y el radioGroup, también al nombre de cliente

2 cuando se busque en el campo varchar, (nombre de cliente), y se introduzcan números, que se cambie el campo de busqueda al de numero de cliente, y el radioGroup, también al numero de cliente.


El problema que tengo, es que, cuando quiero buscar en el campo texto, y tengo texto, pero me confundo al escribir y quiero borrar, al presionar la tecla de borrado, (del o supr), es como si me los considerase números y se me cambia el radioGroup al numero de cliente.

Mi código es:

Código:

procedure TFrmSeleAlu.EditBuscarKeyPress(Sender: TObject; var Key: Char);
begin

      //si está buscando por NUMALU
  IF (RCampo = 'NUMALU') THEN BEGIN
      //y no insertamos un número sino una letra
    If Not (Key In ['0'..'9',#8]) Then Begin
      //marcamos como campo de busqueda en el radioGroup APELALU
      RadioGroup1.ItemIndex := 0;
      //ponemos como campo por el que buscar APELALU
      RCampo := 'APELALU';
    End;
  END
  ELSE IF ((RCampo = 'APELALU') OR (RCampo = 'NOMALU')) THEN BEGIN
  //si elcampo por el que estoy buscando es apellido o nombre
  //y me insertan un dígito

    If (Key In ['0'..'9',#8]) Then Begin
      //marcamos como campo de busqueda en el radioGroup APELALU
      RadioGroup1.ItemIndex := 1;
      //ponemos como campo por el que buscar NUMALU pues estamos insertando
      //Datos
      RCampo := 'NUMALU';
    End;

  END

end;

Como puedo poner este " If (Key In ['0'..'9',#8]) Then Begin
" para que SÓLO ENTRE EN EL IF SI ES UN DÍGITO del 0 al 9, pero no si es cualquier otro caracter o tecla?

Muchisimas gracias,

Virginia

roman 20-05-2004 19:50:42

Está un poco enredada tu explicación pero me ajusto a esto:

Cita:

Empezado por Giniromero
Como puedo poner este " If (Key In ['0'..'9',#8]) Then Begin
" para que SÓLO ENTRE EN EL IF SI ES UN DÍGITO del 0 al 9, pero no si es cualquier otro caracter o tecla?

Si sólo quieres que entre con un dígito de 0 a 9 ¿por qué incluyes #8 (BackSpace) en el conjunto?

// Saludos

sanxpue 20-05-2004 22:57:36

Y por que no haces lo siguiente??
 
Y por que no te olvidas del radiogroup y haces lo siguiente :

Vamos a hacerlo en el evento OnKeyPress cuando Key = #13
(al rato lo acomodamos bien)

Código Delphi [-]
//Aqui lo estamos haciendo para numero o palabras completas
//que sean iguales...
Procedure TForm1.Edit1......
Begin
  If Key = #13 Then
    If Not table1.Locate('NUMALU',Edit1.Text,[]) Then
      If Not table1.Locate('APELALU',Edit1.Text,[]) Then
        ShowMessage('No se Encontraron datos');
End;

Pero si lo que queremos es que vaya localizando segun escribas entonces

Código Delphi [-]
Procedure TForm1.Edit1......
Begin
    If Not table1.Locate('NUMALU',Edit1.Text,[loPArtialKey]) Then
      If Not table1.Locate('APELALU',Edit1.Text,[loPArtialKey]) Then
         Table1.First;  
End;

Supongamos una tabla

12345 chuchita la bolsearon
1247 la magnifica

con el primero si escribes

1247 se va a la maginifica
y si escribes chuchita la bolsearon se va a 12345
pero si nada mas escribes la no se va a ningun lado

la segunda opcion
si escribes
12 esta en 12345 pero si escribes un 4 mas entonces se va a 124
pero si escribes

ch pregunta primero por el numero pero como no esta entonces se va a buscar la siguiente opcion

Haber que te parece esa idea ¡¡¡¡ :D

Y crear un campo computado de Nombre y apellidos del alumno seria mejor buscar en ese campo

Giniromero 21-05-2004 11:44:23

Hola Roman,

Siento si, intentando explicarme lo he complicado todo, así que, lo primero, gracias por contestar a pesar de ello. Respecto a:

Cita:

Empezado por roman
Está un poco enredada tu explicación pero me ajusto a esto:



Si sólo quieres que entre con un dígito de 0 a 9 ¿por qué incluyes #8 (BackSpace) en el conjunto?

// Saludos

Como puedes ver, no tengo muy claro como funciona esto, me ayudaron en el foro con esta parte del código que más arriba aparece. Sé que hace más o menos, pero no sé de donde lo han sacado, pues en la ayuda del delphi no he encontrado nada al respecto.

¿puedes comentarme como va esto, o por lo menos donde informarme mejor de su funcionamiento?
¿puedo, simplemente quitar de ahí el #8?
Te agradeceré cualquier orientación.

Un saludo,

Virginia

roman 21-05-2004 16:53:40

Quizá tengas que darle un repaso a los conjuntos (sets) ;).

Recuerda que los corchetes [] sirven (en este contexto) para denotar un conjunto. Así, ['0'..'9', #8] denota al conjunto formado por los caracteres '0' al '9' (los dos puntos indican un rango de elementos) y el caracter de código ascii 8. Este último corresponde a la tecla BkSpace. El operador in es para verificar la pertenencia de un elemento a un conjunto de manera que cuando pones

Código Delphi [-]
if (Key in ['0'..'9', #8]) then

estás preguntando si Key es un elemento del conjunto ['0'..'9', #8], es decir, si oprimiste una de las teclas del conjunto.

Con esto en mente, decide tú si puedes o no quitar el #8.

// Saludos

__cadetill 21-05-2004 17:16:24

Sólo añadir una nota a todo lo expuesto

Por que no usas un componente que ya te controle que sólo se puedan escribir números estilo al CurrencyEdit de las RX??

Lo digo porque si se pega texto desde el portapapeles y no controlas también eso, podrán escribirte lo que quieran ;)


La franja horaria es GMT +2. Ahora son las 12:08:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi