- PR -

Implements したクラスモジュールのインスタンスをウォッチウィンドウで表示したい

1
投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-09-02 12:38
Excel 2002(Office xp) の VBA で開発しています。VB のエンジンは VB 6.0 に相当するはずです。

VB 6.0 で追加された Implements を使っているのですが、たとえば、つぎのようなコードで、Class2 が Class1 を Implements している場合、

Class1.cls
コード:

Option Explicit



Class2.cls
コード:

Option Explicit

Implements Class1

Public Bar As Long

Private Sub Class_Initialize()
Bar = 123
End Sub



Module1.bas
コード:

Option Explicit

Public Sub Hoge()
Dim c1 As Class1
Set c1 = New Class2
Debug.Print ""
End Sub



テスト用ドライバーであるプロシージャー Hoge を実行して、Debug.Print の所でブレークポイントを仕掛けて止めて、ウォッチウィンドウで、変数 c1 の値を見ると、
コード:

型 Class1/Class1
値 <変数なし>


と、表示されます。疑問点としては、つぎの2点があります。

(1) 変数 c1 に格納されているインスタンスの実行時の型が Class2 なのに、それが表示されないのはなぜ?ウォッチウィンドウの表示では、クラス名がスラッシュで区切ってありますが左も右も両方とも Class1 なのはどういう意味を示しているのでしょうか?

(2) 値として、変数 Bar の値(123)がウォッチウィンドウに表示されないのはなぜなのでしょうか?

こもままだとデバッグが大変です。みなさんどうやってデバッグされているのでしょうか?いちいちイミディエイトウィンドウで調べたりしているのでしょうか?新しい Excel のバージョンだと改善されているのでしょうか?

ちなみに Google などで「VB Implements」をキーワードにして検索すると、いわゆる VB.NET がヒットしてしまい、古い VB の情報を探すことが難しいです。



#以下、追記。

Implements は VB 5.0 から追加されていました。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

