Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Capturar Tecla (https://www.clubdelphi.com/foros/showthread.php?t=70637)

cmfab 02-11-2010 17:41:41

Capturar Tecla
 
Hola a todos, acá con algunas otras preguntitas. me explico tengo tres Tedit. Edit1, Edit2, Edit3. Los tres valores deben ser validados a la vez que el usuario teclee los mismos. La navegacion es con el "Enter", sucede que si el usuario se equivoca necesito que no pueda avanzar con el enter al proximo registro, sin embargo si pueda con una combinacion de teclas como TAB+Bacspace avanzar al registro anterior. desde ya mil gracias

rrf 02-11-2010 18:29:49

Hola Cmfab.

Puedes utilizar el evento OnExit. Como en este ejemplo:

Código Delphi [-]
procedure TForm1.Edit1Exit(Sender: TObject);
begin
      // Validación del contenido de Edit1
      /////////////////////////////////////

   if not {condicion que debe cumplir el contenido del edit }
   then
     begin
       ShowMessage( 'mensaje al usuario de que hay un error' );
       Edit1.SetFocus ;  // Regresa el foco al edit con el contenido incorrecto
     end ;

end;

Espero que te sirva.

Saludos.

cmfab 02-11-2010 18:37:23

Hola gracias por tu pronta respuesta. ya habia probado el evento onexit, pero sucede que ese evento se desencadena cada vez que pierde es focus el TEdit y es precisamente lo que quiero. que me de el error al avanzar con el enter al nuevo Tedit, pero si el usuario quiere regresar al Tedit anterior que no salga el mensaje de error. de la forma que explicas siempre devuelve el focus al Edit2 por ejemplo y nunca puede el usuario ir al Edit1. espero haberme explicado correctamente

rrf 02-11-2010 23:53:19

No te entiendo bien, creo.

Pero lo que hace este código es que: al salir de Edit1, si no se introdujo la información correcta, aparece el mensaje y se regresa a Edit1.

Y creo entender que eso es lo que buscas ¿no?.

Si aún no lo has probado, pruébalo y verás si se ajusta a lo que buscas.

Salu2.

ecfisa 03-11-2010 03:15:41

Hola cmfab, rrf.

Si no te entiendo mál, lo que deseas es el comportamiento que te expuso rrf sólo cuando avanzas al próximo Edit.
Pero que no aparezca el mensaje de error cuando retrocedas al Edit ya ingresado sin errores.

Si es así, una forma puede ser:
Código Delphi [-]
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure EditExit(Sender: TObject);
    procedure EditKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    FProx: Boolean;
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

(* Inicializar bandera de sentido (proximo / anterior) *)
procedure TForm1.FormCreate(Sender: TObject);
begin
  FProx:= True;
end;

(* Asignar al evento OnExit de los tres Edits *)
procedure TForm1.EditExit(Sender: TObject);
begin
  with Sender as TEdit do
  begin
    if (Text = '') and FProx then // si (Evaluar) y Proximo
    begin
      ShowMessage('Error en ingreso');
      SetFocus;    
    end;
  end;
end;

(* Asignar al evento OnKeyDown de los tres edits *)
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Msg: TMsg;
begin
  if Key = VK_RETURN then //Enter: siguiente Edit
  begin
    FProx:= True;
    Perform(WM_NEXTDLGCTL,0,0);  // Edit siguiente
    PeekMessage(Msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE); //Sacar Beep
  end;
  if (Shift = [ssCtrl])and (Lo(Key) = 8) then //Ctrl+BackSpace: Edit anterior
  begin
    FProx:= False;
    Perform(WM_NEXTDLGCTL,1,0);  // Edit anterior
    PeekMessage(Msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  end;
end;

Saludos. :)

cmfab 03-11-2010 16:11:21

Gracias a ambos por responder el código de ecfisa es lo que necesitaba. osea solo validar si avanzo al proximo edit

Saludos

oscarac 06-05-2011 05:13:49

Cita:

Empezado por ecfisa (Mensaje 381124)
Hola cmfab, rrf.

Si no te entiendo mál, lo que deseas es el comportamiento que te expuso rrf sólo cuando avanzas al próximo Edit.
Pero que no aparezca el mensaje de error cuando retrocedas al Edit ya ingresado sin errores.

Si es así, una forma puede ser:

Código Delphi [-]
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure EditExit(Sender: TObject);
procedure EditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
FProx: Boolean;
public
end;

var
Form1: TForm1;

implementation {$R *.dfm}

(* Inicializar bandera de sentido (proximo / anterior) *)
procedure TForm1.FormCreate(Sender: TObject);
begin
FProx:= True;
end;

(* Asignar al evento OnExit de los tres Edits *)
procedure TForm1.EditExit(Sender: TObject);
begin
with Sender as TEdit do
begin
if (Text = '') and FProx then // si (Evaluar) y Proximo
begin
ShowMessage('Error en ingreso');
SetFocus;
end;
end;
end;

(* Asignar al evento OnKeyDown de los tres edits *)
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
Msg: TMsg;
begin
if Key = VK_RETURN then //Enter: siguiente Edit
begin
FProx:= True;
Perform(WM_NEXTDLGCTL,0,0); // Edit siguiente
PeekMessage(Msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE); //Sacar Beep
end;
if (Shift = [ssCtrl])and (Lo(Key) = 8) then //Ctrl+BackSpace: Edit anterior
begin
FProx:= False;
Perform(WM_NEXTDLGCTL,1,0); // Edit anterior
PeekMessage(Msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
end;
end;





Saludos. :)

Estimado Ecfisa...

como podria hacer para no estar metiendo este codigo en cada uno de los formularios, derrepente crear un componente como el ScreenColorCenter y solo colocarlo en el formulario (mi conocimientos sobre creacion de componentes esta en el nivel -1)

saludos y gracias


La franja horaria es GMT +2. Ahora son las 05:25:31.

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