Ver Mensaje Individual
  #8  
Antiguo 16-02-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
    // Recorrer la lista de publicadores
    for I := 0 to FPublicadores.Count - 1 do
    begin
      // Obtener la lista de endientes de este publicador
      (FPublicadores[i] as IPublicadorPendientes).getListaPendientes(Pendientes);

      // Publicar cada pendiente de este publicador
      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
Responder Con Cita