Newsgroup: it.comp.lang.visual-basic
Titolo: Creazione dinamica dei controlli

Salve a tutti. Ho la necessità di creare una serie di controlli
dinamicamente sulla base del risultato di un recordset ma mi sono trovato di
fronte al problema della gestione degli eventi di tali controlli.
A chiarimento allego un breve listato:
Public WithEvents cmdTest As VB.CommandButton
Private Sub Form_Load()
Set cmdTest = Controls.Add("VB.CommandButton", "test1")
cmdTest.Move 0, 0, 1215, 495
cmdTest.Visible = True
cmdTest.Caption = "Test1"
Set cmdTest = Controls.Add("VB.CommandButton", "test2")
cmdTest.Move 0, 960, 1215, 495
cmdTest.Visible = True
cmdTest.Caption = "Test2"
Set cmdTest = Controls.Add("VB.CommandButton", "test3")
cmdTest.Move 0, 1920, 1215, 495
cmdTest.Visible = True
cmdTest.Caption = "Test3"
End Sub
Private Sub cmdTest_Click()
MsgBox "Hai cliccato" & cmdTest.Caption
End Sub
Eseguendo tale codice vi sarà la creazione in run time di tre command
button, se però si clicca sui tre si noterà che solo il terzo reagisce
all'evento. Ora mi pare strano che i creatori di VB permettano la creazione
di più controlli dallo stesso oggetto ma non permettano la gestione degli
eventi di tutti controlli creati. Ho cercato in rete ma non ho trovato
niente che mi possa aiutare. Ringrazio chiuque mi possa dare una mano.
Saluti


per forza, hai dimensionato una sola variabile WITHEVENTS di 
tipo reference a As VB.CommandButton, e sarebbe <<cmdTest>>
però la assegni tre volte, ciascuna sovrascrivendo quella 
precedente. La reference è ovviamente solo un puntatore vuoto, 
non l'oggetto fisico (che io creerei con As New etc etc)
Per quanto riguarda il metodo Add dell'insieme Controls, non ne 
so molto e quindi non ti posso dire se la sintassi che usi sia 
giusta (suppongo di si, anche se mi sorprende che
in : Set cmdTest = Controls.Add("VB.CommandButton", "test2")
il primo argomento sia dichiarato di tipo stringa e non ti tipo 
CommandButton, ma, ripeto, non so come funziona Add su 
quell'insieme li).
resta il fatto che  <<cmdTest>>  non può che puntare ad un solo 
controllo alla volta, e giustamente tiene traccia dell'ultimo 
assegnatogli.
Con VB6 non si poteva dichiarare una matrice di variabili 
vithevents, che sarebbe stata una gran figata, quindi ti tocca 
dichiarare cmdTest_1, cmdTest_2, cmdTest_3 e così via.
Se c'è qualche workaround più elegante e utile sarei interessato 
anche io ovviamente
ciao
cccp++mario



Allora, hai un paio di possibilità
Una è questo vecchio post (ma mai provato)
http://groups.google.com/groups?q=a+run+time+group:it.comp.lang.visual-basic&hl=it&lr=&ie=UTF-8&group=it.comp.lang.visual-basic&selm=WW6i2.4244%24u8.11704%40remarQ2&rnum=4
(Lascio a te l'onere di ricostruire per intero l'indirizzo)
Questo sembra il sistema consigliato da MSDN alla voce "Add Method (Controls
Collection)"
Un'altra è l'uso della mia classe ObjectArray che puoi trovare qui (ti
servirà un textbox di tipo array sul form con indice 0):
http://www.neodatatype.net/Default.aspx?page=directory&root=downloads/&path=VB6/flowChart/sources
Tempo fa mi pare di essere riuscito a trovare un terzo sistema alternativo,
sempre basato sulla Controls.Add, ma non trovo più il post :)
Ciao

 Collection)"
Vedo adesso questa postilla sull'uso di VBControlExtender:
Restrictions on Setting the References to the Variable
There is one caveat to be aware of when setting the VBControlExtender object
to a dynamically added control: intrinsic controls cannot be set to the
variable.
Ciao

 ha scritto nel messaggio
news:LJB6d.14900$75.6...@news3.tin.it...
