- ベストアンサー
クラスについて
基礎が身に付いていないので、凄く変な質問で申し訳ありません。 現在、VB6(SP5)、Windows2000(SP3)の環境で開発中です。 既存のアプリ(ActiveXDLL)の修正をしようとしているのですが、クラスや、コレクションについてよく分からないので困っています。 既存のアプリは、 ・標準モジュール basA basB ・クラスモジュール clsA clsB ・ユーザーコントロール ctlA から成っています。 今、あるテーブルのフィールドのデフォルト値をコレクション等に保存して、 ctlAのラベルにセットしようとしています。 そこで、新しくコレクションを追加しました。(clsCとclsCのプロパティ?clsD) そのコレクションは、データをセットしたり、セットしたデータを参照したりしたいので、 ctlA内で、 Private objclsC As clsC と宣言し、ctlAの初期処理時に Set objclsC = New clsC し、ctlAの終了処理時に Set objclsC = Nothing としました。 また、ctlA内に ・clsCにデータをセットするためのモジュール と ・clsCのデータを参照して、ラベルにセットするためのモジュール を追加しました。 このアプリは、複数の他のアプリから参照されているのですが、私が直したら、他のアプリ起動にエラーが発生するようになってしまいました。 「クラス XXX.XXX(コントロール XXX) はロードされていません。」 ctlAにモジュールを追加したのがいけなかったのでしょうか? 一体どういう風に修正すべきなのでしょうか? 自分の理解不足のため、説明も質問内容もきっと分かり辛いと思いますが、どうぞよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
新しく追加したclsCとclsdって、別のアプリからNewやCreateObjectsを使って使用されますか? 使用されないのであれば、追加したクラスのInstancingプロパティをPrivateにすれば平気かも。 ActiveX DLLやActiveXコントロールでは、外部から使用可能なクラスモジュールはレジストリに登録されている必要があります。このため、レジストリの登録が、新しく追加されたクラスの分が存在しない中途半端な状況になってしまったために別のアプリ(おそらく別のマシンですよね)で起動に失敗したのではと思われます。
その他の回答 (4)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>バイナリ互換の場合、プロパティやメソッドの増減はダメです。たしか。ちがったかな? 増はOK、減はNG。引数の変更や名前の変更は、減と増とみなされるのでNG。 ただし、Publicのプロパティやメソッドだけの話なので、PrivateやFriendは関係なしです。
バイナリ互換の場合、プロパティやメソッドの増減はダメです。たしか。ちがったかな? プロジェクト互換で作って、そのコントロールを利用しているプロジェクトを全部コンパイルしなおし、というのが解決法かな?と思います。 基本的に、プロパティやメソッドはインターフェイスと呼ばれる重要な要素で、簡単に増やしたり変更したり削ったりしてはいけません。最初にしっかり設計して、過不足が無いようにしないと、あとあとの変更で周囲に大影響を及ぼしてしまいます。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
> ・clsCにデータをセットするためのモジュール と > ・clsCのデータを参照して、ラベルにセットするためのモジュール ってどんなモジュール?標準モジュールですか?クラスモジュールですか?プロシージャではないのですか? で、一番肝心なところ。 プロジェクトを開いた状態で、メニューの プロジェクト→プロパティ→コンポーネントのバージョン間の互換性はどうなっていますか?
補足
すみません。 モジュールって言わないのか・・・ ctlAに Private Function ○○ Private Function ×× というのを追加しました。 あと、バージョン間の互換性は、「バイナリ互換」に指定してあります。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>既存のアプリ(ActiveXDLL)の修正をしようとしているのですが 本当にActiveX DLLですか?ActiveX コントロールじゃなくて。 ユーザーコントロールの使われ方がわからないのですが・・・ > ・clsCのデータを参照して、ラベルにセットするためのモジュール どこのラベルですか? ActiveX DLLなんですよね?
補足
すみません! 本当にすみません。 ご指摘の通り、ActiveX コントロールです。 そして、 「clsCのデータを参照して、ctlA上のラベルにセットするためのモジュール」 です。 他にも不明点がありましたら指摘してください。 宜しくお願いします。
お礼
ご回答を下さった皆様、どうもありがとうございました。 最初は既存の関数の名前を変えたり、引数を変えたりとめちゃくちゃだったんですが、その辺を気をつけて、Prinateの関数だけにしました。 で、私がぶつかっていたエラーは、デバッグ時に発生していたんですが、上記のことに注意し、修正したActiveXコントロールを完全コンパイルして動かすようにしたら発生しなくなりました。 どうもありがとうございました。