Newsgroup: it.comp.lang.visual-basic
Titolo: [2008] eventi di un controllo istanziato a runtime

scusate se la domanda e' sciocca.
in una soluzione avevo messo un combo "cboPosition".
poi ho pensato bene di farlo con immagini, seguendo +- questo codice
http://www.codeproject.com/KB/combobox/ImageCombo_NET.aspx
quello che lui chiama MyCombo l'ho chiamato cboPosition, rinominando il 
vecchio cboPosition_
dopo qualche sistemazione funziona quasi tutto: carica le imamgini, sta dove 
deve stare, ecc., anche il .dropdownstyle modificato funziona.
non funzionano gli eventi. quelli del vecchio codice non li vede proprio, e 
negli eventi dei controlli del form non trovo piu (giustamente) quelli del 
cbo, che a designtime non esiste.
mi eroaccorto che buttando un controllo e mettendone uno nuovo gli eventi 
andavano comunque riscritti, anche se il nome del controllo era lo stesso. 
ma in questo caso a designtime non so come fargli generare gli eventi.
come faccio a farglieli gestire?
grazie, a.


Secondo me basta che nelle vecchie routine evento (che sono rimaste) 
aggiungi ... "Handles controllo.evento" subito dopo l'intestazione della 
sub.
Perché ho notato che se rimuovi un controllo, VB non ti sega le routine, ma 
solo l'"associazione" al controllo (ossia proprio "Handles...").
Bye
Raf 

 come faccio a farglieli gestire?
Mi correggano gli altri se sbaglio.
Supponiamo per comodità che tu sia interessato ad intercettare il solo 
evento click di un generico controllo che chiameremo C.
Supponiamo di disporre già di una routine in grado di processare un tale 
evento. Chiameremo questa routine foo().
In questo caso dovrebbe esserti sufficente una cosa del tipo:
AddHandler C.Click, AddressOf foo
Non dovrebbe esserci altro.
L'unica cosa che devi tenere presente (ma di cui sicuramente ti 
avvertirebbe il compilatore) è che foo() dovrà essere dichiarata con la 
firma che vedi qui sotto:
Sub foo(ByVal sender As Object, ByVal e As System.EventArgs)
altrimenti non potrai mai intercettare l'evento.
Lo stesso ragionamento si applica a casistiche più ampie: se a runtime 
devi creare un numero di bottoni non conosciuto a priori, poi ti basterà 
ciclare i pulsanti e per ognuno dar giù di AddHandler, sempre 
all'indirizzo della stessa routine. Va da sè che tale routine dovrà 
probabilmente interessarsi di stabilire quale dei bottoni ha lanciato 
l'evento e comportarsi di conseguenza.
S.

 altrimenti non potrai mai intercettare l'evento.
grazie a te e rafunk per la risposta. scusate il ritardo, appena postato 
sono andato in ferie una settimana e mi ero completamente scordato.
e scusatemi anche per un'altra cosa: di ferie avevo un gran bisogno: non 
andava perche' avevo cambiato i testi caricati nel combo. la sub si basava 
su
    Select Case cboPosition.Text
        Case "Cent"
peccato che ora il testo fosse "Center" ...
ora va.
pieta', nocomment :)
comunque stavo provando il tuo metodo.
'dich
    Private WithEvents cboPosition As New ComboIcon
'load
        ...
        Me.Controls.Add(cboPosition)
        AddHandler cboPosition.SelectedIndexChanged, AddressOf SetPosition
