PDA

Ver la Versión Completa : Asignar evento Oncalcfield en tiempo de ejecucion


el_barto
05-09-2005, 18:35:27
Buenos dias foro:

Tengo una duda puedo asignar el evento Onclalfield en tiempo de ejecucion, es decir como por ejemplo cuando yo oprima un button.

Se puede hacer esto?? ¿si se puede como debo hacerlo?, gracias por su ayuda :D

islu
05-09-2005, 19:13:10
Si claro, te creas una función cuya forma sea igual a la que el evento requiera, y la asignas asi :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables;

type
TForm1 = class(TForm)
Table1: TTable;
Button1: TButton;
procedure CalcField(DataSet: TDataSet);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CalcField(DataSet: TDataSet);
begin
ShowMessage('ISLU');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.OnCalcFields := CalcField;
end;

end.


Para saber cual es la forma del procedimiento, es decir, que parametros toma, basta con que crees una por defecto con el diseñador de Delphi, y luego crees la tuya.

Puedes hacerlo con cualquier evento, bien sea de una tabla, de un botón ( OnCLick ), de cualquier elementio visual. Solo has de tener en cuenta los parámetros de entrada.

Una cosa, para saber si un evento ya esta asignado :


if( not assigned( Table1.OnCalcFields ) ) then
Table1.OnCalcFields := CalcField
else
ShowMessage( 'Ya asignado!!!');


Asi evitas macharacar algún evento, o si lo tienes que asignar o no.

vtdeleon
05-09-2005, 23:33:52
Saludos

islu, Estas seguro que esto te funciona:-S. Hice un ejemplo casi identico y no marcha

jmariano
05-09-2005, 23:41:59
La respuesta dada por islu funciona, pero el problema es que, como asignamos el evento "OnCalcFields" mas tarde, tenemos que hacer un refresco o un desplazamiento en el DataSet para que se actualice el valor del campo calculado. (Esto lo comento en base a una pequeña prueba que hice sobre el tema).

Así que la asignación del evento quedaría, por ejemplo, así


procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.OnCalcFields := CalcField;
Table1.First; // Para que actualice el resultado, también podría ser 'Refresh'
end;


Saludos!

el_barto
05-09-2005, 23:46:40
Gracias J es ciero vt hazle un refresh y veras que funciona perfectamente

vtdeleon
06-09-2005, 00:08:46
Saludos

Ok,ok verdad, ya vi el error que tenia
Table1.OnCalcFields := CalcField(asignando dataset);//Como tenia un parametro, lo estaba asignando