문제

VB6에서는 런타임에 바인딩된 개체를 다른 폼에 전달하려고 합니다.

frmMain.vb

Dim x
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmDialog

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  Set y = paramX
End Sub

y의 내용은 런타임에 바인딩된 개체 "MyOwn.Object"의 유형 이름을 포함하는 문자열입니다.ByVal과 ByRef는 차이를 만들지 않습니다.어떤 단서가 있나요?기억하는 데 어려움이 있습니다.

도움이 되었습니까?

해결책

저는 VarType(y)을 사용했습니다.결과는 8입니다. vbString의 경우.9여야 합니다. 객체.– sorrrell 1시간 전

직접 실행 창에서 Print y를 사용하여 다음을 수행할 수 있습니다. Y의 내용을 구합니다.– 소렐 55 분 전

이것은 내 의심을 확인하는 것 같습니다.그만큼 MyOwn.Object 클래스에는 문자열을 반환하는 기본 속성이나 메서드가 있어야 합니다.

그러므로 당신이 시도할 때 Debug.Print 그러면 기본 속성/메서드의 값이 반환됩니다.IDE에서 변수 위로 마우스를 가져가면 VB6은 기본 속성/메서드 값을 표시합니다.당신이 할 때 VarType 전화하다 y 기본 속성이나 메서드의 변수 유형을 반환합니다.

그 이유는 유형의 변수가 있을 때 Variant 저장하는 것 Object, 이고 객체의 클래스가 기본 메서드나 속성을 정의하는 경우, 대부분의 상황에서 변수는 기본 메서드나 속성의 반환 값으로 평가됩니다.

상태를 빠르게 확인할 수 있습니다. MyOwn.Object 클래스를 열면 기본 멤버가 있습니다. 개체 브라우저 ~로 MyOwn.Object 클래스를 살펴보고 해당 속성과 메서드 목록을 살펴보세요.모서리에 작은 파란색 원이 있는 아이콘이 있는 메서드나 속성이 표시되면 해당 메서드나 속성이 클래스의 기본 멤버임을 나타냅니다.하나를 찾으면 문자열을 반환하도록 선언되었다고 확신합니다.

모든 내용을 변경했더라도 참고하세요. VariantS ~ ObjectS, 여전히 여러 곳에서 이 동작이 발생합니다.예를 들어, y 선언된다 As Object, 하는 일 Debug.Print y 여전히 기본 속성이나 메서드의 값을 인쇄하고 다음을 수행합니다. VarType(y) 여전히 8(문자열)을 반환합니다.

VB6이 기본 멤버를 사용하는 시기와 사용하지 않는 시기를 정확히 아는 것은 혼란스러울 수 없습니다.예를 들어 선언하면 y ~처럼 Object, 그런 다음 TypeName(y) 돌아올 것이다 MyOwn.Class, 하지만 VarType(y) 여전히 8(문자열)을 반환합니다.그러나 선언하면 y ~처럼 Variant, 그 다음에 TypeName(y) 보고 String.

런타임에 바인딩을 사용하는 경우 개체 변수를 다음과 같이 선언할 수만 있으므로 이러한 부작용을 피하기가 어렵습니다. Object 또는 Variant.

다른 팁

VB6 사본은 없지만 같은 작업을 꽤 자주 수행했던 기억이 나며 메서드 시그니처에 Variant 대신 Object를 사용한 것으로 생각됩니다.Variant는 일반적으로 변수에 대해 어떤 종류의 변환을 실행할지 예측하기가 훨씬 어렵습니다. 반면 Object를 사용하면 VB가 어떤 종류의 변환도 시도하지 않을 것이라고 확신합니다.

예를 들어 Set 키워드를 생략하지 않았습니까?

Dim y
Public Sub SetMyOwnObject(ByVal paramX As Variant)
  ' Set y = paramX  ' thought you had this...
  y = paramX        ' ...actually have this
End Sub

그렇다면 y 값이 객체의 기본값이 됩니다.MyOwn.Object 클래스에 해당 유형에 대한 설명을 반환하고 클래스의 기본 멤버로 정의된 속성이 있습니까(VB 개체 브라우저에서 파란색 점으로 표시됨)?

frmMain.vb

Dim x As Object
Set x = CreateObject("MyOwn.Object")
Dim f as frmDialog
Set f = New frmDialog
f.SetMyOwnObject x

frmDialog

Dim y As Object
Public Sub SetMyOwnObject(ByRef paramX As Object)
  Set y = paramX
End Sub

CreateObject를 사용하면 Variant가 아닌 개체가 생성됩니다.객체를 전달할 때 일반적으로 ByRef를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top