JavascriptProva

domenica 12 agosto 2012

Problemi e nuove tecniche per creare matrici di controlli in VB.NET, ragionamenti...

Non comprendo la natura dell'errore la cui segnalazione ottengo dal codice che ho ideato prima. Non ricordo la dizione esatta della segnalazione di errore, ma è senz'altro un errore relativo al modo poco ortodosso di creare matrici di controlli che ho usato, in quanto richiama il riferimento a un oggetto assente.

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 Class
e 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 ArrayList
L'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