Aquí va mi idea más desarrollada:
Partiremos de una clase TPendiente (si quieren llamarla TAviso está bien
) que represente un pendiente:
Código Delphi
[-]
TPendiente = class
private
FFuente: String;
FDescripcion: String;
public
property Fuente: String read FFuente write FFuente;
property Descripcion: String read FDescripcion write FDescripcion;
end;
Fuente sería el nombre de la entidad que genera el pendiente o aviso y Descripcion sería la descripción del pendiente. Obviamente la estructura real de esta clase dependerá de lo que se quiera publicar.
Luego tenemos la interfaz que publica mensajes
Código Delphi
[-]
IPublicadorPendientes = interface
['{B34CC894-1ED9-4968-BE00-09D48676F734}']
procedure getListaPendientes(Lista: TList);
end;
Lo que está entre corchetes es el GUID (
global unique identifier) de la interfaz y es necesario declararlo (Ctrl+Shift+G) para poder moldear una interfaz con el operador
as.
getListaPendientes deberá llenar la lista que se le pasa como parámetro con los pendientes que haya.
Después tenemos el gestor de pendientes:
Código Delphi
[-]
TGestorPendientes = class
private
FPublicadores: TInterfaceList;
public
constructor Create;
destructor Destroy; override;
procedure RegistrarPublicador(Publicador: IPublicadorPendientes);
procedure EnumerarPendientes(Publicar: TPublicarPendiente);
end;
Este gestor mantiene una lista interna de las entidades que se registren para publicar pendientes. Obsérvese que es una lista de interfaces, no de clases. Dicha lista se crearía en el constructor Create y se destruiría en el destructor.
Un entidad que quiera publicar pendientes se registra con el método RegistrarPublicador, quien simplemente añade la entidad a la lista interna.
El método EnumerarPendientes es el encargado de recorrer todos los pendientes de todas las entidades registradas. Pero este método no publica el pendiente, ya que esto es materia de la parte visual de la aplicación, que decidirá si pone el pendiente en un ListView, en un Memo, o lo manda por correo, o cualquier cosa que quiera hacer con el pendiente.
Para ello, al método se le pasa como parámetro un
procedimiento, que será el encargado de publicar el pendiente. El tipo TPublicarPendiente se define asi:
Código Delphi
[-]
TPublicarPendiente = procedure(Pendiente: TPendiente) of object;
Así, por ejemplo, el formulario principal puede declarar un método
Código Delphi
[-]
TMainForm = class(TForm)
private
procedure PublicarPendiente(Pendiente: TPendiente);
end;
que pondrá el pendiente en el control visual que desee. Cuando se requiera listar los pendientes se llamará al gestor:
Código Delphi
[-]
GestorPendientes.EnumerarPendientes(PublicarPendiente);
El método EnumerarPendientes podría implementarse así:
Código Delphi
[-]
procedure TGestorPendientes.EnumerarPendientes(Publicar: TProcesarPendiente);
var
Pendientes: TList;
I, J: Integer;
begin
Pendientes := TList.Create;
try
for I := 0 to FPublicadores.Count - 1 do
begin
(FPublicadores[i] as IPublicadorPendientes).getListaPendientes(Pendientes);
for J := 0 to Pendientes.Count - 1 do
begin
Publicar(TPendiente(Pendientes[J]));
end;
end;
finally
Pendientes.Free
end;
end;
Como dije antes, EnumerarPendientes simplemente recorre la lista de pendientes más no hace nada con ellos excepto llamar al método que se le pasa como parámetro.
Esto nos permite usar distintos métodos según sea el caso. Por ejemplo, además del método PublicarPendiente del formulario principal, podríamos tener un EnviarPendiente, que se encargue de mandar el pendiente por correo, de manera que
Código Delphi
[-]
GestorPendientes.EnumerarPendientes(EnviarPendiente);
tendría el efecto de enviar por correo la lista de pendientes.
// Saludos