Array as a Class Member

后端 未结 3 830
醉话见心
醉话见心 2021-01-02 06:57

I\'m designing a dynamic buffer for outgoing messages. The data structure takes the form of a queue of nodes that have a Byte Array buffer as a member. Unfortunately in VB

相关标签:
3条回答
  • 2021-01-02 07:32

    So it turns out I needed a little help from OleAut32.dll, specifically the 'VariantCopy' function. This function faithfully makes an exact copy of one Variant to another, including when it is ByRef!

    'clsTest
    
    Private Declare Sub VariantCopy Lib "OleAut32" (pvarDest As Any, pvargSrc As Any)
    
    Private m_Buffer() As Byte
    
    Public Property Let Buffer(buf As Variant)
        m_Buffer = buf
    End Property
    
    Public Property Get Buffer() As Variant
        Buffer = GetByRefVariant(m_Buffer)
    End Property
    
    Private Function GetByRefVariant(ByRef var As Variant) As Variant
        VariantCopy GetByRefVariant, var
    End Function
    

    With this new definition, all the tests pass!

    'mdlMain
    
    Public Sub Main()
        Dim buf() As Byte
        ReDim buf(0 To 4)
    
        buf(0) = 1
        buf(1) = 2
        buf(2) = 3
        buf(3) = 4
    
    
        Dim oBuffer As clsTest
        Set oBuffer = New clsTest
    
        'Test #1, the assignment
        oBuffer.Buffer = buf    'Success!
    
        'Test #2, get the value of an index in the array
        Debug.Print oBuffer.Buffer()(2)    'Success!  This is from GSerg's comment on the question
    
        'Test #3, change the value of an index in the array and verify that it is actually modified
        oBuffer.Buffer()(2) = 27
        Debug.Print oBuffer.Buffer()(2)  'Success! Diplays "27" in the immediate window
    End Sub
    
    0 讨论(0)
  • 2021-01-02 07:37

    Not the most elegant solution, but modeling from the code you provided...

    In clsTest:

    Option Explicit
    
    Dim ArrayStore() As Byte
    
    Public Sub AssignArray(vInput As Variant, Optional lItemNum As Long = -1)
        If Not lItemNum = -1 Then
            ArrayStore(lItemNum) = vInput
        Else
            ArrayStore() = vInput
        End If
    End Sub
    
    Public Function GetArrayValue(lItemNum As Long) As Byte
        GetArrayValue = ArrayStore(lItemNum)
    End Function
    
    Public Function GetWholeArray() As Byte()
        ReDim GetWholeArray(LBound(ArrayStore) To UBound(ArrayStore))
        GetWholeArray = ArrayStore
    End Function
    

    And in mdlMain:

    Sub test()
    Dim buf() As Byte
    Dim bufnew() As Byte
    Dim oBuffer As New clsTest
    
        ReDim buf(0 To 4)
        buf(0) = 1
        buf(1) = 2
        buf(2) = 3
        buf(3) = 4
    
        oBuffer.AssignArray vInput:=buf
        Debug.Print oBuffer.GetArrayValue(lItemNum:=2)
    
        oBuffer.AssignArray vInput:=27, lItemNum:=2
        Debug.Print oBuffer.GetArrayValue(lItemNum:=2)
    
        bufnew() = oBuffer.GetWholeArray
        Debug.Print bufnew(0)
        Debug.Print bufnew(1)
        Debug.Print bufnew(2)
        Debug.Print bufnew(3)
    
    End Sub
    

    I added code to pass the class array to another array to prove accessibility.

    Even though VBA won't allow us to pass arrays as properties, we can still use Functions to pick up where properties fall short.

    0 讨论(0)
  • 2021-01-02 07:39

    @Blackhawk,

    I know it is an old post, but thought I'd post it anyway.

    Below is a code I used to add an array of points to a class, I used a subclass to define the individual points, it sounds your challenge is similar:

    Mainclass tCurve

    Private pMaxAmplitude As Double
    Private pCurvePoints() As cCurvePoint
    
    Public cDay As Date
    Public MaxGrad As Double
    
    Public GradChange As New intCollection
    Public TideMax As New intCollection
    Public TideMin As New intCollection
    Public TideAmplitude As New intCollection
    Public TideLow As New intCollection
    Public TideHigh As New intCollection
    
    Private Sub Class_Initialize()
    
        ReDim pCurvePoints(1 To 1500)
        ReDim curvePoints(1 To 1500) As cCurvePoint
    
        Dim i As Integer
    
        For i = 1 To 1500
            Set Me.curvePoint(i) = New cCurvePoint
        Next
    
    End Sub
    
    Public Property Get curvePoint(Index As Integer) As cCurvePoint
    
        Set curvePoint = pCurvePoints(Index)
    
    End Property
    
    Public Property Set curvePoint(Index As Integer, Value As cCurvePoint)
    
        Set pCurvePoints(Index) = Value
    
    End Property
    

    subclass cCurvePoint

    Option Explicit
    
    Private pSlope As Double
    Private pCurvature As Double
    Private pY As Variant
    Private pdY As Double
    Private pRadius As Double
    Private pArcLen As Double
    Private pChordLen As Double
    
    Public Property Let Slope(Value As Double)
        pSlope = Value
    End Property
    
    Public Property Get Slope() As Double
        Slope = pSlope
    End Property
    
    Public Property Let Curvature(Value As Double)
        pCurvature = Value
    End Property
    
    Public Property Get Curvature() As Double
        Curvature = pCurvature
    End Property
    
    Public Property Let valY(Value As Double)
        pY = Value
    End Property
    
    Public Property Get valY() As Double
        valY = pY
    End Property
    
    Public Property Let Radius(Value As Double)
        pRadius = Value
    End Property
    
    Public Property Get Radius() As Double
        Radius = pRadius
    End Property
    
    Public Property Let ArcLen(Value As Double)
        pArcLen = Value
    End Property
    
    Public Property Get ArcLen() As Double
        ArcLen = pArcLen
    End Property
    
    Public Property Let ChordLen(Value As Double)
        pChordLen = Value
    End Property
    
    Public Property Get ChordLen() As Double
        ChordLen = pChordLen
    End Property
    
    Public Property Let dY(Value As Double)
        pdY = Value
    End Property
    
    Public Property Get dY() As Double
        dY = pdY
    End Property
    

    This will create a tCurve with 1500 tCurve.Curvepoints().dY (for example)

    The trick is to get the index process correct in the main class !

    Good luck !

    0 讨论(0)
提交回复
热议问题