|
■クラス別に構造体を定義した例
@1つのサイズの大きい固定文字列が定義されている構造体(A1)から複数の構造体(B1,B2,B3…Bn)にコピーする手法
A複数の構造体(B1,B2,B3…Bn)から1つのサイズの大きい固定文字列が定義されている構造体(A1)にコピーする手法
※複数の構造体には、複数の固定文字列が定義されています。
Public Class ClassA
Inherits Class1
Public MAXLENGTH As Integer = 17
Public Sub New()
MyBase.New(2, 3, 5, 7)
End Sub
Public Property aaaa() As String
Get
Return MyBase.Value(0)
End Get
Set(ByVal value As String)
MyBase.Value(0) = value
End Set
End Property
Public Property bbbb() As String
Get
Return MyBase.Value(1)
End Get
Set(ByVal value As String)
MyBase.Value(1) = value
End Set
End Property
Public Property cccc() As String
Get
Return MyBase.Value(2)
End Get
Set(ByVal value As String)
MyBase.Value(2) = value
End Set
End Property
Public Property dddd() As String
Get
Return MyBase.Value(3)
End Get
Set(ByVal value As String)
MyBase.Value(3) = value
End Set
End Property
End Class
Public Class ClassB
Inherits Class1
Public Sub New()
MyBase.New(100)
End Sub
Public Property strB() As String
Get
Return MyBase.Value(0)
End Get
Set(ByVal value As String)
MyBase.Value(0) = value
End Set
End Property
End Class
Public Class ClassC
Inherits Class1
Public MAXLENGTH As Integer = 5
Public Sub New()
MyBase.New(2, 3)
End Sub
Public Property aaaa() As String
Get
Return MyBase.Value(0)
End Get
Set(ByVal value As String)
MyBase.Value(0) = value
End Set
End Property
Public Property bbbb() As String
Get
Return MyBase.Value(1)
End Get
Set(ByVal value As String)
MyBase.Value(1) = value
End Set
End Property
End Class
Public Class ClassD
Inherits Class1
Public MAXLENGTH As Integer = 2
Public Sub New()
MyBase.New(2)
End Sub
Public Property aaaa() As String
Get
Return MyBase.Value(0)
End Get
Set(ByVal value As String)
MyBase.Value(0) = value
End Set
End Property
End Class
Public Class Class1
Private _InnerValue As String
Private _FieldStarts() As Integer
Private _FieldLengths() As Integer
Public Sub New(ByVal ParamArray FieldLengthS() As Integer)
Dim TotalSize As Integer = 0
Dim FieldLength As Integer
Dim Pos As Integer = 0
Dim Idx As Integer = 0
_FieldStarts = New Integer(FieldLengthS.Length) {}
_FieldStarts(Idx) = Pos
For Each FieldLength In FieldLengthS
TotalSize += FieldLength
Idx += 1
Pos += FieldLength
_FieldStarts(Idx) = Pos
Next
_FieldLengths = FieldLengthS
_InnerValue = New String(" "c, TotalSize)
End Sub
Protected Property InnerValue(ByVal start As Integer) As String
Get
Return _InnerValue
End Get
Set(ByVal value As String)
Dim NewValueLength = value.Length
Dim MyValueLength = _InnerValue.Length
Select Case NewValueLength
Case Is < MyValueLength
If Trim(_InnerValue) <> "" Then
_InnerValue = _InnerValue.Substring(0, start) & value & New String(" "c, MyValueLength - (Trim(_InnerValue).Length + NewValueLength))
Else
_InnerValue = value & New String(" "c, MyValueLength - NewValueLength)
End If
Case MyValueLength
_InnerValue = value
Case Else
If Trim(_InnerValue) <> "" Then
_InnerValue = Trim(_InnerValue) & value.Substring(start, MyValueLength)
Else
_InnerValue = value.Substring(start, MyValueLength)
End If
End Select
End Set
End Property
Public Property Value(ByVal Index As Integer) As String
Get
Dim FieldStart As Integer = _FieldStarts(Index)
Dim FieldLength As Integer = _FieldLengths(Index)
Return _InnerValue.Substring(FieldStart, FieldLength)
End Get
Set(ByVal value As String)
Dim FieldStart As Integer = _FieldStarts(Index)
Dim FieldLength As Integer = _FieldLengths(Index)
Dim NewValue As New System.Text.StringBuilder
'設定する部分の前
If FieldStart > 1 Then
NewValue.Append(_InnerValue.Substring(0, FieldStart))
End If
'設定する文字列
Select Case value.Length
Case Is < FieldLength
NewValue.Append(value.PadRight(FieldLength, " "c))
Case FieldLength
NewValue.Append(value)
Case Else
NewValue.Append(value.Substring(0, FieldLength))
End Select
'設定する部分の後ろ
If _InnerValue.Length > FieldStart + FieldLength + 1 Then
NewValue.Append(_InnerValue.Substring(FieldStart + FieldLength))
End If
_InnerValue = NewValue.ToString
End Set
End Property
Public Sub Copy(ByVal Dest As Class1, Optional ByVal start As Integer = 0)
Dest.InnerValue(start) = Me.InnerValue(start)
End Sub
End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim clsA As New ClassA
Dim clsB As New ClassB
Dim clsC As New ClassC
Dim clsD As New ClassD
'各構造体の内容をメインとなる構造体にコピー
clsA.aaaa = "1"
clsA.bbbb = "a1"
clsA.cccc = "a123"
clsA.dddd = "ああいう"
clsC.aaaa = "2"
clsC.bbbb = "c2"
clsD.aaaa = "3"
clsA.Copy(clsB)
clsC.Copy(clsB, clsA.MAXLENGTH)
clsD.Copy(clsB, clsA.MAXLENGTH + clsC.MAXLENGTH)
'メインとなる構造体の内容を各構造体にコピー
clsA = New ClassA
clsC = New ClassC
clsD = New ClassD
clsB.Copy(clsA, 0)
clsB.Copy(clsC, clsA.MAXLENGTH)
clsB.Copy(clsD, clsA.MAXLENGTH + clsC.MAXLENGTH)
End Sub
|