• ベストアンサー

クラスについて

基礎が身に付いていないので、凄く変な質問で申し訳ありません。 現在、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にモジュールを追加したのがいけなかったのでしょうか? 一体どういう風に修正すべきなのでしょうか? 自分の理解不足のため、説明も質問内容もきっと分かり辛いと思いますが、どうぞよろしくお願いします。

  • bou7
  • お礼率69% (51/73)

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

新しく追加したclsCとclsdって、別のアプリからNewやCreateObjectsを使って使用されますか? 使用されないのであれば、追加したクラスのInstancingプロパティをPrivateにすれば平気かも。 ActiveX DLLやActiveXコントロールでは、外部から使用可能なクラスモジュールはレジストリに登録されている必要があります。このため、レジストリの登録が、新しく追加されたクラスの分が存在しない中途半端な状況になってしまったために別のアプリ(おそらく別のマシンですよね)で起動に失敗したのではと思われます。

その他の回答 (4)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>バイナリ互換の場合、プロパティやメソッドの増減はダメです。たしか。ちがったかな? 増はOK、減はNG。引数の変更や名前の変更は、減と増とみなされるのでNG。 ただし、Publicのプロパティやメソッドだけの話なので、PrivateやFriendは関係なしです。

bou7
質問者

お礼

ご回答を下さった皆様、どうもありがとうございました。 最初は既存の関数の名前を変えたり、引数を変えたりとめちゃくちゃだったんですが、その辺を気をつけて、Prinateの関数だけにしました。 で、私がぶつかっていたエラーは、デバッグ時に発生していたんですが、上記のことに注意し、修正したActiveXコントロールを完全コンパイルして動かすようにしたら発生しなくなりました。 どうもありがとうございました。

noname#25230
noname#25230
回答No.3

バイナリ互換の場合、プロパティやメソッドの増減はダメです。たしか。ちがったかな? プロジェクト互換で作って、そのコントロールを利用しているプロジェクトを全部コンパイルしなおし、というのが解決法かな?と思います。 基本的に、プロパティやメソッドはインターフェイスと呼ばれる重要な要素で、簡単に増やしたり変更したり削ったりしてはいけません。最初にしっかり設計して、過不足が無いようにしないと、あとあとの変更で周囲に大影響を及ぼしてしまいます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

> ・clsCにデータをセットするためのモジュール と > ・clsCのデータを参照して、ラベルにセットするためのモジュール ってどんなモジュール?標準モジュールですか?クラスモジュールですか?プロシージャではないのですか? で、一番肝心なところ。 プロジェクトを開いた状態で、メニューの プロジェクト→プロパティ→コンポーネントのバージョン間の互換性はどうなっていますか?

bou7
質問者

補足

すみません。 モジュールって言わないのか・・・ ctlAに Private Function ○○ Private Function ×× というのを追加しました。 あと、バージョン間の互換性は、「バイナリ互換」に指定してあります。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>既存のアプリ(ActiveXDLL)の修正をしようとしているのですが 本当にActiveX DLLですか?ActiveX コントロールじゃなくて。 ユーザーコントロールの使われ方がわからないのですが・・・ > ・clsCのデータを参照して、ラベルにセットするためのモジュール どこのラベルですか? ActiveX DLLなんですよね?

bou7
質問者

補足

すみません! 本当にすみません。 ご指摘の通り、ActiveX コントロールです。 そして、 「clsCのデータを参照して、ctlA上のラベルにセットするためのモジュール」 です。 他にも不明点がありましたら指摘してください。 宜しくお願いします。

