4

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は違いを生みません。手がかりはありますか?思い出せない。

4

4 に答える 4

2

私はVB6のコピーを手元に持っていませんが、同じことを多かれ少なかれ頻繁に行ったことを覚えています。メソッドのシグネチャでVariantではなくObjectを使用したと思います。バリアントは、変数に対して実行される可能性のある変換の種類に関しては、一般的に予測がはるかに困難ですが、オブジェクトを使用すると、VBはいかなる種類の変換も試行しないと確信しています。

于 2009-07-22T21:36:37.703 に答える
0

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オブジェクトブラウザーで青い点でマークされています)?

于 2009-07-23T09:22:05.367 に答える
0

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を使用します。

于 2009-07-23T16:22:50.483 に答える
0

VarType(y)を使用しました。vbStringの結果は8です。オブジェクトの場合は9である必要があります。–ssorrrell1時間前

イミディエイトウィンドウで[印刷y]を使用して、yの内容を検索します。–ssorrrell55分前

これは私の疑いを裏付けるようです。MyOwn.Objectクラスには、文字列を返すデフォルトのプロパティまたはメソッドが必要です。

したがって、これを実行しようとするDebug.Printと、デフォルトのプロパティ/メソッドの値が返されます。IDEで変数にカーソルを合わせると、VB6はデフォルトのプロパティ/メソッドの値を表示します。VarType呼び出しを行うyと、デフォルトのプロパティまたはメソッドの変数タイプが返されます。

その理由は、Variantを格納する型の変数がObjectあり、オブジェクトのクラスがデフォルトのメソッドまたはプロパティを定義している場合、ほとんどの場合、変数はデフォルトのメソッドまたはプロパティの戻り値に評価されるためです。

クラスのオブジェクトブラウザを開き、プロパティとメソッドのリストを確認することで、MyOwn.Objectクラスにデフォルトのメンバーがあるかどうかをすばやく確認できます。隅に小さな青い円が付いたアイコンがあるメソッドまたはプロパティが表示されている場合は、そのメソッドまたはプロパティがクラスのデフォルトメンバーであることを示しています。あなたがそれを見つけたら、私はそれが文字列を返すように宣言されているに違いない。MyOwn.Object

VariantすべてのSをObjectSに変更した場合でも、多くの場所でこの動作が発生することに注意してください。たとえば、yが宣言されている場合でもAs Object、aDebug.Print yを実行すると、デフォルトのプロパティまたはメソッドの値が出力され、aを実行するVarType(y)と8(文字列)が返されます。

VB6がデフォルトのメンバーを使用する時期と使用しない時期を正確に知ることは、混乱を招く可能性があります。たとえば、として宣言yした場合Object、実行するTypeName(y)とはが返されますMyOwn.Classが、VarType(y)それでも8(文字列)が返されます。yただし、として宣言するとVariant、はをTypeName(y)返しますString

Object遅延バインディングを使用している場合、オブジェクト変数をまたはとしてしか宣言できないため、この副作用を回避することは困難ですVariant

于 2009-07-23T19:16:00.167 に答える