- PR -

フォームの基本クラスについて

投稿者投稿内容
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-07-02 22:46
えっと、整理すると…
10個の似たようなアプリは、メニューを10個持ってて、メニュー選択によってお互いのアプリを起動することができる。メニューの処理は、各アプリ共通の仕様なので、親Formに処理させたい。…ということですか?

各アプリがアセンブリ(dll)の形で作られているのならば、リフレクションを使うとうまくいくかもしれません。リフレクションとは、クラス名からインスタンスを生成する機能であり、親Formが各アプリを参照する必要はないので、循環参照が起きることもないと思います。
またメニューから起動するアプリのクラス名を、XMLなどの外部ファイルに登録しておけば、将来的にアプリを追加することになっても、XMLファイルの修正のみでメニューを変更できます。この際、親Formを再コンパイルする必要はありません。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-07-02 23:01
ちなみに、
Formをabstractで定義していますが、それを継承するとデザイナが開かなくなりませんか?クラスの構造的には問題ないのでコンパイルは通ります。
しかし、VS.NETのデザイナは、画面生成時に親Formをインスタンス化しようとする為、デザイナが使えなかったと思います。
デザイナが使えなくても開発はできなくもないですが、大規模なプロジェクトだと開発が難しいですね…
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-03 20:41
こんばんわ。
皆様、大変お世話になっております。

少々整理させていただきます。
まず当システムの作りとしまして、

1.タスクリスト(一番初めに起動される画面):アプリA
  ・当画面が実質の親フォームとなります。

2.アプリB
  ・タスクリストのメニュから遷移します。
  ・遷移後、アプリBのメニューから他アプリに遷移します。
   →遷移する際、自分を消して次のアプリを起動させます。
  ・終了させるとタスクリスト(アプリA)に戻ります。
  ・自分への遷移はできないこととします。

3.アプリC〜アプリJ
  ・アプリBと同様の動作をします。

noderaさん

アドバイスありがとうございます。
確かにコントロールにしたところで循環に変わりありませんよね--;

それから、メニュから生成される各アプリは独立してます。
基本的には自分から自分は生成しない作りにしようと考えています。

ZEBRAさん

Abstractを継承するとデザインできないので、VS.NETのバグかと思っちゃいました。。。
デザインできないようであれば、Abstractは起用できませんね;;

リフレクションで再度頑張ってみます。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-07-04 01:21
abstractが利用できないからといって、継承を諦める必要はないと思います。

親Form側で、アプリ側でoverrideしてもらうメソッドをvirtualで指定すればよいと思います。そして、親Form側ではアプリ側にoverrideを強制するために、

protected virtual void MethodA()
{
  throw new ApplicationException("このメソッドをOverrideしてください!!");
}

とし、
更に、アプリ側で、

protected override void MethodA()
{
  //ここに具体的な処理を記述…
}

と、overrideすればOKだと思います。
abstractと比べて、実行させないと継承のし忘れに気付かないデメリットがありますが、abstractのような使い方は実現できると思います。
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-04 22:55
お世話になります。

ZEBRAさん

ひとまずリフレクションを使用して、機能実現に向けて前進してみようと思います。
で、一通りテストコーディングしてみたのですが、

インスタンスを生成まではできてるのですが・・・。
そのインスタンスのShowDialogメソッドをどうコールすればよいのか試行錯誤してます。

色々なサイトを徘徊しては試してみてるのですが。。。
どうもメソッド情報取得で、Return値がNothingになってしまいます。
何が悪いのでしょうか?

'-----------------------------------------------
SampleAssembly = MyAssembly.LoadFrom("C:\TestRef\bin\test.dll")
Dim dtType As Type = SampleAssembly.GetType("test.Form1")
'インスタンスを生成
Dim dtObj As Object = Activator.CreateInstance(dtType, _
BindingFlags.CreateInstance)
'メソッド情報を取得
Dim sdMethod As MethodInfo = dtType.GetMethod("ShowDialog", _
BindingFlags.CreateInstance)
sdMethod.Invoke(dtobj, Nothing)
'------------------------------------------------

それから本当に申し訳ないのですが、
XMLとの連携部が分かるURLなどありましたら、教えていただけませんか?;;
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-07-05 00:03
引用:

リオッタさんの書き込み (2004-07-04 22:55) より:
インスタンスを生成まではできてるのですが・・・。
そのインスタンスのShowDialogメソッドをどうコールすればよいのか試行錯誤してます。


リフレクションを使うのはインスタンスの生成までで十分です。

基底クラスの型がはっきりしてる(Formや基底フォーム)のですから、その型にキャストしてください(変数に代入してしまうのが後々楽かな)。
あとは普通にFormや基底フォームとして操作できるので、普通にShowDialogするだけです。
※この辺の意味が理解できないなら、クラスの継承の意味について勉強するといいです。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-07-05 00:21
リフレクションについてはネットでなくても、.NETのヘルプでも十分見つかると思いますよ。
敢えて参考のサイトを紹介すると、
<http://ja.gotdotnet.com/quickstart/howto/>
の「リフレクション」が参考になると思います。

あと、XMLとの連携の部分ですが、特にXMLにこだわらなくてもよいと思います。
要は、メニューの情報を格納しさえすればよいので、csvでもiniファイルでもよいと思います。

敢えてXMLを挙げたのは、.NETは、設定情報としてXMLとやり取りする傾向が強いと思ったからです。^^
(app.configとかweb.config、machine.configなんかがよい例かな…)

以前携わった開発では、TreeViewのメニュー情報をXMLに持たせて、それを一旦DataTableに格納してからTreeを構成する処理がありました。
XMLとDataTable(もしくはDataSet)の情報はXMLと相互変換できるので、それを利用しました。詳細については、.NETのヘルプで、DataSetもしくはDataTableを調べると分かると思います。OuterXml()メソッドだったかな?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-05 09:11
引用:

ZEBRAさんの書き込み (2004-07-02 23:01) より:
ちなみに、
Formをabstractで定義していますが、それを継承するとデザイナが開かなくなりませんか?


それがコメントの秘密...

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