- PR -

VS.NETで相互にWindows.Formを参照

投稿者投稿内容
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2003-12-05 20:25
こんにちは、
Windows.Form(C#)について質問があります。

プロジェクトAに FormAというクラスがあり、
プロジェクトBに FormBというクラスがあるとします。

FormAのあるイベントでFormB.Show() を
呼び出し、
FromBのあるイベントでFormA.Show() を
呼び出したいとします。
このような時にVS.NETで互いにプロジェクト参照をすると、
循環参照となりエラーになりますよねぇ。

上記のような事をするばあいは、両フォームを同一の
プロジェクトに含めなければダメなのでしょうか?
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-12-05 22:39
toppoさん、こんばんは。

例えばこういう事↓とは違います?

【ProjectA 側】
コード:
// 諸々省略しています。

public class FormA : System.Windows.Forms.Form
{
    private System.Windows.Forms.Form formB;

    public FormA(System.Windows.Forms.Form FormB) : this()
    {
        formB = FormB;
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
        formB.Show();
        this.Hide();
    }
}



【ProcjectB 側 (ProjectAを参照)】
コード:
// こちらも諸々省略しています。

public class FormB : System.Windows.Forms.Form
{
    private ProjectA.FormA formA;

    public FormB()
    {
        InitializeComponent();
        formA = new ProjectA.FormA(this);
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
        formA.Show();
        this.Hide();
    }
}


架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-12-05 23:27
引用:

toppoさんの書き込み (2003-12-05 20:25) より:

プロジェクトAに FormAというクラスがあり、
プロジェクトBに FormBというクラスがあるとします。

FormAのあるイベントでFormB.Show() を
呼び出し、
FromBのあるイベントでFormA.Show() を
呼び出したいとします。
このような時にVS.NETで互いにプロジェクト参照をすると、
循環参照となりエラーになりますよねぇ。

上記のような事をするばあいは、両フォームを同一の
プロジェクトに含めなければダメなのでしょうか?


少し疑問に思ったのですが、プロジェクトを分ける必要はあるのでしょうか?
#いまいちそのようなことをする事情が分からないのですが。。。


[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-12-05 23:31 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-06 07:27
引用:

toppoさんの書き込み (2003-12-05 20:25) より:

Windows.Form(C#)について質問があります。

プロジェクトAに FormAというクラスがあり、
プロジェクトBに FormBというクラスがあるとします。

FormAのあるイベントでFormB.Show() を呼び出し、
FromBのあるイベントでFormA.Show() を呼び出したいとします。


 これが、「FormAからFormBを開き、FormBでの処理後、FormAに戻る」のであれば、

Class FormB : ...Form {
public Form ForReturnForm; // 宣言これで良かった?
...

protected Closing(...) { // イベントは適当に
ForReturnForm.Show();
}
}

とでもすることで、ProjectBはProjectAを参照しなくても可能ですけど。
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-12-06 19:07
FormA から FormB を表示して、FormB を非表示、もしくは閉じたときに呼び出し元のフォームを
表示するというのであれば、Form#ShowDialog を使ってFormB を表示するだけでいいと思います。

コード:

ProjectB.FormB formB = new ProjectB.FormB();

this.Hide();
this.formB.ShowDialog();
this.Show();



#もう少し具体的にどういう動作を行いたいのか言って頂けると助かります。


[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-12-06 19:10 ]
toppo
ベテラン
会議室デビュー日: 2003/10/28
投稿数: 89
お住まい・勤務地: 東京・池袋
投稿日時: 2003-12-07 12:08
みなさん、返信ありがとうございます。

説明が不足していてスミマセン。

FormAから、FormBを開き処理をしてから、
FormBを閉じ、FormAを表示する。
とうい事ではなく。

ProjectAに
FormA_1と、FormA_2があり、
ProjectBに
FormB_1と、FormB_2があるとして、

画面遷移として、
FormA_1→FormB_2という様に遷移するケースと、
FormB_1→FormA_2という様に遷移するケースがある場合に、
ProjectA に ProjectBのファイル参照
ProjectB に ProjectAのファイル参照を
追加しならない。
という状況なのですが。
ご理解いただけるでしょうか?

架空兎さんのおっしゃるようにProjectを分けなければ
解決という事になりますね。

ではなぜそのようなProject構成になったかというと、
全体でかなり多くの画面があり、ひとつのプロジェクトに
含めるとかなりサイズ大きいdllになってしまうので、
大きく機能を分類してProjectを分けたというのが、いきさつです。
このスレッドの本来の質問の答えとしては
結果的にはProjectの分け方に問題があるという結論になると思うのですが、
皆さんはProjectを分ける際にどういった基準で
分類していますか?

架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-12-07 23:07
引用:

toppoさんの書き込み (2003-12-07 12:08) より:

皆さんはProjectを分ける際にどういった基準で
分類していますか?


#今回の仕事で初めて .NET の開発を経験しているので、
#あくまでも私の考えなのですが。。。^^;

本体の(他のプロジェクトから参照されない)プロジェクトと、
部品の(他のプロジェクトから参照される)プロジェクトに分けるのが一般的ではないでしょうか?

あと、互いに結びつきが強いクラスはやはり同じプロジェクトにまとめた方が
いいのではないでしょうか?
#結びつきが強いのに別々のプロジェクトになっているのってなんかヘンですよね?

もし、部品となるプロジェクトから呼び出し元のプロジェクトに何か処理(今回の場合は
フォームの表示)をさせたい場合は“委譲”を使うといいと思います。

#やり方はいろいろあると思いますが、私の場合だとこんなカンジかな?
##フォームの表示を呼び出し元でやるか呼び出し先でやるかはお任せします。。。^^;

コード:

// プロジェクト A (プロジェクト B とプロジェクト C を参照)
namespace ProjectA {
class FormAProvider : ProjectC.FormProvider {
public System.Windows.Forms.Form GetForm() {
return new FormA();
}
}

public class FormA : System.Windows.Forms.Form {

private System.Windows.Forms.Button button1;

...

private void button1_Click(object sender, System.EventArgs e) {
ProjectB.FormB formB = new ProjectB.FormB();
formB.setFormProvider(new FormAProvider());
formB.Show();
}
}
}

// プロジェクト B (プロジェクト C を参照)
namespace ProjectB {
public class FormB : System.Windows.Forms.Form {

private ProjectC.FormProvider formProvider = null;
private System.Windows.Forms.Button button1;

...

public void setFormProvider(ProjectC.FormProvider formProvider) {
this.formProvider = formProvider;
}

private void button1_Click(object sender, System.EventArgs e) {
if (this.formProvider != null) {
Form form = this.formProvider.GetForm();
form.Show();
}
}
}
}

// プロジェクト C
namespace ProjectC {
public interface FormProvider {
System.Windows.Forms.Form GetForm();
}
}



#あまりこういったコードを書かない(作りをしない)に越したことはないですけどね。。。^^;


[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-12-07 23:18 ]

[ メッセージ編集済み 編集者: 架空兎 編集日時 2003-12-08 10:09 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-12-08 09:31
引用:

toppoさんの書き込み (2003-12-07 12:08) より:

ProjectAに
FormA_1と、FormA_2があり、
ProjectBに
FormB_1と、FormB_2があるとして、

画面遷移として、
FormA_1→FormB_2という様に遷移するケースと、
FormB_1→FormA_2という様に遷移するケースがある場合に、
ProjectA に ProjectBのファイル参照
ProjectB に ProjectAのファイル参照を
追加しならない。
という状況なのですが。


 だったら「FormA_1とFormB_2」でProjectA、…略、とすればよい、と思うのですが、そういうことではなく?

 私ならば、まず、画面遷移図を描きます。この中で、「*_2」から次の画面が出ていないなら、これらをまとめて1つの「参照されるプロジェクト」とします。「プロジェクト」を、「機能面」ではなく、「行動面」から作ります。

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