Ho trovato un altro modo di aggiungere controlli a un form.
Ho ricopiato il codice sfrondandolo di alcune righe che devo ancora comprendere, e non ottengo alcuna segnalazione di errori. Il problema, però, è che una volta aggiunti i controlli non ho più alcun riferimento ai singoli elementi. Non ho creato un vero e proprio array, o matrice che dir si voglia, perchè una volta che l'identificatore è stato attribuito a un nuovo controllo, si perde il riferimento a quello precedente.
Il codice è questo:
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim LV As Integer Dim Btn As Button For LV = 0 To 49 Btn = New Button Btn.Left = Btn.Width * (LV Mod 10) Btn.Top = Btn.Height * (LV \ 10) Btn.Text = "???" Me.Controls.Add(Btn) Next End Sub End Classe funziona egregiamente.
L'unico problema è che ho perso i riferimenti.
Ossia, se voglio richiamare un bottone dell'insieme di quelli aggiunti al form non ho nessun "appiglio" con il quale chiemarlo. Sono tutti bottoni"senza nome".
Vediamo come si risolve la cosa...
In realtà, una delle righe che ho cancellato è questa marcata in rosso:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim LV As Integer
Dim Btn As Button
For LV = 0 To 49
Btn = New Button
Btn.Left = Btn.Width * (LV Mod 10)
Btn.Top = Btn.Height * (LV \ 10)
Btn.Text = "???"
Me.Controls.Add(Btn)
Buttons.Add(Btn)
Next
End Sub
End Class
Se lascio questa riga nel mio IDE, ottengo una segnalazione di errore:
Errore 1 'Buttons' non dichiarato. Non è accessibile a causa del livello di protezione....perchè nell'esempio in rete questo Buttons è un array.
Vediamo il codice usato per crearlo...
Friend Buttons As ArrayList Buttons = New ArrayListL'oggetto ArrayLiet viene dichiarato e poi istanziato.
Non mi è chiaro ancora perchè Friend...
Comunque, poi, mentre vengono aggiunti gli elementi al Form, ogni elemento viene aggiunto all'ArrayList chiamata Buttons.
In tal modo si può fare probabilmente riferimento al singolo elemento della matrice.
E infatti ho scritto un piccolo evento Click del Form, che cambia il testo dell'elemento 3 dell'array di bottoni, e funziona:
Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click Buttons(3).text = "Fanculo" End Sub
Conclusioni: usare un unico identificatore per caricare tutti i controlli che si vogliono, avendo l'accortezza di inserire ogni controllo in un oggetto di classe ArrayList, in modo da poter identificare ogni controllo della matrice per mezzo di un indice.
Nessun commento:
Posta un commento