- PR -

インスタンスをどこで保持すればいいのでしょうか。

1
投稿者投稿内容
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-08-27 18:23
皆様お久しぶりです。有給システムの件でお世話になりましたオウドーと申します。

早速ですが本題を申します。

まず、フォームAとフォームBとフォームCがあります。

画面遷移でいうと
フォームA→フォームB→フォームC
このようになります。
そして、フォームAにはテキストボックスが2つあります。
テキストボックス2つを「te1」[te2」とします。


ここからお聞きしたい内容なのですが
フォームCクラスのコンストラクタに
string test;
public フォームC()
{
InitializeComponent();
}
public フォームC(string test):this()
    {
   this.test = test;
    }
このようなコンストラクタがあります。

処理開始
フォームAが起動。

ここで引数付きコンストラクタ呼び出し(引数にはte1を指定。フォームCのインスタンス生成
(インスタンス変数:ccc)
フォームBを表示させたいのでフォームBのインスタンス生成
(インスタンス変数:bbb
bbb.showDialog();

ここで上で生成したフォームCのインスタンスを使用したいがわからない。
よって再びインスタンスを生成。
その結果当然、string型test変数に収められていた値はなし。


要するにフォームAのテキストボックスをフォームCを扱いって事なんです。
フォームA→フォームCという遷移であれば問題なく出来るんですが
フォームA→フォームB→フォームCと間になにか入ると
当然、フォームBにて生成されたインスタンスが参照されてしまいます。
しかし、最初に生成したインスタンスを<b>どこかに</b>保持してそれを
再利用するって形にしたいのですがわからずじまいです。
申し訳ありませんがご教授お願いします。

編集追記

申し訳ないです。開発言語はC#
開発環境はVS2005です。

[ メッセージ編集済み 編集者: オウドー 編集日時 2007-08-27 18:29 ]
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-08-27 19:17
ん?FormBにもコンストラクタで渡せばいいんじゃないですか?で、FormBでFormCを生成する、と。
FormCをFormAで生成したいのなら、FormBにFormCのインスタンスをコンストラクタで渡すとか。
まぁ、やり方は色々あると思います。

そのテキストが業務ロジックに関わってくるのなら、ファサードクラスでテキストを保持させちゃうと良いかもしれません。
FormAでHogeを生成&フィールドに保持し、FormB・FormCにはそのインスタンスをコンストラクタで渡す、といった感じです。

コード:
class HogeFacade
{
  private string _fugaText;

  public string FugaText
  {
    get
    {
      return this._fugaText;
    }
    set
    {
      this._fugaText = value;
    }
  }

  public void PiyoExecute()
  {
    // 業務処理
  }
}



コード:
class FormA : Form
{
  private HogeFacade _facade;

  public FormA()
  {
    this._facade = new HogeFacade();
  }

  public ShowFormB()
  {
    this._facade.FugaText = this.TextBox1.Text;
    using (FormB formB = new FormB(this._facade))
    {
      formB.ShowDialog(this);
    }
  }
}



コード:
class FormB : Form
{
  private HogeFacade _facade;

  public FormB(HogeFacade facade)
  {
    this._facade = facade;
  }

  public ShowFormC()
  {
    using (FormC formC = new FormC(this._facade))
    {
      formC.ShowDialog(this);
    }
  }
}



コード:
class FormC : Form
{
  private HogeFacade _facade;

  public FormC(HogeFacade facade)
  {
    this._facade = facade;
    this.TextBox1.Text = this._facade.FugaText;
  }
}


_________________
C#と諸々
オウドー
ベテラン
会議室デビュー日: 2007/06/05
投稿数: 59
投稿日時: 2007-08-28 09:40
おはようございます。
長文回答感謝致します。

>>ん?FormBにもコンストラクタで渡せばいいんじゃないですか?で、FormBでFormCを生成する、と。
FormCをFormAで生成したいのなら、FormBにFormCのインスタンスをコンストラクタで渡すとか。

上記をヒントに解答できました。
FormAで値を取得→FormBに渡し→FormCに渡す。
ありがとうございました。

さて、ここでもう一つ疑問が浮かんだのですが「やり方は色々ある」
この部分が少し引っかかりました。愚問かもしれませんが質問させていただきます。皆様が業務で使う一般的な方法はどういった方法なのでしょうか。

FormA→FormB→FormCといった方法でしょうか。

それとも、別に値を保持しておき引数なしコンストラクタでインスタンスを生成し
どこかにおいてあった値を返す。というのは簡単ですが。

よろしくお願いします。

#現在、私は上記方法以外にも容易にする方法を見つけるために頑張っております^^;

[ メッセージ編集済み 編集者: オウドー 編集日時 2007-08-28 09:43 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-08-28 10:00
引用:

オウドーさんの書き込み (2007-08-28 09:40) より:
さて、ここでもう一つ疑問が浮かんだのですが「やり方は色々ある」
この部分が少し引っかかりました。愚問かもしれませんが質問させていただきます。皆様が業務で使う一般的な方法はどういった方法なのでしょうか。


値というのが何を表しているのか、それぞれのフォームがどんな責任を持っているのかによって異なります。
1

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