Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cancelar accion de un evento OnExit (https://www.clubdelphi.com/foros/showthread.php?t=43431)

FGarcia 11-05-2007 01:01:45

Cancelar accion de un evento OnExit
 
Hola nuevamente!

Se me hizo facil en un edit colocar un mensaje en el evento OnExit del mismo

Código Delphi [-]
procedure TMainFrm.edPlacasExit(Sender: TObject);
begin
  if edPlacas.Text = '' then
    begin
      Showmessage('¡Este Campo no puede estar Vacio!');
      edPlacas.SetFocus ;
    end
  else
    edPlacas.Color := ColorOrigen;
end;

Cuando se ingresa un dato salta al siguiente edit con el mismo evento. SI todos esos campos se llenan no hay problema todo funciona OK. El problema surge cuando quiero cancelar el ingreso de datos por x razon. Para cancelar tengo un Boton con su evento Onclik, sin embargo este no funciona, solo al cerrar el formulario se anula toda accion.

Alguien sabe como puedo resover esto? Se agradece la ayuda.

Lepe 11-05-2007 01:17:26

Este tipo de procedimientos tiene un fallo: Si el usuario no entra en ese Edit, no tendrá que salir, y por tanto, no se ejecuta el código.

Si no usas Bases de datos, lo mejor es que en el botón de Guardar Cambios, llames a un procedimiento que valide todas las posibles opciones:
Código Delphi [-]
function TForm1.ValidaTextos:Boolean
begin 
 Result := Trim(edplacas.text) <> EmptyStr;
 Result := Result and Trim(eddireccion.text) <> EmptyStr;
....

end;

procedure TForm1.Form1CloseQuery(.... var CanClose :Boolean);
begin 
  CanClose := ValidaTextos;
end;

Ya de camino he puesto la comprobación al cerrar el form, pero también deberías llamar a esa función antes de guardar los datos.

Saludos

FGarcia 11-05-2007 02:50:21

hola nuevamente!

No se si sea correcto continuar aqui pero en caso contrario por favor le solicito a los moderadores que lo muevan.

Lepe, por el momento me "brinque" el procedimiento del OnExit del Edit asi que hago esto con el boton de guardar cambios:

Código Delphi [-]
//Capturamos el peso e insertamos los datos en la bd
procedure TMainFrm.btnPesarClick(Sender: TObject);
begin
  btnPesar.Enabled := False;
  g_iEntrada := 0;
  if  (g_strEstado = 'M') then
    showmessage('¡La Báscula tiene movimiento ESPERE!')
  else if (g_strEstado = 'U') then
    showmessage('¡EL PESO ES NEGATIVO!')
  else
    try
      begin
        lblPesoCap.Caption := g_strDatos;
        frmDatos.MDOEntrada.Append;
        frmDatos.MDOEntrada.FieldByName('FOLIO').Value := tmpFolio ;
        frmDatos.MDOEntrada.FieldByName('PLACAS').Value := edPlacas.Text ;
        frmDatos.MDOEntrada.FieldByName('CLIENTE').Value := dbCliente.Text ;
        frmDatos.MDOEntrada.FieldByName('PRODUCTO').Value := dbProducto.Text ;
        frmDatos.MDOEntrada.FieldByName('OPERADOR').Value := edOperador.Text ;
        frmDatos.MDOEntrada.FieldByName('PESO_ENT').Value := g_strDatos;
        frmDatos.MDOEntrada.FieldByName('HF_ENT').Value := Now;
        frmDatos.MDOEntrada.Post;
      end;
    except
    on E:Exception do
      begin
        ShowMessage('¡ERROR al actualizar la base de datos!');
      end;
  end;

en el OnValidate del TField PLACAS

Código Delphi [-]
procedure TfrmDatos.MDOEntradaPLACASValidate(Sender: TField);
var
  Query: TMDOSQL;
begin
  if Trim(MDOEntrada.FieldByName('PLACAS').AsString) <> '' then
  begin
    Query := TMDOSQL.Create(nil);
      try
        Query.Database := frmCnx.MDODatabase1 ;
        Query.Transaction := frmCnx.MDOTransaction3 ;
        Query.SQL.Text := 'SELECT Placas FROM ENTRADA WHERE Placas = :Valor';
        Query.ParamByName('Valor').Value :=
                                  MDOEntrada.FieldByName('PLACAS').AsString;
        query.ExecQuery ;
        try
          if Trim(Query.Fields[0].AsString) <> '' then
            begin
              showmessage('¡Estas Placas estan duplicadas!');
              Abort;
            end;
        finally
          query.Close ;
        end;
      finally
        query.Free;
      end;
  end
  else
  begin
    ShowMessage('El campo placas es necesario');
    Abort;
  end;
end;

los dos mensaje de advertencia me aparecen si el campo placas esta duplicado o vacio, sin embargo al llenar el edit que contiene ese valor y volver a ejecutar el procedimiento PesarClick la BD me regresa un error
de que el campo placas es null. No entiendo que esta pasando. Se agradece toda la ayuda.

EDITO: uso D7, MDO, FB2.0

delphi.com.ar 11-05-2007 02:53:11

Otra cosa que se me ocurre hacer es desplazar forzosamente el foco (SelectNext(Self, True, True);) al intentar retirarte, y manejar una bandera o disparar una error al validar el valor al retirar el foco.

Saludos!

FGarcia 11-05-2007 05:19:24

uuuufffff! Nuevamente aqui!

Gracias Federico por tu respuesta pero sinceramente no te entendi, podrias explicarmelo con manzanas y palitos? Nuevamente gracias.

Lepe 11-05-2007 13:38:18

En un hilo relacionado te he contestado.

No sé si te gustará aquel método que soluciona este problema también.

Saludos


La franja horaria es GMT +2. Ahora son las 19:18:02.

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