Matrici di controlli per gli utenti di Visual Basic 6.0
Aggiornamento: novembre 2007
Benché le matrici di controlli non siano più supportate in Visual Basic 2008, mediante il modello di eventi è possibile emulare e attingere alla maggior parte delle funzionalità delle matrici di controlli.
Differenze concettuali
In Visual Basic 6.0 le matrici di controlli possono essere utilizzate per gestire i controlli di un form; esse, inoltre, consentono di condividere i gestori eventi, di scorrere i gruppi di controlli e di aggiungere controlli in fase di esecuzione.
In Visual Basic 2008 le matrici di controlli non sono più supportate. Le modifiche al modello di eventi, infatti, ne rendono inutile l'utilizzo. Mediante .NET Framework, inoltre, è possibile disporre delle stesse funzionalità offerte dai controlli.
Condivisione dei gestori eventi
In Visual Basic 6.0 era possibile utilizzare le matrici di controlli per specificare un gruppo di controlli che condividevano una serie di eventi. Era necessario che i controlli fossero dello stesso tipo e che avessero lo stesso nome.
In Visual Basic 2008 tutti i gestori eventi possono gestire gli eventi di più controlli, perfino dei controlli con nomi differenti e di tipo diverso.
È ad esempio possibile aggiungere due controlli Button (Button1 e Button2) e un controllo CheckBox (CheckBox1) a un form, quindi creare un gestore eventi per gestire l'evento Click per tutti i tre controlli.
Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click
Scorrimento dei controlli
Un'altra funzionalità delle matrici di controlli di Visual Basic 6.0 consisteva nella possibilità di scorrere un gruppo di controlli mediante la proprietà Index. Ad esempio, per eliminare il testo relativo a tutti i controlli TextBox contenuti in una matrice di controlli era possibile scorrere la matrice utilizzando la proprietà Index come variabile del ciclo.
Anche se in Visual Basic 2008 i controlli non presentano la proprietà Index, è comunque possibile scorrere i controlli di un form o di un contenitore utilizzando la classe Control.ControlCollection della classe Control.
In Visual Basic 6.0 i controlli di una stessa matrice di controlli potevano trovarsi in più contenitori. Ad esempio, i controlli TextBox contenuti in due diversi controlli Frame potevano far parte della stessa matrice di controlli.
In Visual Basic 2008, l'insieme Controls restituisce solo i controlli contenuti in un unico contenitore. Occorre scorrere separatamente i controlli di ogni contenitore di controlli. A tale fine è possibile utilizzare una funzione ricorsiva.
Aggiunta di controlli in fase di esecuzione
In Visual Basic 6.0 era possibile aggiungere controlli a una matrice di controlli in fase di esecuzione mediante l'istruzione Load. I controlli dovevano essere dello stesso tipo della matrice di controlli e quest'ultima doveva essere stata creata in fase di progettazione con almeno un elemento. Dopo aver aggiunto il controllo, la proprietà Visible doveva essere impostata su True.
In Visual Basic 2008, i controlli sono aggiunti in fase di esecuzione utilizzando la parola chiave New in un'istruzione Dim e quindi ricorrendo al metodo Add per il contenitore a cui si desidera aggiungere il controllo.
Aggiunta di gestori eventi in fase di esecuzione
In Visual Basic 6.0, quando si aggiungeva un controllo a una matrice di controlli in fase di esecuzione, i nuovi eventi di controllo erano automaticamente gestiti dagli eventi relativi alla matrice di controlli.
In Visual Basic 2008 occorre definire i gestori eventi per i controlli aggiunti in fase di esecuzione. A tale fine è possibile utilizzare l'istruzione AddHandler.
Modifica del codice per le matrici di controlli
Nel codice riportato di seguito vengono illustrate le differenze nelle tecniche di codifica tra Visual Basic 6.0 e Visual Basic 2008.
Condivisione dei gestori eventi
Nell'esempio riportato di seguito si descrive come condividere il gestore eventi Change (TextChanged in Visual Basic 2008) per un gruppo di tre controlli TextBox. In Visual Basic 2008 la clausola Handles del gestore eventi specifica quale controllo sarà gestito dall'evento. Il gestore eventi restituisce un Object generico. Occorre quindi eseguirne il cast nello specifico tipo di oggetto (in questo caso TextBox) che si desidera gestire. A tale fine, utilizzare il metodo DirectCast.
' Visual Basic 6.0
Private Sub Text1_Change(Index As Integer)
Select Case Index
Case 0
MsgBox("The text in the first TextBox has changed")
Case 1
MsgBox("The text in the second TextBox has changed")
Case 2
MsgBox("The text in the third TextBox has changed")
End Select
End Sub
' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
Select Case DirectCast(sender, TextBox).Name
Case TextBox1.Name
MsgBox("The text in the first TextBox has changed")
Case TextBox2.Name
MsgBox("The text in the second TextBox has changed")
Case TextBox3.Name
MsgBox("The text in the third TextBox has changed")
End Select
End Sub
Nota: |
---|
Il comportamento dell'evento in Visual Basic 2008 è leggermente diverso. L'evento TextChanged viene generato sia quando ogni controllo viene inizializzato (ad esempio nell'evento Form_Load) sia quando si apportano modifiche al testo in fase di esecuzione. In Visual Basic 6.0 l'evento Change veniva generato soltanto quando il testo subiva modifiche. |
Scorrimento dei controlli
Nel seguente esempio viene mostrata una funzione che consente di scorrere un gruppo di controlli di caselle di testo al fine di eliminarne il contenuto. Nell'esempio relativo a Visual Basic 6.0 la proprietà Index di una matrice di controlli è utilizzata come variabile del ciclo.
In Visual Basic 2008, un oggetto Control viene passato come argomento; tale oggetto presenta un insieme Control.ControlCollection contenente tutti i controlli che si trovano in quel controllo. L'operatore Typeof è utilizzato per determinare se ogni controllo è di tipo TextBox.
Nota: |
---|
Gli oggetti Form sono di tipo Control; è anche possibile passare un tipo Form come argomento. |
Poiché i controlli nidificati non sono inclusi nell'insieme Control.ControlCollection, si utilizza il metodo HasChildren per determinare se ogni controllo contiene altri controlli e, in tal caso, viene chiamata ricorsivamente la funzione ClearText.
' Visual Basic 6.0
Private Sub ClearText()
For i = 0 To Text1().UBound
Text1(i).Text = ""
Next
End Sub
' Visual Basic
Private Sub ClearText(ByVal container As Control)
Dim ctrl As Control
For Each ctrl In container.Controls
If TypeOf (ctrl) Is TextBox Then
ctrl.Text = ""
End If
If ctrl.HasChildren Then
ClearText(ctrl)
End If
Next
End Sub
Aggiunta di controlli in fase di esecuzione
L'esempio riportato di seguito mostra come aggiungere a un form un controllo casella di testo in fase di esecuzione. In Visual Basic 6.0 il controllo è aggiunto a una matrice di controlli. In Visual Basic 2008 il controllo è aggiunto all'insieme Control.ControlCollection. In Visual Basic 6.0 gli eventi del nuovo controllo TextBox erano gestiti automaticamente dalla matrice di controlli. In Visual Basic 2008, invece, è necessario implementare la gestione degli eventi mediante l'istruzione AddHandler.
In entrambi gli esempi si presume che l'aggiunta del controllo casella di testo alla form sia effettuata in fase di progettazione e, nell'esempio relativo a Visual Basic 6.0, che sia stata creata una matrice di controlli contenente un solo elemento. Nell'esempio relativo a Visual Basic 2008 si suppone inoltre che esista un gestore eventi denominato TextChangedHandler per il primo controllo TextBox.
' Visual Basic 6.0
Private Sub AddControl()
' Add a TextBox as the second element of a control array.
Load Text1(1)
' Set the location below the first TextBox.
Text1(1).Move Text1(0).Left, Text1(0).Top + 500
' Make the new TextBox visible
Text1(1).Visible = True
' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler
Note sull'aggiornamento
Quando un'applicazione creata in Visual Basic 6.0 viene aggiornata a Visual Basic 2008, tutte le matrici di controlli sono aggiornate in classi di matrici di controlli specializzate nella gestione dei controlli. Queste classi sono contenute nello spazio dei nomi Microsoft.VisualBasic.Compatibility.VB6 e sono utilizzate dagli strumenti di aggiornamento per emulare le funzionalità di Visual Basic 6.0 relative alle matrici di controlli.
Benché sia possibile utilizzare queste classi di matrici di controlli in nuovi progetti sviluppati in Visual Basic 2008, si consiglia di utilizzare invece il modello di eventi e le funzioni di .NET Framework.
Vedere anche
Concetti
Eventi e gestione degli eventi per gli utenti di Visual Basic 6.0