JavascriptProva

venerdì 9 agosto 2013

Soluzione del problema Multiline = True necessaria per cambiare l'altezza delle TextBoxes nelle mie classi Griglia.

Mi sono scontrato con un problema.
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 Class
e 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 Class
La 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