PDA

Ver la Versión Completa : Cancelar accion de un evento OnExit


FGarcia
11-05-2007, 01:01:45
Hola nuevamente!

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

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:

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:


//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


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 (http://www.clubdelphi.com/foros/showthread.php?t=43441) te he contestado.

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

Saludos