質問

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 クラスとそのプロパティとメソッドのリストを調べます。角に小さな青色の円が付いたアイコンがあるメソッドまたはプロパティが表示される場合、メソッドまたはプロパティがクラスのデフォルトメンバーであることを示す。あなたがそれを見つけた場合、私はそれが文字列を返すと宣言されていると賭けて喜んでいます。

あなたがすべてを変更したとしても、それに注意してください Variants to ObjectS、あなたはまだ多くの場所でこの動作に遭遇するでしょう。たとえば、場合でも 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を使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top