Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Invocar procedimiento OnKeyDown (https://www.clubdelphi.com/foros/showthread.php?t=93790)

oscarac 02-03-2019 04:39:53

Invocar procedimiento OnKeyDown
 
buenas noches
tengo un edit que valida ciertos datos cuando se presiona ENTER
entonces en el procedimiento OnkeyDown hago una serie de validaciones

Código Delphi [-]
procedure TfrmValesdeConsumo.edtTrabajadorKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
Var _Trabajador :String;
begin
  _pasar := '1';
  if (Key = 13) or (key = VK_TAB) then
    Begin
      _Trabajador := edtTrabajador.Text;
      if not VerificarTrabajador (_Trabajador) then
       begin
          frmCatalogoTrabajador := TfrmCatalogoTrabajador.Create(nil);
          frmCatalogoTrabajador.FormStyle := fsNormal;
          frmCatalogoTrabajador.Position := poMainFormCenter;
          frmCatalogoTrabajador.Visible := False;
          frmCatalogoTrabajador.t_para := True;
          frmCatalogoTrabajador.ShowModal;
          frmCatalogoTrabajador.Free;
        end;

      edtTrabajador.Text := dmComedor.vResultTrabajador;
      _TipoTrabajador := dmComedor.vResultTrabajadorTipo;
      lblTrabajador.Caption := Trim(dmComedor.vResultTrabajadorDescripcion);

      if dmComedor.g_ESTADOTrabajador = 'A' Then
      Begin
        edtTrabajador.Text := '';
        MessageDlg('Cliente Anulado', mtError, [mbAbort], 0);
      end;


      if dmComedor.g_StatusTrabajador = 'X' Then
      Begin
        edtTrabajador.Text := '';
        MessageDlg('Cliente no puede consumir', mtError, [mbAbort], 0);
      end;
      if edtTrabajador.Text = '' then
        edtTrabajador.SetFocus;

      tblTrabajador.Locate('KOD', dmComedor.vResultTrabajador, []);
      _NORetail := False;
      _SubvTotal := False;
      _SoloComedor := False;

      _SubvTotal := iif (dmComedor.vResultTrabajadorSubvencion = '1', True, False);
      if tblTrabajadorFechaCese.Value <> 0 Then
      _SoloComedor := iif (tblTrabajadorFechaCese.Value <= Trunc(dmComedor.g_FECHA), True, False);

      _NORetail := iif (tblTrabajadorFT.AsString = 'x', True, False);

      if _SoloComedor Then  // Preguntar por la fecha
      Begin
        edtTrabajador.Text := '';
        MessageDlg('No puede consumir', mtError, [mbAbort], 0);
      End;


    end;
end;


la pregunta es....
como puedo ejecutar este procedimiento sin necesidad de presionar enter

por ejemplo
cuando quiero presionar un click en un botton seria algo asi

Código Delphi [-]
btnOpcion.Click;

con el OnkeyDown como seria?

se entiende?

dec 02-03-2019 10:15:50

Hola a todos,

El evento no deja de ser un método, por lo tanto, puedes llamarlo como cualquier otro método. De hecho, el método "Click" de "TControl" al final termina llamando al evento "OnClick", si este ha sido definido previamente. Dicho esto, es posible algo como lo siguiente:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Key: Word;
begin
  Key := 49; // ASCII = 1

  // Llamamos al método "FormKeyDown"
  Self.FormKeyDown(nil, Key, []);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  ShowMessage(Chr(Key));
end;

... sin embargo, aunque lo anterior sea posible, no es lo más recomendable. Lo recomendable sería que la validación que tratas de hacer esté fuera del evento "KeyDown", en otro método, función o procedimiento, y, que uses dicha validación tanto en el evento "KeyDown", como en otro sitio en que la necesitases. En definitiva, se trata de desligar la validación del evento, precisamente, para no tener que llamar a dicho evento nosotros mismos, "inventándonos" argumentos, con los posibles problemas que eso puede suponer.


La franja horaria es GMT +2. Ahora son las 18:08:30.

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