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