Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Limitar ingreso a un solo numero (https://www.clubdelphi.com/foros/showthread.php?t=48375)

arespremium 23-09-2007 19:08:43

Limitar ingreso a un solo numero
 
Hola como se puede limitar el ingreso a un Edit con un solo caracter o numero

Es diferente hacerlo que solo reciba numero o letras?

Tambien como puedo hacer un salto, Luego que se ingresa ese unico caracter al Edit1 salta hacia el Edit2

ver_imagen

Ejemplo:
Ingreso un caracter al Edit1, luego presiono Enter y se dirige hacia el Edit2

Saludos

Delphius 23-09-2007 19:23:25

Hola arespremium,

Existe una propiedad que te permite indicar la cantidad máxima de caracteres que se pueden expresar en un Edit. Se trata de MaxLength, y por defecto es de valor 0 (que indica que no tiene longitud máxima estrablecida). Con ella consigues lo que deseas.

Como en el Edit se recibe un string deberás hacer la transformación/comprobación de si es un entero. Hay muchas maneras de conseguir esto, se puede hacer mediante el evento OnKeyPress, con un try/except... empleando StrToInt si se está seguro de que se ha ingresado un número... en fin... muchas opciones. Si buscas en los foros notarás que hay mucha referencia al respecto. ¿Por que no pruebas con estos términos: "validar numero" o "convertir numero"?

Por otro lado, existe controles que te pueden evitar estos males. Si el número a ingresar responde a un rango definido de valores puede emplear un SpinEdit. O incluso un MaskEdit.

Sobre como simular el Tab con el ENTER. Ya fue tratado, nuevamente puedes recurrir a una búsqueda. Y como alternativa, en trucomania está el truco: "como simular TAB con ENTER".

Te recuerdo que has hecho muchas preguntas en un mismo post, preguntas que si bien hacen a tu problema/objetivo deberían haberse tratado por aparte. Esto está contemplado en la guia de estilo.

Saludos,

tazzmk 23-09-2007 19:47:25

Hola a todos
yo tengo algo alomejor te sirve

1.- como se puede limitar el ingreso a un Edit con un solo caracter o numero

crear un formulario, añadir un Edit y escribir el siguiente código:
Código:

Sub edit1_Keypress(KeyAscii As Integer)
    If KeyAscii <> Asc("9") Then
    'KeyAscii = 8 es el retroceso o BackSpace
      If KeyAscii <> 8 Then
          KeyAscii = 0
      End If
    End If
End Sub



Nuevo:
Código:

Private Sub edit1_Keypress(KeyAscii As Integer)
If Not IsNumeric(Chr$(KeyAscii)) And KeyAscii <> 8 Then KeyAscii = 0
End Sub

2.- como puedo hacer un salto, Luego que se ingresa ese unico caracter al Edit1 salta hacia el Edit2

Pasar de un edit a otro al pulsar Enter:

Insertar dos edit y escribir el siguiente código:

Código:

Private Sub edi1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
SendKeys "{tab}"
KeyAscii = 0
End If
End Sub

Private Sub edi2_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
SendKeys "{tab}"
KeyAscii = 0
End If
End Sub

eso seria :eek:

Gabo 23-09-2007 19:50:59

Pero eso es en Visual Basic...:)

Delphius 23-09-2007 19:55:13

Gabo, me robaste las palabras.
Igualmente creo que ya arespremium tiene lo que buscaba:
MaxLength
SpinEdit (mi opción)
MaskEdit

Saludos,

Gabo 23-09-2007 20:13:32

Solo quiero agregar el código que uso cuando un TEdit va a tener sólo números.

Código:

__fastcall TForm1::TForm1(TComponent* Owner)
                            :TForm(Owner)
{
    LONG dwStyle = GetWindowLong(Edit1->Handle, GWL_STYLE);
    SetWindowLong(Edit1->Handle, GWL_STYLE, dwStyle | ES_NUMBER);
}

Con esas dos líneas hago que el Edit1 sólo permita números.:)
Recuerden que yo programo en C++Builder, pero en Delphi se debe poder hacer también de la misma forma. Si alguien quiere traducir el código... ;)

Caral 23-09-2007 20:33:10

Hola arespremium
Lo que te han dicho los maestros es muy cierto, pero si necesitas que sea muy sencillo, pues no necesitas nada.
Sin cambiar nada en el edit, lo unico que necesitas es usar el evento OnChage.
Supongamos que tienes 2 edits, en uno quieres colocar un solo caracter o numero y cuando esto pase cambie el foco al siguiente, pues haces esto:
En el evento OnChange del Edit1:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
   edit2.SetFocus;
end;
Como ves, simplisimo, no hay manera de que se coloque mas de un caracter o numero en el edit1.
Ahora si necesitas que solo sean numeros, yo prefiero usar este componente, que funciona igual que el edit solo que no acepta letras.
Saludos

tazzmk 23-09-2007 20:34:11

hola, perdon me confundi con el lenguaje

aca va de nuevo pon este código en el evento OnKeyPress de tu TEdit y sólo admitirá números

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin 
  if ( StrScan('0123456789.-',Key) <> nil ) or 
     ( Key = Char(VK_BACK) ) then { BackSpace Key }
  begin 
    {Aqui tu tratamiento normal del evento}  
  end 
  else 
    Key := #0; 
