Il parametro Sender che viene passato all'evento è di tipo TObject. Il tipo TObject rappresenta la classe base fondamentale dalla quale ereditano tutte le classi di Delphi (TComponent, TControl...fino ad arrivare alle più specifiche TButton, TLabel, che rappresentano i controlli visuali).
Considerando che è possibile fare in modo che più eventi, di componenti separati e diversi, puntino alla stessa procedura, non è possibile avere il parametro Sender di tipo TLabel o TButton, poichè questo escluderebbe l'una o l'altra categoria di classi.
Pertanto, il parametro Sender passa l'oggetto che ha scatenato l'evento come TObject, cioè come oggetto generico...sarà poi compito del programmatore analizzare a quale classe discendente da TObject esso appartiene. Per fare questo, è possibile utilizzare l'operatore is per controllare la classe di appartenenza e, successivamente, eseguire un cosiddetto "casting" per forzare il trattamento del parametro Sender in modo che si comporti secondo la classe che vogliamo noi.
Un esempio: supponi di avere sul form una Label e un Button e di aver associato all'evento OnClick di entrambi il seguente metodo di gestione:
codice:
procedure TForm1.ButtonAndLabelClick(Sender: TObject);
begin
if Sender is TLabel then
begin
ShowMessage(TLabel(Sender).Caption);
Exit;
end;
if Sender is TButton then
begin
ShowMessage(TButton(Sender).Caption);
Exit;
end;
end;
L'operatore is controlla il tipo di Sender, determinando se il clic è stato generato da un pulsante o da un'etichetta; successivamente, tratta forzatamente Sender come uno di tali controlli per poter accedere alle proprietà. L'uso di is è obbligatorio, poichè "castare" Sender ad un tipo al quale non appartiene genera errori: si deve sempre prima controllare a quale tipo appartiene.
Veniamo al tuo caso. Ciò che vuoi ottenere è il nome del componente. La proprietà Name è introdotta dalla classe TComponent, la classe che rappresenta i componenti, discendente di TObject e a sua volta classe base per tutti i componenti e i controlli visuali più specifici. Pertanto, puoi verificare semplicemente che Sender discenda da TComponent e, dopo aver eseguito il "cast" del parametro, accedere alla proprietà Name.
codice:
procedure TForm1.ButtonAndLabelClick(Sender: TObject);
begin
if Sender is TComponent then
ShowMessage(TComponent(Sender).Name);
end;
Spero di averti chiarito le idee. Si tratta di un discorso che riguarda nello specifico il paradigma della programmazione ad oggetti: complesso forse agli inizi, ma una volta compreso si rivela molto potente e soprattutto flessibile.
Ciao!