- PR -

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

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-01 16:32
ベースの宣言
コード:
public abstract class BaseForm : System.Windows.Forms.Form
{
// 省略 //
	protected abstract BaseForm CreateInstance();
}


メニューを追加して、新しいインスタンスを追加したいメニューのイベントハンドラを追加する。
コード:
private void CreateNewWindow(object sender, System.EventArgs e) {
	BaseForm frm = CreateInstance();
	frm.Show();
}


〜〜〜〜〜

フォームの宣言
コード:
public class Form1 : /*System.Windows.Forms.Form*/ClassLibrary1.BaseForm
{


BaseFormでabstract宣言したメソッドを実装する。
コード:
protected override BaseForm CreateInstance() {
	return new Form1();
}




コメントの謎はやってみて解明のこと。
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-01 19:07
Jittaさん

アドバイスありがとうございます。
VB.NETに書き換えて実装したところ、できました。
一人で考えてたら、到底思い付かないようなモノだったので、
大変勉強になりました。
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-02 10:42
Jittaさん

すいません、解決したかに思えたのですが・・・。

メニューが1アイテムであればOKなのですが、
複数メニューアイテムがあり、遷移先も複数ある場合。

Base側に複数abstract宣言しないといけないのですよね?
とゆうことはForm側にも複数メソッドを実装しないといけなくなりますよね?

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2004-07-02 13:23
リフレクション使って「一応」できたのですが、VS.NETがおかしくなってしまいました。
1つのプロジェクトでやれば問題ないと思うのですが、ダメなのでしょうか。

PS.
System.Windows.Forms.Formのコメントの秘密が分かりました。
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-02 14:27
catsさん

複数人での開発を見込んでいますので、
出来れば、機能をプロジェクトで分割したいと考えています。

ただいまリフレクションにて奮闘してます^^;
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-07-02 16:14
こんにちは。

よくよく質問の内容を見てみたらある疑問が発生しました。
(というより自分が誤解してとっていた部分がある)

ProjectA、ProjectBがあり、全てのフォームがメニューを含んでいた場合、
1.AがBを呼び出した場合、元のAはどうなってしまうのでしょうか?
2.Aは消えると想定した場合、Aのインスタンスを消すのは誰でしょうか?
3.Aは消えないと想定した場合、Bが更にAを呼び出すと、元のAとBの呼び出したAは同一なのでしょうか?

自分としては、メニューを管理するメニューフォームがあり、メニューフォームがProjectA 〜 Jのインスタンスを管理し自分のフォームの一部とする、というように捉えてしまっていました。
(クラスを生成とあるので、EXEを実行させるのでは無いと考えます)

ちなみに自分の考えていた方法は上記のように、アプリ部を管理するメニューフォームが基本としてあり、そのメニューフォームには、メニューボタンとパネル等のコンテナになり得るコントロールを配置します。

メニューボタンを押すと、アセンブリをロードし、アプリのフォームのインスタンスを生成、メニューフォームのパネルを親として設定後、Showすることによりアプリ部が表示されます。

むちゃくちゃ端折ったサンプルコード
-----------------------------
メニューボタンのイベントで
System.Reflection.Assembly assem = Assembly.Load(アセンブリ名);
System.Windows.Forms.Form subForm = (System.Windows.Forms.Form)assem.CreateInstance(名前空間+フォームクラス名);
subform.TopLevel = false;
subform.Parent = メニューフォームのコンテナコントロール;
subform.Size = メニューフォームのコンテナコントロール.Size;
subform.Show();
-----------------------------

実現したいことと違うかもしれませんが、とりあえずのサンプルとして。。。

catsさん、VS.NETがおかしくなったとのことですが、どのようにおかしくなったのでしょうか?




[ メッセージ編集済み 編集者: nodera 編集日時 2004-07-02 16:21 ]
mover
常連さん
会議室デビュー日: 2004/06/20
投稿数: 47
投稿日時: 2004-07-02 18:59
お世話になります。

noderaさんサンプルありがとうございます。
参考になります。

で、別の方法でお知恵を拝借したいのですが、

FORMのベースクラスにMainMenuを搭載するのでは無く、
ユーザーコントロールでMainMenuを作り、各フォームに実装する。
上記ユーザーコントロールは、ボタン押下処理をハンドリングする。

実現可能でしょうか?

ただいま試行錯誤してるのですが、どうもうまくいってません・・・。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-07-02 19:47
メニューコントロールにするにしても、アプリ側はメニューを参照する必要がありますし、メニューコントロールもアプリ側を認識する必要があるので、相互に参照設定しようとすると循環してできないっていう問題は解決しないです。

うまくいかないというのは、それとは別の話でしょうか?
できれば、もう少し具体的にうまくいっていない部分を説明をしてもらえると答え易いです(^^

#ところで、先の投稿で自分が疑問に思った部分はどういう仕組みをお考えですか?
このアプリフォームって独立して動いているの?

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