Delphi: creare e gestire un evento

Questo è un piccolo esempio di come creare in delphi un evento, e di come registrarsi ad esso.
Tutto il meccanismo si basa sul tipo di dato procedurale, che si definisce in questo modo:

TDecollo = procedure(Sender:TObject) of object;

TDecollo in questo caso 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”.
  • La classe Shuttle che si registra all’evento e parte quando arriva il segnale.

Come prima cosa occorre definire il puntatore:

TDecollo = procedure(Sender:TObject) of object;

Per poter assegnare una procedura a questo puntatore occorre che questa rispetti il numero ed il tipo dei parametri in ingresso, in questo caso un parametro di tipo TObject.

Questa è la definizione della classe TorreDiControllo:

TorreDiControllo = class
 
    FOnDecollo: TDecollo;
 
    public
      procedure Decollo;
 
      property OnDecollo : TDecollo read FOnDecollo write FOnDecollo;
 
  end;

Quindi, al puntatore FOnDecollo potra essere assegnata, tramite la proprietà OnDecollo, la procedura che verrà eseguita.

La procedura Decollo invece, è la seguente:

procedure TorreDiControllo.Decollo;
  begin
 
    Writeln('Torre di controllo: segnale di decollo inviato');
 
    if Assigned(OnDecollo) then
      OnDecollo(self);
 
  end;

Non fa altro che verificare con il metodo Assigned che la procedura a cui punta OnDecollo sia stata valorizzata. Se lo è allora la esegue.

La classe Shuttle non fa altro che dichiarare una procedura in questo modo:

procedure OnSegnaleDiDecollo(Sender: TObject);

In questo esempio, il program non fa altro che:

  • Istanziare le classi TorreDiControllo e Shuttle
         Torre := TorreDiControllo.Create;
         apollo13 := Shuttle.Create;
  • Registrare lo shuttle all’evento Decollo
    Torre.OnDecollo := apollo13.OnSegnaleDiDecollo;
  • Chiamare la procedura Decollo della torre di controllo
    Torre.Decollo;
  • Osservare ammirati la fase di lancio dello Shuttle

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

Delphi non supporta la gestione di eventi multipli, ovvero, in questo esempio, non si possono registrare più classi Shuttle all’evento Decollo. E’ possibile farlo gestendo all’interno della classe che genera l’evento una lista, per esempio una TList.

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>