PDA

Ver la Versión Completa : Implementar evento en una rutina


joseprad
22-02-2015, 17:44:06
Hola amigos.

Estoy escribiendo una función para saber si una linea de un grid esta vacía

function IsRowEmpty(Grid: TGrid): Boolean;
var
NumCols: Integer;
i, Camp: Integer;
begin
NumCols := Grid.Columns.Count;
Result := False;
Camp := 0;
with Grid do begin
first;
while not eof do begin
for i := 0 to NumCols - 1 do begin
if VarType(SelectRow.Value[i]) = 1 then
inc(Camp);
end;
Next;
end;
end;
if Camp = NumCols then
Result := True;
end;


El problema es que desearía desconectar al inicio, los eventos OnBeforePost y OnAfterPost y volver a implementarlos al final.

Para desconectarlos no tengo problema:

Grid.OnBeforePost:=nil;
Grid.OnAfterPost:=nil

Lo que no se como hacer es para reponerlos.
Mucha gracias.

Neftali [Germán.Estévez]
23-02-2015, 12:30:39
Define variables del mismo tipo que los eventos que quieres "desconectar".
Antes de "desconectarlos" apunta con las variables a los eventos. Luego los eventos a nil (como has hecho) y al final vuelves a asignar a los eventos los valores almacenados en las variables.

Igual que harías con otra variable de tipo simple.

En realidad los eventos, no son más que "enteros". Son punteros a una zona de memoria. Si guardas el valor de ese puntero y lo restauras al final, debe funcionar sin problemas.

AgustinOrtu
23-02-2015, 18:33:34
Grid.OnBeforePost:= FormX.GridBeforePost;
Grid.OnAfterPost:= FormX.GridAfterPost;

Esto siempre y cuando no crees el grid y los eventos en tiempo de ejecucion y lo hayas incrustado en el FormX.

Sino como te dijo Neftali, declaras dos metodos que tengan los mismos parametros que los respectivos OnBeforePost y OnAfterPost, por ejemplo:



interface
...
procedure MiGridBeforePost(// parametros);
procedure MiGridAfterPost(// parametros);
...


implementation
procedure MiGridBeforePost(// parametros);
begin

end;

procedure MiGridAfterPost(// parametros);
begin

end;

procedure TForm1.FormShow(Sender: TObject);
begin
Grid.OnBeforePost := NIL;
Grid.OnAfterPost := NIL;

Grid.OnBeforePost := MiGridBeforePost;
Grid.OnAfterPost := MiGridAfterPost;
end;


Si te fijas este es el trabajo sucio que te hace el delphi cuando asignas eventos desde el inspector de objetos :D

Neftali [Germán.Estévez]
23-02-2015, 18:48:31
Esto siempre y cuando no crees el grid y los eventos en tiempo de ejecucion y lo hayas incrustado en el FormX.
Sino como te dijo Neftali, declaras dos metodos que tengan los mismos parametros que los respectivos OnBeforePost y OnAfterPost, por ejemplo:


Creo que lo que él quiere es "desconectar" los eventos y luego volverlos a "conectar".
Lo que tú le estás sugiriendo es "cambiar" los existentes por unos que hayas programado tú.

Son dos cosas diferentes.

joseprad
01-03-2015, 15:44:35
Hola.
Disculparme pero he estado un poco ocupado y aun no había visto vuestras respuestas.
En primer lugar muchas gracias a todos.

Tal como dice Neftali, lo que yo deseo es desconectar los eventos al inicio y al final volverlos a cargar.

Lo que no se es que tipo de variable debo definir para poder guardar el evento.

ecfisa
01-03-2015, 18:45:48
Hola joseprad.

Un ejemplo en el que activas/desactivas los eventos por medio de dos botones:

...
type
TForm1 = class(TForm)
...
DBGrid1: TDBGrid;
btnDeactivate: TButton;
btnActivate: TButton;
procedure FormCreate(Sender: TObject);
procedure btnDeactivateClick(Sender: TObject);
procedure btnActivateClick(Sender: TObject);
procedure DataSetBeforePost(DataSet: TDataSet);
procedure DataSetAfterPost(DataSet: TDataSet);
private
FOldBeforePost,
FOldAfterPost: TDataSetNotifyEvent;
...

end;
...

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
with DBGrid1.DataSource.DataSet do
begin
FOldBeforePost:= BeforePost;
FOldAfterPost := AfterPost;
end;
end;

procedure TForm1.btnDeactivateClick(Sender: TObject);
begin
with DBGrid1.DataSource.DataSet do
begin
BeforePost:= nil;
AfterPost := nil;
end;
end;

procedure TForm1.btnActivateClick(Sender: TObject);
begin
with DBGrid1.DataSource.DataSet do
begin
BeforePost:= FOldBeforePost;
AfterPost := FOldAfterPost;
end;
end;

procedure TForm1.DataSetAfterPost(DataSet: TDataSet);
begin
ShowMessage('Evento AfterPost');
end;

procedure TForm1.DataSetBeforePost(DataSet: TDataSet);
begin
ShowMessage('Evento BeforePost')
end;
...


Saludos :)

joseprad
03-03-2015, 20:02:21
Muchas gracias es lo que necesitaba