Delphi: creare e gestire Eventi Multipli (utilizzando una TList)

Questo secondo esempio sulla gestione degli eventi in Delphi permette di registrare più classi ad uno stesso evento. Questo viene fatto utilizzando un oggetto TList; non ho idea se sia la soluzione migliore, ma può essere un buono spunto per capire meglio il meccanismo.
Anche in questo caso tutto il castello si regge sul tipo di dato procedurale, che si definisce in questo modo:

TDecollo = procedure(Sender:TObject) of object;

TDecollo non è altro che un puntatore ad una procedura, che ancora deve essere specificata. E’ lo stesso meccanismo con cui si gestiscono gli eventi in C#, utilizzando i delegate.

In questo esempio abbiamo:

  • La classe TorreDiControllo che genera un evento “decollo”.
  • Più Shuttle che si registra all’evento e partono quando arriva il segnale.

Per implementare l’evento multicast la classe TorreDiControllo mantiene al suo interno un lista di oggetti ShuttleProntoAlDecollo, che hanno al loro interno il riferimento alla procedura da chiamare:

    ShuttleProntoAlDecollo = class
 
    decollo: TDecollo;
    property OnDecollo: TDecollo read decollo write decollo;
 
    end;

Per registrarsi all’evento gli Shuttle usano questo metodo:

   procedure TorreDiControllo.AddShuttleProntoAlDecollo(proc: TDecollo);
      var s: ShuttleProntoAlDecollo;
    begin
 
    s := ShuttleProntoAlDecollo.Create;
 
    s.decollo := proc;
 
    // La TList
    ShuttlesProntiAlDecollo.Add(s);
 
  end;

dove:

  • viene creto un nuovo oggetto ShuttleProntoAlDecollo
  • viene associata alla sua proprietà decollo (che è un puntatore ad un procedura) la procedura specificata dal chiamante
  • viene inserito l’oggetto creato nella lista

La procedura Decollo della TorreDiControllo richiama tutte le procedure registrate:

  for p in ShuttlesProntiAlDecollo do
    begin
 
      // Estraggo la classe ShuttleProntoAlDecollo dal TList
      s := ShuttleProntoAlDecollo(p);
 
      // Estraggo il puntatore alla procedura da chiamare
      f := s.decollo;
 
 
      // Chiamata della procedura indicata dallo shuttle
      if Assigned(f) then
        f(self);
 
    end;

Qui è possibile scaricare il progetto contenente le classi sopra descritte.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>