Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar al siguiente Edit al llegar a maxlength (https://www.clubdelphi.com/foros/showthread.php?t=26954)

Durbed 08-11-2005 17:22:20

Pasar al siguiente Edit al llegar a maxlength
 
Tengo un formulario lleno de TEdits y quiero que al llegar a su capacidad maxima, pase el foco al siguiente edit, asi para todos los edit que tengo de un dentro de un panel. Hay alguna forma de hacerlo de forma general para no repetir el codigo para cada componente? o mejor aun, existe algun componente que lo tenga implementado?

Muchas gracias.

ContraVeneno 08-11-2005 17:41:41

si quieres tener muchas líneas en un edit, es mejor que utilizes el TMemo, o el TRichEdit...

de cualquier manera, el código general tendría que ser algo así como:
Tendrías que colocar el código en el primer TEdit y todos los demás apuntando a el mismo evento.
Código Delphi [-]
 procedure TFrm.edtChange(Sender: TObject);
 begin
   inherited;
  if length((Sender as TEdit).Text >= (Sender as TEdit).MaxLength then
   SelectNext(ActiveControl as tWinControl, True, True );
 end;

no he probado este código y/o tal vez alguien tenga una mejor idea, pero de cualquier manera creo que sería mejor que utilizaras un Tmemo o un TRichEdit

Neftali [Germán.Estévez] 08-11-2005 17:57:26

Cita:

Empezado por Durbed
...Hay alguna forma de hacerlo de forma general para no repetir el codigo para cada componente?

Puedes crear un único evento y asignar el mismo a todos los componentes.

Código Delphi [-]
   if (Sender is TEdit) then begin
     if (TEdit(Sender).MaxLength <> 0) then begin
       if (Length(TEdit(Sender).Text) = TEdit(Sender).MaxLength) then begin
         Self.Perform(WM_NEXTDLGCTL, 0{Next}, 0);
       end;
     end;
   end;

Si no quieres hacer la asignación "a mano" puedes hacerla por código al crear/visualizar el form por ejemplo (utilizando el OnChange); Es lo mismo que harías "a mano" asignando todos los eventos al mismo procedimiento, pero de forma automática.

Código Delphi [-]
   for i := 0 to (Panel1.ControlCount - 1) do begin
     if (Panel1.Controls[i] is TEdit) then begin
       TEdit(Panel1.Controls[i]).OnChange := _GoNext;
     end;
   end;

La otra opción es crear un componente (derivado de TEdit o TCustomEdit) y añadirle la propiedad que te gestione éste comportamiento. La implementación básicamente es la misma realizada arriba.
Puedes implementar el comportamiento sobreescribiendo el método Change de TCustomEdit.

Código Delphi [-]
   procedure Change; override;

lucasarts_18 08-11-2005 18:04:35

Hola:

Yo prefiriría usar setfocus en caso de no ser siempre el próximo control quien deba tener el control (Foco).

Hasta Luego -

Durbed 08-11-2005 20:31:36

Ya esta solucionado, muchas gracias Neftali el código
Código Delphi [-]
  if (Sender is TEdit) then begin
     if (TEdit(Sender).MaxLength <> 0) then begin
       if (Length(TEdit(Sender).Text) = TEdit(Sender).MaxLength) then begin
         Self.Perform(WM_NEXTDLGCTL, 0{Next}, 0);
       end;
     end;
   end;

Funciono perfectamente :)


La franja horaria es GMT +2. Ahora son las 12:53:23.

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