関連するQ&A

  • VB6.0 ExeとDllの違い

    いつもお世話になっております。 今更ながらなのですがVB6.0について質問させて下さい。 新規でVB6.0を起動すると、「標準Exe」・「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」等がでてきますよね? 普段アプリを開発する時は「標準Exe」しか使用しないのですが、「ActiveXExe」・「ActiveXDll」・「ActiveXコントロール」の違いは何なのでしょうか?(どういうときに使い分けるのでしょうか?) ActiveXDll・・・ソースコードのみ?参照設定する?(クラスやモジュールと何が違うのでしょうか?) ActiveXコントロール・・・独自のコンポーネント(部品)を作る?(OCXのようなものでしょうか?) ActiveXExe・・・(一番分かりません) どなたかご教示お願いします。

  • Collectionクラスへ値を代入するときの型変換

    J2SE 5.0でオートボクシング機能が追加されて云々かんぬん。。。そもそも、Collectionクラスへ値を代入するときには、なぜプリミティブ型からオブジェクト型へ変換しなければならないのでしょうか。データとして合わないから。くらいにしかわかっていません。Javaに詳しい方、宜しくお願い致します。

  • エクセルVBAでVBAの修正は出来るのでしょうか?

    エクセルVBAでVBAの修正は出来るのでしょうか? あるエクセルファイルにマクロを組み込んでいます(ユーザーフォームも使用)。 このエクセルファイルを複数個フォルダ内にコピーしています。 このコピーした全てのファイルのマクロの修正をVBAで出来ないかと考えています。 修正箇所はモジュール内のコード修正、モジュールの追加、既存のユーザーフォームにボタン等の追加等です。 エクセルは2003を使用しています。 どなたか教えてください。

  • C#のプロパティ設定のコードについて

    C#でユーザーコントロールを作成しています。 ※C#のカテゴリーがないので、こちらに質問させていただきます。 既存のコントロールを基底クラスとしているのですが、下記のコードで基底クラスのプロパティであるXXXを使用できないようにしました。 [Browsable(false)] [Obsolete("使用不可", true)] public new int XXX { get { return 0; } set { } } この、XXXに対してアクセスするコードはコンパイルエラーとなり、プロパティウィンドウにも表示されず、一応は使用できないようには出来ました。 ところが、コントロールをフォームに貼り付けて、他の使用可能なプロパティ(YYYプロパティとします)を変更すると、Form.Designer.csのInitializeComponent()に、XXXに値を設定するコードが自動生成されます。当然、そのままコンパイルすればエラーとなります。 ※XXXは、YYYの値に連動して値が変化する仕様です。YYYを追加したことでXXXが不要というか、あっては事故のもとになるので、使用不可にしました。 そこで、お教え願いたいのは、Form.Designer.csのInitializeComponent()に、プロパティの値を設定するコードが生成される仕組みです。若しくは、設定するコードが生成されないようにする方法です。 以上よろしくお願いします。

  • クラスで使用する「参照渡し」のやり方

    クラスを使い始めて間もないので、ご教授願います。 PHPでMySQLからSELECT文でデータを持ってくる記述です。 関数での参照渡しは使うことが出来るので、同じように考え、下記のように記述しました。ただ、loadメソッドの最後に 「return $data;」 と書くと、一応意図する通りに実行できるのですが、これはなぜですか? 「参照渡し」ならばreturnで値を返す必要が無いのでは?と思うのですが、この一行を削ると"$article->load(&$data)"は”FALSE”になるようです。 アンパサンド「&」の位置が間違っているのでしょうか? class XXX{ function load(&$data){ $query = "SELECT * FROM テーブル名"; if(!$result = @mysql_query($query, データベースへの接続)){ echo "失敗"; } while(@$line = mysql_fetch_array($result, MYSQL_ASSOC)){ array_push($data, $line); } return $data; } } // クラスの生成 $obj = new XXX; // 配列の設定 $data = array(); if($obj ->load($data)){ print_r ($data); }else{ echo "失敗"; }

    • ベストアンサー
    • PHP
  • C#のクラスをVB.netで使用したい!

    お世話になっております。 C#で、wave音声ファイルを録音する機能を持ったクラスファイルがあります。 これをvb.netで使用したいのですが、使用方法がよくわかりません。 vb.netで「既存項目の追加」で、C#のcsファイルは追加できたのですが、 これをvb.netのモジュールで宣言して使用する方法を教えていただきたいのです。 検索してもうまくヒットせず、こちらで教えていただきたく ご質問させていただきました。 【環境】 ・windows mobile 5.0 pocketPC用プログラム(.net compact frame3.5) よろしくお願いいたします。

  • Excel エクセル VBA

    シート上にボタンが5つあり、一部の処理は全て共通となっております。共通処理のコードが長いため修正があると全て治す必要があるためクラスモジュールで共通処理を呼び出すようにしたいです。クラスモジュールを使ったことがないので教えてください。 ボタンはActiveXコントロールを使用しています。

  • ExcelVBA : GetObject関数でのユーザーフォームの参照

    ExcelVBAでGetObject関数を使用すると起動中のExcelを参照できると思います。 その際、参照先のセルの値を変更はできるのはわかるのですが フォームの中身(コントロールなど)を変更したりすることはできるのでしょうか? 現在、ラベルの値を変更しようとしているのですが Dim ○○ As Object Set ○○ = GetObject("C:\XXX.xls") ~~~~~~~~~~~~~~~~~~~~ ○○.UserForm1.Label1 = 5 ですが最後の行で実行エラーになります。 オブジェクトの階層が違うような気もしてはいるのですが解決方法が見つかりません。 何か良い方法をご存じの方は教えていただけないでしょうか?

  • エレメントクラス?

    Javaを勉強しているのですが、 web系で有るJavaBeansのような機能を javaアプリケーソン等でもエレメントクラス?と言って使えるらしいのですが、 どの様に使えばいいのでしょうか、 JavaBeansだと public class 名前{ private String num; public void setNumd(String num)  { this. num= num;  } public String getNum()  {    return this.num; } } この様な構造で、 newしてセットやゲットしいたりすると思いますが(サーブレット上)、 エレメントクラスではどうしたらいいのか分かりません? エレメントクラスの構造は基本構造はJavaBeans(上記)と同じで、 public class 名前{ private String num;  コンストラクタ( String num ) { setNum(num) } コンストラクタ( クラス型 名) { this. num= num; } public void setNumd( String num )  { this. num= num;  } public String getNum()  {    return this.num; } } 上記の様に2つのコンストラクタ追加された構造らしいのですが、 JavaBeansの同じようにnewしてセットやゲットしいようとしてもうまく出来ません? 教えてもらったエレメントクラスで調べても言葉としては出てくるのですが、 詳しい情報がなくセットやゲットしかたや構造が上記の様でいいのか分かりません、 まだ、初歩の初歩までしかやっていないので済みませんが教えて下さい。

  • Excel VBA コントロールの追加方法

    こんにちわ おわかりになるかた、教えてください。 ExcelVBA で、下記の様な方法でラベルコントロールを追加できるのですが、 ステータスバーとリストビューを追加する方法がわかりません。 set myControl = myForm.Designer.Controls.Add("Forms.Label.1") 追加したいステータスバーは下記となります。 Microsoft StatusBar Control, version 6.0 Microsoft ListView Control, version 6.0 よろしくおねがいいたします。

専門家に質問してみよう