後期バインドされたパラメーターを渡す方法
-
19-09-2019 - |
質問
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)を使用しました。結果は、VBStringの8です。オブジェクトの場合は9でなければなりません。 - 1時間前にSSORRELL
Yの内容を見つけるために、端の端に印刷Yを使用します。 - 55分前のSSORRELL
これは私の疑いを裏付けているようです。 MyOwn.Object
クラスには、文字列を返すデフォルトのプロパティまたはメソッドが必要です。
したがって、あなたがしようとするとき Debug.Print
これは、デフォルトのプロパティ/メソッドの値を返します。 IDEの変数の上にホバリングすると、VB6はデフォルトのプロパティ/メソッドの値を表示します。あなたがするとき VarType
呼び出します y
デフォルトのプロパティまたはメソッドの変数タイプを返します。
その理由は、あなたがタイプの変数を持っているときです Variant
それは Object
, 、およびオブジェクトのクラスはデフォルトのメソッドまたはプロパティを定義します。変数は、ほとんどの状況でデフォルトメソッドまたはプロパティの返品値を評価します。
すぐに確認できます MyOwn.Object
クラスにはデフォルトのメンバーがあります オブジェクトブラウザ に MyOwn.Object
クラスとそのプロパティとメソッドのリストを調べます。角に小さな青色の円が付いたアイコンがあるメソッドまたはプロパティが表示される場合、メソッドまたはプロパティがクラスのデフォルトメンバーであることを示す。あなたがそれを見つけた場合、私はそれが文字列を返すと宣言されていると賭けて喜んでいます。
あなたがすべてを変更したとしても、それに注意してください Variant
s to Object
S、あなたはまだ多くの場所でこの動作に遭遇するでしょう。たとえば、場合でも y
宣言されています As Object
, 、a Debug.Print y
デフォルトのプロパティまたはメソッドの値を引き続き印刷し、 VarType(y)
引き続き8(文字列)が返されます。
VB6がデフォルトのメンバーを使用する時期と、いつ混乱しないかを正確に知ることができます。たとえば、宣言する場合 y
なので Object
, 、それからします TypeName(y)
戻ります MyOwn.Class
, 、 しかし VarType(y)
引き続き8(文字列)が返されます。ただし、宣言する場合 y
なので Variant
, 、 それから TypeName(y)
戻り値 String
.
遅刻している場合は、オブジェクト変数を次のように宣言できるため、この副作用を回避するのは困難です。 Object
また Variant
.
他のヒント
私はVB6 Handyのコピーを持っていませんが、同じことを多かれ少なかれかなり頻繁に行ったことを覚えています。また、メソッドの署名でバリアントではなくオブジェクトを使用したと思います。バリアントは一般に、変数でどのような変換を実行できるかという点では予測可能性が低くなりますが、オブジェクトを使用すると、VBはいかなる種類の変換も試みないと確信しています。
セットキーワードを省略していませんか?
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を使用すると、バリアントではなくオブジェクトを作成しています。一般的にオブジェクトを渡すと、BYREFを使用します。