Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Implementar evento en una rutina (https://www.clubdelphi.com/foros/showthread.php?t=87763)

joseprad 22-02-2015 17:44:06

Implementar evento en una rutina
 
Hola amigos.

Estoy escribiendo una función para saber si una linea de un grid esta vacía
Código Delphi [-]
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:
Código Delphi [-]
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

Código Delphi [-]
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:

Código Delphi [-]

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

Cita:

Empezado por AgustinOrtu (Mensaje 489207)
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:
Código Delphi [-]
...
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


La franja horaria es GMT +2. Ahora son las 14:05:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi