Nelle mie classi Griglia ho un tipo generico.
Ho provato a manipolare la proprietà Height delle TextBoxes in caso di una griglia costruita con questo tipo di controlli, ma ho scoperto che qui (diversamente dal VB6) per impostare un'altezza diversa da quella standard nelle TextBoxes è necessario impostare la proprietà Multiline di questi controlli a True.
Se nel corpo della dichiarazione della classe imposto la proprietà Multiline, ottengo un messaggio di errore perchè Multiline non è un membro di T. Infatti, diversamente da Height, Width, Top, Left, che sono condivise da tutti i Controls, per le quali basta porre un vincolo Control al generico T, questa proprietà non è condivisa da tutti i Controls, per cui quel vincolo non basta.
La soluzione che ho trovato è, nel caso delle TextBoxes, dichiarare nel programma istanziante la classe Griglia una classe che eredita da TextBox, nel cui costruttore agire sulla proprietà Multiline, dando in pasto alla istanziazione della classe Griglia questo nuovo tipo anzichè la TextBox.
In questo modo funziona. Posso così arricchire il costruttore della classe Griglia di altri due parametri relativi all'altezza e all'ampiezza delle TextBoxes.
Questo è il codice delle due classi HorGriglia e VertGriglia:
Imports System.Windows.Forms Public Class HorGriglia(Of T As {New, Control}) Sub New(ByRef myForm As Form, ByVal numCaselle As Integer, ByVal rowLength As Integer, ByVal larghezza As Integer, ByVal altezza As Integer) For n As Integer = 0 To (numCaselle - 1) Dim casella As T = New T casella.Width = larghezza casella.Height = altezza casella.Left = casella.Width * (n Mod rowLength) casella.Top = casella.Height * (n \ rowLength) myForm.Controls.Add(casella) Next End Sub End Class Public Class VertGriglia(Of T As {New, Control}) Sub New(ByRef myForm As Form, ByVal numCaselle As Integer, ByVal colLength As Integer, ByVal larghezza As Integer, ByVal altezza As Integer) For n As Integer = 0 To (numCaselle - 1) Dim casella As T = New T casella.Width = larghezza casella.Height = altezza casella.Top = casella.Height * (n Mod colLength) casella.Left = casella.Width * (n \ colLength) myForm.Controls.Add(casella) Next End Sub End Classe questo è il codice del programma che istanzia una delle classi:
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim miaGriglia As New VertGriglia(Of GTextBox)(Me, 14, 4, 100, 50) End Sub End Class Class GTextBox Inherits TextBox Sub New() Multiline = True End Sub End ClassLa parte evidenziata in rosso è la nuova classe che eredita da TextBox con la proprietà Multiline impostata a True, la quale viene data in pasto al codice che istanzia la classe VertGriglia (in verde)
Così funziona.
Nessun commento:
Posta un commento