【问题标题】:VBA Successive Class object referenceVBA 连续类对象引用
【发布时间】:2016-11-07 05:22:48
【问题描述】:

我正在开发一个 VBA 项目,该项目可用于计算通过管道系统的气流属性。管道系统由存储在由类 clsSegments 存储的集合中的多个段(VBA 类;clsSegment)组成。

每个 Segment 都有一个 Duct 类 (clsDuct),它由 clsDuctDim 类定义的 Inlet 和 Outlet 组成。

如果我想要段号。 2 Inlet Duct 继承 Segment no. 的属性。我使用的 1 个出口管道:

set Segments(2).Duct.Inlet = Segments(1).Duct.Outlet

这行得通。

同样,我可以通过以下方式选择使用入口管道作为出口管道:

set segments(2).Duct.Outlet = segments(2).Duct.Inlet

现在如果我想要段号。 n+2 和我写的一样:

set Segments(3).Duct.Inlet = Segments(2).Duct.Outlet
set Segments(3).Duct.Outlet = Segments(3).Duct.Inlet

这会导致第 3 段实际指向第 3 段。 n.如果我打破了 Segment 2 和 1 之间的引用,Segment 3 仍然指向 Segment 1。这不是我想要的。我希望第 3 段指向第 2 段。我想我要做的是指向一个指针,而不是指向存储第 1 段数据的实际内存位置。

如何做到这一点?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    在 VBA 中没有直接的方法可以做到这一点。一个简单的解决方法是将 Copy 或 Clone 方法添加到您的 clsSegment 类。

    段(3).复制段(2)

    Sub Copy(segement As clsSegment)
        Me.Duct.Outlet = segement.Duct.Inlet
        Me.Duct.Inlet = segement.Duct.Outlet
    End Sub
    

    可以通过添加自定义事件和设置对父对象的引用来自动更改。我不确定这将如何应用于您的系统,但这是一个简单的通知系统。

    clsSegment

    Enum DuctEvents
        deInletRemoved
        deOutletRemoved
    End Enum
    
    Public Sub DuctChanged(e As DuctEvents)
        'Do Something
    End Sub
    

    类 clsDuctDim

    Public Event DuctRemoved()
    
    Private Sub Class_Terminate()
        RaiseEvent DuctRemoved
    End Sub
    

    类 clsDuct

    Public parent As clsSegment
    Private WithEvents Inlet As clsDuctDim
    Private WithEvents Outlet As clsDuctDim
    
    Private Sub Inlet_DuctRemoved()
        parent.DuctChanged (deInletRemoved)
    End Sub
    
    Private Sub Outlet_DuctRemoved()
        parent.DuctChanged (deOutletRemoved)
    End Sub
    

    我在 clsSegment 类中添加了一个 Enumeration 来清理消息。

    【讨论】:

    • 好的,我所做的是在 Segments 类中编写一个管家子程序,该子程序贯穿所有段,并在设置或中断引用时设置/中断对彼此的引用。不过我需要手动调用它。
    • 当引用被破坏时你会失去所有的价值,这不是你想要避免的吗?
    • 我有一个复制功能,正如您提到的,我按值复制引用值并将它们存储在临时 clsDuctDimension 实例中。然后我打破引用,并将值复制到 Segment(2).Duct.Inlet 或 Outlet。
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多