end;

Gabo 23-09-2007 20:40:01

Cita:

Empezado por Caral (Mensaje 233251)
Hola arespremium
Lo que te han dicho los maestros es muy cierto, pero si necesitas que sea muy sencillo, pues no necesitas nada.
Sin cambiar nada en el edit, lo unico que necesitas es usar el evento OnChage.
Supongamos que tienes 2 edits, en uno quieres colocar un solo caracter o numero y cuando esto pase cambie el foco al siguiente, pues haces esto:
En el evento OnChange del Edit1:

Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
edit2.SetFocus;
end;



Como ves, simplisimo, no hay manera de que se coloque mas de un caracter o numero en el edit1.
Ahora si necesitas que solo sean numeros, yo prefiero usar este componente, que funciona igual que el edit solo que no acepta letras.
Saludos

Pero me parece que con ese código, si el usuario entra de nuevo en Edit1, podrá escribir un segundo caracter y así sucesivamente...

En eso estoy con Delphius, es mejor acotar el número de caracteres permitidos con MaxLength.

MON___ 23-09-2007 20:50:29

Existen muchas formas. Cuando he querido que en un TEDIT sólo se introduzca un valor numérico (0 a 9) siempre he empleado este código:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9', char(VK_BACK)]) then
begin
key := #0;
messageBeep(0); // un pitido para indicar que no se ha introducido un carácter válido
end;
end;

Caral 23-09-2007 20:52:48

Hola
Es muy cierto.
La maravilla de delphi, se pueden hacer las mismas cosas de muchas maneras.
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
 edit2.SetFocus;
 edit1.ReadOnly:= true;
end;
No es que tenga nada en contra de la propiedad MaxLength, solo trato de dar opciones, asi aprendemos mas.
Saludos

CamiloU 24-09-2007 18:13:51

Hola. hay un hilo que se llama "Problemas para capturar valor de OnKeyPress". Revísalo, te puede servir.

maeyanes 24-09-2007 18:48:44

Hola...

Cita:

Empezado por Caral (Mensaje 233258)
Hola
Es muy cierto.
La maravilla de delphi, se pueden hacer las mismas cosas de muchas maneras.
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
begin
 edit2.SetFocus;
 edit1.ReadOnly:= true;
end;
No es que tenga nada en contra de la propiedad MaxLength, solo trato de dar opciones, asi aprendemos mas.
Saludos

Y si luego quiero modificar el valor que ya puse en ese edit por que me doy cuenta que no era ese el que iba? Con tu código ya no podría hacer ese cambio... ;)

Lo mejor es usar la propiedad ya sugerida... MaxLenght que para eso está... ;)


Saludos...

Gabo 25-09-2007 08:35:24

Cita:

Empezado por maeyanes (Mensaje 233416)
Hola...

Y si luego quiero modificar el valor que ya puse en ese edit por que me doy cuenta que no era ese el que iba? Con tu código ya no podría hacer ese cambio... ;)

Lo mejor es usar la propiedad ya sugerida... MaxLenght que para eso está... ;)

Saludos...

Ya lo había pensado también, pero si se trataba de aprender, siempre habrán soluciones como volver a habilitar el Edit1, o no bloquearlo y hacer que cuando el usuario entre se borre lo que ya tiene, en fin...

Siempre se pueden hacer las cosas de distintas maneras, eso es algo inherente a la programación (no sólo de Delphi)... Aunque a la larga, de la gama de soluciones, es lógico que ocupemos aquella solución que sea más simple de llevar a cabo.

courtois 26-09-2007 03:29:14

O tambien podrian usar un TMaskEdit y ponerle una mascara de modo que acepte solo un numero o una letra

arespremium 26-09-2007 05:07:05

Hola gracias por su apoyo el "MaxLenght" funciona, todo bien, pude limitar el numero de ingreso y dar un salto al siguiente Edit.

pero no entiendo sobre como modificar el ingreso ya que una ves que se ingresa no se puede modificar queda fijo.

Gracias !! son muy amables

fidel 26-09-2007 19:58:36

Mira a ver si te sirve esto, solo lo he probado una vez y parece que funciona, te permite meter un solo dígito numérico en Edit1 y pasar automaticamente al siguiente componente (sea edit u otro) y si vuelves al edit te permite reemplazar el dígito numérico por otro si lo seleccionas, o borrarlo y escribir otro nuevo.

Edit1 debe tener su propiedad MaxLength a 1 para no permitir entrar más de un dígito.

Si lo que quieres es que solo adimita letras o un determinado número de caracteres reemplaza los números 0123456789 por lo que necesites en la linea
if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then

Pon esto en el evento OnKeyPress del Edit1

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if ( StrScan('0123456789'+chr(7)+chr(8), Key) = nil ) then
    //controlar entrada solo dígitos numéricos 0..9
    begin
      key := #0;
    end
  else
    begin
      if (key <> #7) and (key <> #8) then
        //si se entró un número se pasa al siguiente componente
        perform(wm_nextdlgctl,0,0);
    end
end;


La franja horaria es GMT +2. Ahora son las 11:41:41.

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