- 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
|