- - PR -
Implements したクラスモジュールのインスタンスをウォッチウィンドウで表示したい
1
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-02 12:38
Excel 2002(Office xp) の VBA で開発しています。VB のエンジンは VB 6.0 に相当するはずです。
VB 6.0 で追加された Implements を使っているのですが、たとえば、つぎのようなコードで、Class2 が Class1 を Implements している場合、 Class1.cls
Class2.cls
Module1.bas
テスト用ドライバーであるプロシージャー Hoge を実行して、Debug.Print の所でブレークポイントを仕掛けて止めて、ウォッチウィンドウで、変数 c1 の値を見ると、
と、表示されます。疑問点としては、つぎの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 ] | ||||||||||||||||||||||||||||
|
投稿日時: 2007-09-02 16:59
ImplementsキーワードはVB5.0から追加されていたと思います。 ただCOMのために用意されているもので、通常のVBプログラミングでは あまり使われるものではないと思います。
ウォッチウィンドウの表示内容についての仕様が公開されているわけでもないので、 あくまで個人的な見解です。 (1)について。
のようにHogeを修正して、変数c2もウォッチウィンドウで表示してみてください。 Class2の中にはClass2とClass1を内包しています。 これが何を意味するかははっきりとは私もわかりませんが、 以下の説明を読むとなんとなく想像はできそうな気がします。 http://www.microsoft.com/japan/msdn/net/upgrade/interinher.aspx#interinher_topic6 (2)について。 Class1のインタフェースを通してみた場合、Class2の存在は一切見えません。 たぶん、Class2の中に内包しているClass1の部分だけを表示しているので、 Barは存在しないのと同じ状況になっているのだと思います。
私は、Debug.Print、ステップ実行、イミディエイトウィンドウ、 エディット&コンティニュでデバッグしますが、特に困ったことはありません。 ウォッチ式は使ったことはありません(^^; クラスを使うときは、デバッグ用のToString的なメソッドを用意しておき、 Debug.Print XXX.ToString のようなコードを必要箇所に埋め込んでおきます。 あるいは中断している状態で、イミディエイトウィンドウに ? XXX.ToString と打ち込んで確認でしょうか。 また、先ほどの例なら、 Debug.Print TypeName(c1)を仕込んでおけば、"Class2"の名前も表示できます。
そのキーワードで、まっさきにVB6以前でのImplementsの話が引っかかっていると思いますけど(^^; ただ、元々VB4の頃から国内にはほとんどImplementsに関する情報がありません。 そういう意味では旧VBでImplementsを使うということ自体が稀なのでしょう。 #ActiveXを作る場合には使うことはありますけどね。 <修正> ※ VB50 → VB5.0に修正。50って(^^; ※ とか書いている間にunibonさんからも VB5.0でImplementsは追加されたよと訂正コメントあり。 </修正> [ メッセージ編集済み 編集者: よねKEN 編集日時 2007-09-02 17:01 ] | ||||||||||||||||||||||||||||
|
投稿日時: 2007-09-02 22:24
VB は (も) 詳しくないのですが... ウォッチ式の左側は変数の入れ物の型、右側は実際に格納されたデータの型。 そう思うのが筋だと思っていました。 実際に Object や Variant を入れ物にした場合は正しく表示されます。 COM 時代の VB の Interface の実体はクラスでしかないので (実際クラスとして機能してしまう) 式ウォッチは Class1 を実際に実行しようとして失敗しているのかもと思ったのですが、c.Bar 自体を式ウォッチで直接参照した場合は問題なかったりするので、わけがわかりません。 以上から推測するに、もともと Implements は我々プログラマにはおまけ的な機能ですので (インフラでは活躍しているようですが) 制限というか考慮されていないだけのような気がします。 # このあたりの都合話は魔界の仮面弁士さんなら知ってそうです。
ソースに書かれたメンバであれば式ウォッチは使わないと思いますので、今まで気にしたことがありませんでした... ほとんどの場合、選択状態にしてマウス ポインタを合わせて参照しています。 COM 時代の VB のポリモーフィズムはメソッドでしか有効活用していないというのも大きいですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||||||||||
|
投稿日時: 2007-09-03 20:41
なるほど、内包しているわけなのですね。 ためしに、 Debug.Print c2.Class1 を実行したり、イミディエイトウィンドウで、 ? c2.Class1 としてみました。面白いことが起こりました。 (答え: Excel や VB ごと落ちる。) Class0.cls
も追加して、 Class2.cls
のようにして、
の値をウォッチウィンドウで表示させると、
となりました。やはり、内包なのですね。
マウスポインタを当てても、値が表示されない場合もあり、私の中では謎になっています。表示されるときもあるし、かといって表示されるだろうと思ってマウスポインタを当てても表示されないときもあり、不思議です。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||||||||||||||||||||||
|
投稿日時: 2007-09-03 20:59
私もこのスレにレス付けるのに似たようなことやって落ちるのを確認していました。 ウォッチ式見るまでメンバーにインタフェースとなっているクラス自身が入っているなんて気づきませんし。 でも、たぶん、気づいてはいけないメンバーだったのでしょう(^^; |
1