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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.