Newsgroup: it.comp.lang.delphi
Titolo: Sender: TObject

tutte le volte che viene creata una procedura legata ad un evento, tra i
parametri compare "Sender: TObject". C'è qualcuno che mi può spiegare in
modo semplice cosa significa e a cosa serve?
Grazie



TObject è la classe madre di tutte le classi.
In altre parole, una variabile di tipo TObject può contenere un riferimento a 
qualsiasi tipo di classe.
Nel caso specifico dell'evento, si può fare il "cast" Sender alla classe 
dell'oggetto che ha scatenato l'evento.
Per esempio, se l'evento è stato scatenato da un pulsante (un oggetto di 
classe TButton), con
  TButton(Sender)
seguito dal punto, potrai accedere a tutti i metodi e proprietà del bottone 
stesso.
Attenzione che il cast è un'operazione intrisecamente non sicura, poichè è 
sempre ammessa; nel caso di cui sopra, il compilatore permetterebbe un cast 
di Sender anche, che ne so, come TList. Ma appena teneteresti di accedere a 
una proprietà o un metodo di TList(Sender) avresti un'eccezione di Access 
Violation.
Un modo "sicuro" di fare il casting è questo:
var
  B: TButton;
begin
  if (Sender is TButton) then
    B := TButton(Sender);
cioè controlliamo prima che Sender sia almeno di classe TButton (o un 
discendente di TButton).
o ancora
   (Sender as TButton)
seguito dal punto (che solleva un'eccezione EInvalidCast se Sender non è un 
TButton o un discendente di TButton). 
Spero di non aver fatto errori, sono andato a memoria. 
-- 
Mauro Falzari 
   [ 
http://digilander.libero.it/mauro.falzari
 ]
 
 "Se guardi nell'abisso, anche l'abisso guarda in te." 
   (Friedrich Nietzsche)

Govny wrote:

Tecnicamente un evento è un puntatore a metodo. Rimane comunque un
metodo che dovrebbe appartenere alla classe per cui lo si sta
scrivendo, supponiamo un TButton.
I progettisti di Delphi, tuttavia, hanno scelto come compromesso il
concetto di *delegazione* come sostituto del concetto di ereditarietà.
In questo modo, ogni volta che si scrive un evento per un determinato
oggetto non si è costretti ad ereditare dalla classe TButton ed
estenderla, a tutto vantaggio dell'aspetto RAD.
Quindi, l'evento appartiene generalmente alla classe form che è owner
dell'oggetto ivi depositato. Per cui, l'evento OnClick di un TButton
sarà il seguente:
procedure TForm1.Button1Click(Sender: TObject);
begin
end;
Il parametro Sender passato all'evento contiene il riferimento
(puntatore) all'oggetto che ha scatenato l'evento stesso. In questo
modo se hai la necessità di conoscere quale oggetto ha scatenato
l'evento hai la possibilità di farlo.
Per quanto riguarda il casting fai riferimento al post di Mauro.
guastatore

 modo semplice cosa significa e a cosa serve?
Prova a vedere gli esempi di Delphi per fare il "Drag and Drop", ti si 
aprirà un mondo nuovo ;-P
Fabio 

 spiegare in modo semplice cosa significa e a cosa serve?
La teoria ti è stata spiegata già molto bene, io ti faccio un esempio
pratico:
se hai 20 Edit che, nell'OnChange, fanno praticamente la stessa cosa, puoi
dichiarare solo un OnChange generico e linkare gli OnChange di tutte le Edit
al primo e unico.
Ma poi come fai a capire quale Edit ha scatenato l'evento OnChange?
A questo punto entra in campo il Sender.
Se per alcune Edit vuoi definire un comportamento particolare, per esempio,
puoi ricorrere al Sender, per capire appunto *quale* edit ha richiamato
l'evento, oppure raggruppare in modo logico queste edit, sfruttando le
proprietà che più ti aggradano (Tag è molto utile!).
Qualcosa del tipo:
case (Sender as TEdit).Tag of
    0: // fai questa cosa
    1: // fai quest'altra
...
In questo modo in due righe di codice gestisci n gruppi di componenti che
condividono lo stesso evento.
-- 
Jax
====
Bigamia significa una moglie di troppo. Monogamia anche.