Ora mi devo cimentare a creare dei derivati di Label, funzione specifica di VB.NET che VB6 si sognava beatamente.
Ereditarietà!!!
Class Casella
Inherits Label
End Class
Bene.
Praticamente a questo punto si chiama casella ma è praticamente ancora una Label.
Sostituisco Casella a Label nel codice.
Sub disponiCaselle(ByVal larghezza As Integer, ByVal sinistra As Integer)
Dim numero As Integer
numero = DateTime.DaysInMonth(anno, mese)
Dim cas As Casella
For n = 0 To numero - 1
cas = New Casella
With cas
.BorderStyle = BorderStyle.FixedSingle
.BackColor = Color.White
.Width = larghezza
.Left = sinistra
.Top = .Height * (n Mod numero)
.Text = GiornoDellaSettimana(CDate(n + 1 & "/" & mese & "/" & anno))
End With
Me.Controls.Add(cas)
Next
End Sub
E ovviamente funziona ancora.
E' possibile aggiungervi delle proprietà?
Provo...
Ecco la mia caselluccia: forte di esperienze già fatte, ho fatto in modo che il codice dapprima imposti la sua proprietà pubblica
testo, quindi inneschi il suo metodo
Scrivi per fare apparire sulla casella il testo.
Class Casella
Inherits Label
Public testo As String
Sub Scrivi()
Text = testo
End Sub
End Class
Ed ecco il codice che la usa:
Sub disponiCaselle(ByVal larghezza As Integer, ByVal sinistra As Integer)
Dim numero As Integer
numero = DateTime.DaysInMonth(anno, mese)
Dim cas As Casella
For n = 0 To numero - 1
cas = New Casella
With cas
.BorderStyle = BorderStyle.FixedSingle
.BackColor = Color.White
.Width = larghezza
.Left = sinistra
.Top = .Height * (n Mod numero)
.testo = GiornoDellaSettimana(CDate(n + 1 & "/" & mese & "/" & anno))
.Scrivi()
End With
Me.Controls.Add(cas)
Next
End Sub
Bene. Adesso voglio fare in modo che sia in qualche modo "passato come parametro" anche il tipo di controllo sul quale deve agire la subroutine
disponicaselle.
Ricordo che si deve usare una
funzione template o generica, con la parola chiave
Of.
Ricordiamo...
In pratica, mi serve una subroutine che agisca con diverse classi di oggetti, in quanto devo poterla usare con una classe o con una classe derivata della prima...
Ecco rinfrescata la memoria.
Si deve mettere
As New dopo la Of seguita dalla variabile, e bisogna dichiarare la variabile oggetto
As Object.
Ecco:
Sub disponiCaselle(Of T As New)(ByVal larghezza As Integer, ByVal sinistra As Integer)
Dim numero As Integer
numero = DateTime.DaysInMonth(anno, mese)
Dim cas As Object
For n = 0 To numero - 1
cas = New T
Ora posso creare una sottoclasse di Label per la seconda colonna...
Ecco i due oggetti.
Ho creato prima
Casella, destinato ad apparire sulla seconda e su eventuali altre colonne con sfondo bianco, successivamente
Calendario, destinato ad apparire sulla prima colonna con le date scritte sopra.
Nella prima ho una proprietà
testo e un metodo
Scrivi che non fa assolutamente nulla (in modo che quando il codice li chiami non generi un errore in quanto inesistenti); il metodo
Scrivi viene overridato nella classe derivata Calendario con un metodo
Scrivi che invece scrive il valore della proprietà
testo.
Class Casella
Inherits Label
Public testo As String
Overridable Sub Scrivi()
End Sub
End Class
Class Calendario
Inherits Casella
Overrides Sub Scrivi()
Text = testo
End Sub
End Class
la proprietà
testo non viene specificata nella classe derivata Calendario in quanto già presente nella classe genitrice e quindi ereditata.
Ed ecco il codice che chiama per due volte la funzione
disponiCaselle, l'una per la classe Calendario, prima colonna, e l'altra per la classe Casella, seconda colonna.
disponiCaselle(Of Calendario)(larghezze(0), SommaElementiDiArray(larghezze, 0))
disponiCaselle(Of Casella)(larghezze(1), SommaElementiDiArray(larghezze, 1))
Il risultato è perfetto: