2016-07-05 3 views
2

저는 덕트 시스템을 통한 가스 흐름의 특성을 계산하는 데 사용할 수있는 VBA 프로젝트를 진행하고 있습니다. 덕트 시스템은 clsSegments 클래스에 의해 저장된 Collection에 저장된 여러 Segments (VBA 클래스, clsSegment)로 구성됩니다.VBA 연속 클래스 개체 참조

각 세그먼트에는 clsDuctDim 클래스로 정의 된 입구 및 출구로 구성된 덕트 클래스 (clsDuct)가 있습니다.

원하는 경우 세그먼트 번호. 2 입구 덕트가 세그먼트 번호의 특성을 상속합니다. 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이 실제로 세그먼트 번호를 가리 킵니다. 엔. 세그먼트 2와 세그먼트 1 사이의 참조를 깰 경우 세그먼트 3은 여전히 ​​세그먼트 1을 가리 킵니다. 원하는 것은 아닙니다. 내가 세그먼트 3 세그먼트 2를 가리키고 싶습니다. 내가하려는 것은 세그먼트 1 데이터가 저장되어있는 실제 메모리 위치를 가리 키기보다는 포인터를 가리키는 것입니다.

어떻게 달성 할 수 있습니까?

답변

0

VBA에서 직접 수행 할 방법이 없습니다. 쉬운 해결 방법은 clsSegment 클래스에 Copy 또는 Clone 메서드를 추가하는 것입니다.

세그먼트 (3) .Copy 세그먼트 (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.

+0

좋아요, 내가 한 것은 모든 세그먼트를 통과하고 참조가 설정되거나 끊어 질 때마다 서로에 대한 참조를 설정하거나 끊는 Segments 클래스에 하위 유지 관리를 작성하는 것이 었습니다. 수동으로 불러야합니다. – lyhnet

+0

참조가 깨 졌을 때 모든 값을 잃을 것입니다. 피하려고했던 것이 아닌가요? –

+0

참조 된 값의 값으로 복사하여 임시 clsDuctDimension 인스턴스에 저장하는 위치를 언급 할 때 복사 기능이 있습니다. 그런 다음 참조를 끊고 값을 Segment (2) .Duct.Inlet 또는 Outlet에 복사합니다. – lyhnet