- PR -

Form_Loadイベント中に他フォームをロードする方法

1
投稿者投稿内容
extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2006-01-19 20:53
Form1/Form2があり、以下のようにコーディングすると、Form1の上面にForm2が表示されるのですが、
 ・Form2をマウスクリックしても、非アクティブのまま
となり、Form2の制御ができません。

コード例) - - - - - - - - - - - - - - - - - - -
  private Form2  f2;
  public class Form1 : System.Windows.Forms.Form
    …
  private void Form1_Load()
  {
    ShowForm2();  // 作成したメソッド
  }
  
  private void ShowForm2()
  {
    f2 = new Form2();
    this.AddOwnedForm(f2);
    keyboadDlg.Show();
  }
- - - - - - - - - - - - - - - - - - - - - - - -
ちなみに、
  private void Form1_Load()
  {
  }

  private void btnOpen_Click(…)// OPENボタン押下時のメソッド
  {
    ShowForm2();
  }
のように、Form_Load()後にForm2を開いた場合は、Form2の制御はできました。

Form_Load()中に、他フォームを呼び出すには、どのようにすればいいのでしょうか?
やりたいことは、
 Form1起動時に設定ファイルを読み込む
  ↓
 設定値が「TRUE」の場合、Form2を開いた状態でForm1を開く。
 (Form2の親WindowをForm1とする。)
です。

分かる方いたら教えてくださいm(__)m
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-19 21:50
引用:

extreamさんの書き込み (2006-01-19 20:53) より:

Form_Load()中に、他フォームを呼び出すには、どのようにすればいいのでしょうか?


やめましょう。
Activate イベントで代用してください。

引用:

やりたいことは、
Form1起動時に設定ファイルを読み込む


起動前に読み込むべきですよね?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-01-19 22:42
引用:

extreamさんの書き込み (2006-01-19 20:53) より:
Form1/Form2があり、以下のようにコーディングすると、Form1の上面にForm2が表示されるのですが、
 ・Form2をマウスクリックしても、非アクティブのまま
となり、Form2の制御ができません。



南部です。

空のFormに下記コーを追加して試してみましたが、
モードレスで表示したForm(f)は普通にアクティブにできました。
#他になにかあるのかな?

WindowXP Pro SP2
.NET Framework1.1 SP1


コード:
private void Form1_Load(object sender, System.EventArgs e)
{
  Form f = new Form();
  this.AddOwnedForm(f); 
  f.Show();
}


extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2006-01-20 10:04
みなさん、回答ありがとうございますm(__)m

環境は
 WindowXP Pro SP2
 .NET Framework1.1 SP1
です。

nanbu様が書かれたコードで動作確認したところ、一つ情報を書くことを忘れていましたm(__)m
#Form1とForm2だけの場合は、nanbu様が書かれているように正常に動作しました。

Form1とForm2以外に、FormMainが存在し、
 FormMain
 ↓
 モーダル(ShowDialog)でForm1を表示
  ↓
 モードレス(Show)でForm2を表示
としていました。。。

public class FormMain : System.Windows.Forms.Form
{
private Form1 f1;
private void btnF1_click(…)
{
f1 = new Form1()
DialogResult result = f1.ShowDialog(this);
}
}

public class Form1 : System.Windows.Forms.Form
{
private Form2 f2;
private void Form1_Load(…)
{
f2 = new Form1()
this.AddOwnedForm(f);
f2.Show();
}
}

FormMainのボタン押下イベントで、Form1、Form2を同時に開きたいのです。
(Form2を開くかどうかは、Form1のロード中に読み込む設定ファイル次第です。)

モーダル画面の表示処理中に、モードレス画面(Form2)の生成を行うと正常な動作は行えないのでしょうか?
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-01-20 10:32
南部です。

FormMainのスレッドで実行されているためです。
なので、Form1のスレッドにマーシャリングする必要があります。

コード:
delegate void ShowChildHandler();

private void Form1_Load(…) 
{ 
  this.BeginInvoke(new ShowChildHandler(ShowChildForm));
}

private void ShowChildForm()
{
  f2 = new Form1();
  //これはf2の間違いかな?
  //this.AddOwnedForm(f); 
  this.AddOwnedForm(f2);
  f2.Show(); 
}


なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-01-20 12:26
お世話になります。

引用:

extreamさんの書き込み (2006-01-20 10:04) より:
FormMainのボタン押下イベントで、Form1、Form2を同時に開きたいのです。
(Form2を開くかどうかは、Form1のロード中に読み込む設定ファイル次第です。)

モーダル画面の表示処理中に、モードレス画面(Form2)の生成を行うと正常な動作は行えないのでしょうか?



設定ファイルを 必ず Form1のロード中に読み込まなくても
よいのであれば、こんなのはどうでしょうか?

コード:
■エントリポイント のコード
namespace WindowsApplication1{
  public class StartUp
  {  
    [STAThread()]
    static void Main(){
      CustomExceptionHandler eh = new CustomExceptionHandler();
      
      System.Threading.Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(eh.OnUnHandledThreadException);
      Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(eh.OnThreadException);

      string result = null;
      string configPath = System.IO.Path.Combine(Application.StartupPath, "config.txt");
      using(System.IO.StreamReader sr = new System.IO.StreamReader(configPath)){
        try{
          result = sr.ReadLine();
        }finally{
          if (sr != null) sr.Close();
        }
      }
      Application.Run(new FormMain(result));
    }
  }

  public class CustomExceptionHandler{
    public void OnThreadException(object sender, System.Threading.ThreadExceptionEventArgs e){
      Console.WriteLine("例外がなげられた:" + e.Exception.GetType().Name);
    }
    public void OnUnHandledThreadException(object sender, System.UnhandledExceptionEventArgs e){
      Console.WriteLine("ハンドルされてない例外がなげられた:" + e.ExceptionObject.GetType().Name);
    }
  }
}

■FormMain のコード
namespace WindowsApplication1
{
  public class FormMain : System.Windows.Forms.Form{
    // 省略
//    public FormMain(){}
    // 省略
  
    private string m_configValue = null;
    public FormMain(string configValue){
      InitializeComponent();
      this.m_configValue = configValue;
    }
    private void button1_Click(object sender, System.EventArgs e){
      Form1 f1 = new Form1();
      f1.Show();
      if (this.m_configValue == "True"){
        Form2 f2 = new Form2();
        f1.AddOwnedForm(f2);
        f2.Show();
      }
    }
  }
}


extream
ベテラン
会議室デビュー日: 2005/12/26
投稿数: 83
投稿日時: 2006-01-20 13:31
nanbu様に教えていただいた方法で、解決できました。
ありがとうございます。

なおこさまへ
 回答ありがとうございます。
 確かに、なおこ様が言われるような方法もありですね。
 (今の私のスキルでは、ここまでは考えられませんでした。。。)
 ただ、上位(FormMain)に設定ファイルRead処理をさせるのは現在作成中のアプリでは不向きなので、今後の参考にさせていただきますm(__)m

みなさま、ありがとうございましたm(__)m
1

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