Newsgroup: it.comp.programmare.win32
Titolo: [C++ Builder] Parametrizzare metodi OnClick

Salve,
avrei la necessità di applicare lo stesso metodo ad oggetti diversi 
appartenenti ad un'array:
TCSpinEdit* t[4];
//---------------------------------------------------------------------------
void __fastcall TForm1::bluClick(TObject *Sender, int i)
{
    t[i]->Color = clBlue;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    for (int i = 0; i < 4; i++) {
        t[i] = new TCSpinEdit(this);
        t[i]->Parent = this;
        t[i]->Left = i * 120;
        t[i]->PopupMenu = pm;
    };
}
Il metodo bluClick fa parte del PopupMenu pm. Il punto è che quando invoco 
il metodo, il colore dovrebbe cambiare nell'i-esimo elemento dell'array.
Ho provato ad inserire un parametro (l'ho messo anche nella dichiarazione 
del metodo ma ogni volta prima di compilare mi chiede se lo voglio togliere 
perché ha una lista di parametri incompatibile, pero compila lo stesso) ma 
non saprei come inizializzarlo.
Pensavo che tramite Sender ci fosse la possibilità di risalire all'oggetto 
chiamante, ma non saprei come estrarre il valore di quella i.
Saluti 

Inoltre pensavo di usare Sender in questo modo:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Sender = new TButton(this);
    Sender->Caption = "CIAO";
}
Ma dice che la proprietà Caption non è un membro di System::TObject.
Ma visto che tutti ereditano da TObject, costruendo Sender come un TButton 
(anzi mi pare che questo avvenga gia quando si clicca sul pulsante) non 
dovrei accedere anche alle sue proprietà? Anche se Caption non è un metodo, 
dal punto di vista del polimorfismo dell'oggetto non dovrebbe essere 
comunque accessibile?
In pratica Sender per cosa si può utilizzare?
Saluti 

}
Questo non è ovviamente possibile. Il Sender è già puntatore
all'oggetto per il quale viene invocato il click, quindi devi fare:
TCSpinEdit(Sender)->Color = clBlue;

In pratica Sender per cosa si può utilizzare?
Se leggessi la guida (cosa che ti è stata già consigliata) lo
sapresti.

 sapresti.
Si ma in questo caso volevo solo sapere come utilizzare il cast. 

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:ma5r14hbm3c1cfasr...@4ax.com...

Già provato ma non funziona. 

Già provato ma non funziona. 
Non è possibile. Deve funzionare.

Si ma in questo caso volevo solo sapere come utilizzare il cast. 
Se chiedi per cosa si può utilizzare Sender, devi leggere la guida.

 Se chiedi per cosa si può utilizzare Sender, devi leggere la guida.
Si beh, in questo caso mi interessava solo in quel contesto. Poi ho 
consultato l'help ho visto alcune funzioni di Sender, ma il discorso del 
cast ancora non va. 

 Non è possibile. Deve funzionare.
Ho aperto un nuovo progetto e ho inserito un CSpinEdit e un Button:
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
      TCSpinEdit(Sender)->Color = clRed;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TButton(Sender)->Caption = "CIAO";
}
Entrambi mi danno questo errore:
Pointer to structure required on left side of -> or ->*.
Uso C++ Builder 3 

Pointer to structure required on left side of -> or ->*.
Ha ragione il compilatore, devi castare a puntatore (l'esempio che
facevo è un refuso di Delphi). Il ragionamento però è quello.

cast ancora non va. 
Il "discorso" del cast è corretto, devi però castare a puntatore.
L'esempio che ti ho fatto riprendeva la tecnica Delphi in cui le
istanze di classi sono in realtà reference (quindi puntatori) e basta
quindi fare come ti ho detto. Nel caso di C++, essendo allocazione
statica degli oggetti, devi castare da TObject* a TButton* o quello
che ti serve. La tecnica è quella.

 che ti serve. La tecnica è quella.
Ok, ciao