'routine, non legata al combo perche' la chiamo da varie parti
    Private Sub SetPosition(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles cboPosition.SelectedIndexChanged
'
'al momento e' semplicemente Private Sub SetPosition
'
        Dim swa As System.Drawing.Rectangle = 
Screen.PrimaryScreen.WorkingArea
        Select Case cboPosition.Text
            Case "Center"
                Me.Location = New System.Drawing.Point((swa.Width - Width) \ 
2, (swa.Height - Height) \ 2)
            ...
        End Select
    End Sub
e fin qui sembra piacergli.
solo che prima la chiamavo banalmente cosi'
    Private Sub cboPosition_SelectedIndexChanged(ByVal sender As 
System.Object, ByVal e As System.EventArgs)
        SetPosition()
    End Sub
che io aggiunga o no, alla fine della dichiarazione,
Handles cboPosition.SelectedIndexChanged
protesta che in setposition() gli mancano sender, e: ma non dovrebbe 
leggerseli dalla sub?
scusa di nuovo, sia la domanda iniziale che questa, temo un po' stupida.
grazie e ciao, a.

 pieta', nocomment :)
Pensa te che, nel mio caso, il bisogno di ferie si fa sentire durante 
tutto l'anno  :)

Hmmmm... mi sono appena svegliato, non sono molto lucido (e fu allora 
che, dal fondo della sala, si alzò una voce: <<'a stivi! E quanno mai 
sei lucido?>>)
	=:|
E se questo
	Handles cboPosition.SelectedIndexChanged
lo togli dalle spese?
Mi pare che aggiungere la clausola (sarà una clausola? boh!) Handles sia 
la maniera "statica" di fare le cose.
AddHandler, invece, ti consente di redizionare dinamicamente l'handling 
dell'evento verso dove ti pare.
Come ti ho anticipato non sono particolarmente lucido, tant'è vero che 
solo ora mi sono accordo che cerchi di chiamare SetPosition() dall'evento.
Ora, non puoi avere (almeno credo) due routine che fanno l'handling 
dello stesso evento.
Se è SetPosition() a dover intercettare SelectedIndexChanged, quella
	Private Sub cboPosition_SelectedIndexChanged(bla, bla)
non la devi avere. Non ha ragione di esistere, dal momento che è 
SetPosition() che deve gestire il tutto.
O togli l'AddHandler dal Load, e in quel caso puoi chiamare 
SetPosition() dal codice dell'evento.
SetPosition() richiede in ogni caso 'sender' ed 'e', quindi, se la 
chiami da dentro il codice dell'evento (quello generato da visual 
studio), devi comunque passarle i due parametri che l'evento porta con se.
Non so se sono stato chiaro abbastanza.
Eventualmente chiedi, e cercherò di riformulare. A spiegarmi non sono 
molto bravo  :)
S.

 stesso evento.
infatti, al contrario, ho n eventi che richiamano la stessa routine.
set position localizza il form rispetto allo schermo in almeno due casi:
1. clicco il combo, e gli dico 'mettiti al centro'
2. visualizzo controlli nascosti, il form cambia dimensioni, quindi il 
centro cambia.
in vb6 l'ho sempre risolta
- o mettendo il codice nel combo, e poi al resize chiamando cbo_click (orore 
:) quando vado di fretta),
- o localizzando il codice in una sub, e richiamando quella sia da cbo_click 
che da form_resize ecc.
aspe'...
si', non avevo ancora provato, ma funziona anche qui, con la setposition 
senza parametri di sorta, dichiarata
    Private Sub SetPosition()
e chiamata semplicemente con
    SetPosition()
sono gli handler, handles e i System.EventArgs che mi incasinano, ma vorrei 
capirci meglio perche' mi sembra uno dei core di dotnet.
non stare a perdere altro tempo, ragiono su quello che hai detto e poi mi 
addentro un po' nella documentazione, che, fra carta e web, con mia somma 
gioia, sta raggiungendo e superando in tonnellaggio quella dei vari linux...
alla fin fine non e' molto diverso da vb6. se smanetti, qualcosa fa, ma se 
vuoi fare le cose sul serio, tocca studiare e sudare. come sempre, 
d'altronde... e per fortuna che hanno rimesso f5, seno' lo scoraggiamento 
era totale :)
grazie mille e ciao, a.