DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数プロジェクトで共通のインスタンスを作りたい

環境/言語:[VB.NET .NET Framework1.1]
分類:[.NET]

今、下記のようなプログラムを作ろうとしています。

MainForm
|
+--- SubForm1
|
+--- SubForm2
|
+--- SubForm3

普通にこれが1つのプロジェクト内にあれば問題ありませんが、実はこのフォー
ムは全て別のプロジェクトに分かれており、1つのソリューション内に保存され
ています。上記例ではたった4フォームですが、実際にはかなりのフォーム数が
あり、機能ごとにプロジェクトを分けてそれぞれ別の人間で開発を進めています。

で、今回、全てのフォームで共通に用いるデータが必要となりました。このデー
タを各フォームにて読み書きし共有する必要があるため、このデータを保持する
クラスを作り、MainForm にてインスタンス化しました。

で、下記のような問題に直面しております。

1.MainFormからSubForm1を呼び出しているため、MainForm側でSubForm1を参照
  設定に加えているのですが、SubForm1側でMainForm内に作られた共通データ
  のクラスのインスタンスを見るため、SubForm1側にてMainFormを参照設定し
  ようとすると

    MainForm への参照を追加できませんでした。
    このプロジェクトを参照として追加すると循環する依存関係を生じます。

  とのメッセージが表示され、追加できませんでした。
  MainForm のメンバ変数としてクラスのインスタンスを定義しているため、
  MainForm の参照設定は必須かと思ったのですが。


2.MainForm から SubForm1、SubForm2 は親子関係であるため、SubForm1 から
  MainForm を参照すること自体はむずかしくはありません。ただ、SubForm3
  から MainForm を見ようとした場合、直接の親子ではないため SubForm2 を
  仲介して参照する必要が生じます。
  これがまだ2段階ですからいいのですが、これが3重、4重になると仲介す
  るのも問題があると思います。よって、「このアプリケーションのメインと
  なるオブジェクト or フォーム」などが取得できるようなものがあればいい
  のですが、こんなものは用意されているものでしょうか?


ようは全プロジェクトで共通のインスタンスを参照する手順があればそれで解決
するのですが今ひとつ分かりません。VC++のMFCにある CWinApp クラスのような
ものがあればいいのですが・・・

どなたかお分かりになられるかたがおられますでしょうか?
ご教授のほど、よろしくお願い致します。
あわわわ。スペースが勝手に削られちゃってる。

MainForm
__|
__+--- SubForm1
__|
__+--- SubForm2
_________|
_________+--- SubForm3

スペースを入れると詰められるみたいなんで、無理矢理アンダーバーで表現
してみました。

SubForm3 は SubForm2 の子画面にあたります。
MUDO さんこんにちわ。

詳しい内容はそんなに理解していませんが・・・

>ようは全プロジェクトで共通のインスタンスを参照する

全プロジェクトの共通モジュールを用意して、
各プロジェクトではモジュールの変数を参照すればよいのでは無いでしょうか?

参照したい変数がMainFormのメンバ変数である必要があるのであれば、
別のやり方を探すべきだと思いますが。

単にある変数を各フォームから参照できれば良いのであれば、
モジュールで実現できると思います。
SHさん、こんにちは。
お返事ありがとうございます。

> 全プロジェクトの共通モジュールを用意して、
> 各プロジェクトではモジュールの変数を参照すればよいのでは無いでしょうか?

ああああああああああああ!
そうです。その通りです。バカバカ、俺のバカ!



気を取り直しまして。
新プロジェクトを作り、その中にモジュールファイルをひとつだけ置いて
みました。

Public Module modData

Public g_objCommon As CommonPG.clsCommon

End Module

ここで注意するのが、1行目の「Public」です。自動でソースが生成される
際には書かれないので注意です。私、これでちょいとハマりました。

後は、全プロジェクトでこの新プロジェクトを参照設定するだけでOKでした。
上記例だとクラスオブジェクトを宣言しているだけですので、インスタンスの
作成は Main 関数内で下記のとおりやれば問題なしでした。

g_objCommon = New CommonPG.clsCommon


これで問題なしです。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板