[ メッセージ編集済み 編集者: unibon 編集日時 2007-09-02 16:50 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-09-02 16:59
引用:

VB 6.0 で追加された Implements を使っているのですが、



ImplementsキーワードはVB5.0から追加されていたと思います。
ただCOMのために用意されているもので、通常のVBプログラミングでは
あまり使われるものではないと思います。

引用:

テスト用ドライバーであるプロシージャー Hoge を実行して、Debug.Print の所でブレークポイントを仕掛けて止めて、ウォッチウィンドウで、変数 c1 の値を見ると、
コード:

型 Class1/Class1
値 <変数なし>


と、表示されます。疑問点としては、つぎの2点があります。

(1) 変数 c1 に格納されているインスタンスの実行時の型が Class2 なのに、それが表示されないのはなぜ?ウォッチウィンドウの表示では、クラス名がスラッシュで区切ってありますが左も右も両方とも Class1 なのはどういう意味を示しているのでしょうか?

(2) 値として、変数 Bar の値(123)がウォッチウィンドウに表示されないのはなぜなのでしょうか?



ウォッチウィンドウの表示内容についての仕様が公開されているわけでもないので、
あくまで個人的な見解です。

(1)について。

コード:

Public Sub Hoge()
Dim c1 As Class1
Dim c2 As Class2
Set c1 = New Class2
Set c2 = c1
Debug.Print ""
End Sub



のようにHogeを修正して、変数c2もウォッチウィンドウで表示してみてください。
Class2の中にはClass2とClass1を内包しています。
これが何を意味するかははっきりとは私もわかりませんが、
以下の説明を読むとなんとなく想像はできそうな気がします。
http://www.microsoft.com/japan/msdn/net/upgrade/interinher.aspx#interinher_topic6

(2)について。
Class1のインタフェースを通してみた場合、Class2の存在は一切見えません。
たぶん、Class2の中に内包しているClass1の部分だけを表示しているので、
Barは存在しないのと同じ状況になっているのだと思います。

引用:

こもままだとデバッグが大変です。みなさんどうやってデバッグされているのでしょうか?いちいちイミディエイトウィンドウで調べたりしているのでしょうか?新しい Excel のバージョンだと改善されているのでしょうか?



私は、Debug.Print、ステップ実行、イミディエイトウィンドウ、
エディット&コンティニュでデバッグしますが、特に困ったことはありません。
ウォッチ式は使ったことはありません(^^;

クラスを使うときは、デバッグ用のToString的なメソッドを用意しておき、
Debug.Print XXX.ToString
のようなコードを必要箇所に埋め込んでおきます。
あるいは中断している状態で、イミディエイトウィンドウに
? XXX.ToString
と打ち込んで確認でしょうか。

また、先ほどの例なら、
Debug.Print TypeName(c1)を仕込んでおけば、"Class2"の名前も表示できます。

引用:

ちなみに Google などで「VB Implements」をキーワードにして検索すると、いわゆる VB.NET がヒットしてしまい、古い VB の情報を探すことが難しいです。



そのキーワードで、まっさきにVB6以前でのImplementsの話が引っかかっていると思いますけど(^^;
ただ、元々VB4の頃から国内にはほとんどImplementsに関する情報がありません。
そういう意味では旧VBでImplementsを使うということ自体が稀なのでしょう。
#ActiveXを作る場合には使うことはありますけどね。

<修正>
※ VB50 → VB5.0に修正。50って(^^;
※ とか書いている間にunibonさんからも
VB5.0でImplementsは追加されたよと訂正コメントあり。
</修正>

[ メッセージ編集済み 編集者: よねKEN 編集日時 2007-09-02 17:01 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-09-02 22:24
引用:

unibonさんの書き込み (2007-09-02 12:38) より:

(1) 変数 c1 に格納されているインスタンスの実行時の型が Class2 なのに、それが表示されないのはなぜ?ウォッチウィンドウの表示では、クラス名がスラッシュで区切ってありますが左も右も両方とも Class1 なのはどういう意味を示しているのでしょうか?
(2) 値として、変数 Bar の値(123)がウォッチウィンドウに表示されないのはなぜなのでしょうか?


VB は (も) 詳しくないのですが... ウォッチ式の左側は変数の入れ物の型、右側は実際に格納されたデータの型。 そう思うのが筋だと思っていました。 実際に Object や Variant を入れ物にした場合は正しく表示されます。

COM 時代の VB の Interface の実体はクラスでしかないので (実際クラスとして機能してしまう) 式ウォッチは Class1 を実際に実行しようとして失敗しているのかもと思ったのですが、c.Bar 自体を式ウォッチで直接参照した場合は問題なかったりするので、わけがわかりません。

以上から推測するに、もともと Implements は我々プログラマにはおまけ的な機能ですので (インフラでは活躍しているようですが) 制限というか考慮されていないだけのような気がします。

# このあたりの都合話は魔界の仮面弁士さんなら知ってそうです。

引用:

こもままだとデバッグが大変です。みなさんどうやってデバッグされているのでしょうか?いちいちイミディエイトウィンドウで調べたりしているのでしょうか?新しい Excel のバージョンだと改善されているのでしょうか?


ソースに書かれたメンバであれば式ウォッチは使わないと思いますので、今まで気にしたことがありませんでした... ほとんどの場合、選択状態にしてマウス ポインタを合わせて参照しています。 COM 時代の VB のポリモーフィズムはメソッドでしか有効活用していないというのも大きいですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-09-03 20:41
引用:

よねKENさんの書き込み (2007-09-02 16:59) より:
(1)について。

コード:
Public Sub Hoge()
    Dim c1 As Class1
    Dim c2 As Class2
    Set c1 = New Class2
    Set c2 = c1
    Debug.Print ""
End Sub



のようにHogeを修正して、変数c2もウォッチウィンドウで表示してみてください。
Class2の中にはClass2とClass1を内包しています。


なるほど、内包しているわけなのですね。
ためしに、
Debug.Print c2.Class1
を実行したり、イミディエイトウィンドウで、
? c2.Class1
としてみました。面白いことが起こりました。

(答え: Excel や VB ごと落ちる。)

Class0.cls
コード:
Option Explicit



も追加して、

Class2.cls
コード:
Option Explicit

Implements Class0
Implements Class1

Public Bar As Long

Private Sub Class_Initialize()
    Bar = 123
End Sub



のようにして、
コード:
Option Explicit

Public Sub Hoge()
    Dim c2 As Class2
    Set c2 = New Class2
    
    Debug.Print ""
End Sub


の値をウォッチウィンドウで表示させると、
コード:
式	値	型
c2		Class2/Class2

Bar	123	Long
Class0	Nothing	Class0
Class1	Nothing	Class1


となりました。やはり、内包なのですね。

引用:

じゃんぬねっとさんの書き込み (2007-09-02 22:24) より:
ソースに書かれたメンバであれば式ウォッチは使わないと思いますので、今まで気にしたことがありませんでした... ほとんどの場合、選択状態にしてマウス ポインタを合わせて参照しています。 COM 時代の VB のポリモーフィズムはメソッドでしか有効活用していないというのも大きいですね。


マウスポインタを当てても、値が表示されない場合もあり、私の中では謎になっています。表示されるときもあるし、かといって表示されるだろうと思ってマウスポインタを当てても表示されないときもあり、不思議です。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-09-03 20:59
引用:

unibonさんの書き込み (2007-09-03 20:41) より:
ためしに、
Debug.Print c2.Class1
を実行したり、イミディエイトウィンドウで、
? c2.Class1
としてみました。面白いことが起こりました。

(答え: Excel や VB ごと落ちる。)



私もこのスレにレス付けるのに似たようなことやって落ちるのを確認していました。
ウォッチ式見るまでメンバーにインタフェースとなっているクラス自身が入っているなんて気づきませんし。
でも、たぶん、気づいてはいけないメンバーだったのでしょう(^^;
1

スキルアップ/キャリアアップ(JOB@IT)