C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 複数のShowDialogを表示したい


(過去ログ 50 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■27583 / inTopicNo.1)  複数のShowDialogを表示したい
  
□投稿者/ GISU (6回)-(2008/11/10(Mon) 16:25:42)

分類:[C#] 

OS環境 Vista
アプリ C# VS2005

いつもお世話になります。

1プロジェクト内で複数の ShowDialogのようなものを表示したいと考えております。

例として・・

FROM1、FROM2、FROM3を用意し、
FROM1 を親フォームとし、ボタンを配置し、ボタンを押されたら

FROM2 frm2 = new FORM2();
frm2.Show();

といった形で子供のフォームを表示しています。

呼び出された子供の FROM2 内にも、同じようにボタンが配置してあり、こちらはShowDialog でさらに別のFROM3 を表示するようにしてあります。
FROM3 frm3 = new FORM3();
frm3.ShowDialog ();

この状態だと、FROM3が ShowDialog表示されているので、FROM1、FROM2 を前面にする事はできません。

が、ここでFROM1に戻り、新たなFROM2を表示させ、最初に表示されたFROM2、FROM3とは別管理で動かしたいと思っております。

FROM1をメニューとして、FROM2、FROM3が処理を行うプログラムと考えててもらえれば、
やりたいことが伝わりやすいでしょうか・・・。

FROM1 でEXEを作成、FROM2とFROM3でEXEを作成すればできるのですが、
FROM1からFROM2への値の引き渡しがあるので、1つのプロジェクト内で行いたいです。


「Show ShowDialog」 でなくてもかまわないので、何か実現可能な方法、もしくは
ヒントになるような事があれば教えて頂きたいです。

よろしくお願いします。


引用返信 編集キー/
■27584 / inTopicNo.2)  Re[1]: 複数のShowDialogを表示したい
□投稿者/ こりん (1回)-(2008/11/10(Mon) 16:46:06)
それだとShowDialog(モーダル表示)とは言えないので、ShowメソッドでOwnerFormを引数に持つオーバーロードを使えばよろしいのでは?
引用返信 編集キー/
■27585 / inTopicNo.3)  Re[2]: 複数のShowDialogを表示したい
□投稿者/ たくボン (61回)-(2008/11/10(Mon) 17:07:43)
No27584 (こりん さん) に返信
> それだとShowDialog(モーダル表示)とは言えないので、ShowメソッドでOwnerFormを引数に持つオーバーロードを使えばよろしいのでは?

AddOwnedFormを使ってもGISUさんのやりたいことは実現できないかも。

Form2とForm3をモーダル関係を持たせて、複数処理をしたいみたいだから、Threadでするのがいいのかも。

まず、Form2にスレッド開始のメソッドを用意。
public void ShowHoge()
{
	this.ShowDialog();
}

次にForm1にスレッドの配列を用意して

private List<Thread> thds = new List<Thread>();




private void button1_Click(object sender, EventArgs e)
{
	Form2 f2 = new Form2();
	Thread t = new Thread(new ThreadStart(f2.ShowHoge));
	thds.Add(t);
	t.Start();
}
こんな感じで呼び出すと、希望に近い動作になるかも。
ただし、別スレッドになるので、データの扱い方には注意してください。
それとForm2の終了時には自身のスレッド、Form1を終了する時には生存してるthdsを消すようにしてください。

引用返信 編集キー/
■27593 / inTopicNo.4)  Re[3]: 複数のShowDialogを表示したい
□投稿者/ 渋木宏明(ひどり) (946回)-(2008/11/10(Mon) 21:24:54)
渋木宏明(ひどり) さんの Web サイト
> Form2とForm3をモーダル関係を持たせて、複数処理をしたいみたいだから、Threadでするのがいいのかも。

危なっかしいなぁ。

メッセージポンプ周りの仕組みを理解しないで手を出すと、大ヤケドするやも。

引用返信 編集キー/
■27594 / inTopicNo.5)  Re[4]: 複数のShowDialogを表示したい
□投稿者/ 紅の豚118 (18回)-(2008/11/10(Mon) 22:44:05)
No27593 (渋木宏明(ひどり) さん) に返信
>>Form2とForm3をモーダル関係を持たせて、複数処理をしたいみたいだから、Threadでするのがいいのかも。
> 危なっかしいなぁ。
> メッセージポンプ周りの仕組みを理解しないで手を出すと、大ヤケドするやも。

すみません。どのあたりを渋木さんは懸念されているのでしょうか?
メッセージポンプに関係するような、以下のサイトを見て考えてみたのですが、たくボンさんの投稿のどのあたりが懸念材料になるのかいまいちわかりませんでした。よろしければ向学のために教えていただければと思います。

【@IT:連載:簡単!Visual Studio .NET入門 第3回 Visual Studio .NETのひな形コードを理解する】
http://www.atmarkit.co.jp/fdotnet/easyvs/easyvs03/easyvs03_05.html
【アプリケーション開始時のフォームを非表示にする: .NET Tips: C#, VB.NET, Visual Studio】
http://dobon.net/vb/dotnet/form/notopenform.html

引用返信 編集キー/
■27597 / inTopicNo.6)  Re[5]: 複数のShowDialogを表示したい
□投稿者/ 渋木宏明(ひどり) (947回)-(2008/11/11(Tue) 08:56:26)
渋木宏明(ひどり) さんの Web サイト
> すみません。どのあたりを渋木さんは懸念されているのでしょうか?

Form を、プライマリスレッド以外のスレッドで Show() することです。

目立った不安材料は以下の通りです。

・Windows Forms ってプライマリスレッド以外での Form の生成・運用を考慮した設計なの?
(ワーカースレッドで Application.Quit() しちゃっても平気?他)
・プライマリスレッドから、ワーカスレッドに所属する Form を操作する際に Invoke() 忘れてコケるんだろうなぁ

など。

まぁ、動くんでしょうけど、何がどこまで動くのか説明されたドキュメントを見かけた記憶がないし、傍証でもあればいいんですが、作りこみ次第でどーとでも変わるところなので不安は感じます。
引用返信 編集キー/
■27598 / inTopicNo.7)  Re[6]: 複数のShowDialogを表示したい
□投稿者/ たくボン (62回)-(2008/11/11(Tue) 10:19:06)
No27597 (渋木宏明(ひどり) さん) に返信
>>すみません。どのあたりを渋木さんは懸念されているのでしょうか?
> Form を、プライマリスレッド以外のスレッドで Show() することです。

おはようございます。確かに作り方次第ではかなり危ない作りになると思います。ただし、今回は別EXEにすることは除外されていたので、こんな方法しか思いつかなかったです。(実装的には別EXEにするのが妥当、と言うかモーダル画面を複数表示する時点で設計ミス・エンドユーザへの説明不足の可能性があるので再設計しますけど)


> まぁ、動くんでしょうけど、何がどこまで動くのか説明されたドキュメントを見かけた記憶がないし、傍証でもあればいいんですが、作りこみ次第でどーとでも変わるところなので不安は感じます。

です。このような件は十分な検証が必要ですね。可能なら設計を見直すのがいいかも。
どうしようもない場合は、特にスレッド終了の部分や、データの扱いには十分注意してください。

引用返信 編集キー/
■27599 / inTopicNo.8)  Re[7]: 複数のShowDialogを表示したい
□投稿者/ GISU (7回)-(2008/11/11(Tue) 10:31:53)
たくさんの返信ありがとうございます。

たくボンさんの方法で、簡易的に作成してみたところ、やりたい処理が実現できました。

マルチスレッドの知識がないので、もう少し勉強して色々と試してみようと思います。


相談にのっていただきありがとうございました。


解決済み
引用返信 編集キー/
■27605 / inTopicNo.9)  Re[7]: 複数のShowDialogを表示したい
□投稿者/ 渋木宏明(ひどり) (948回)-(2008/11/11(Tue) 11:29:29)
渋木宏明(ひどり) さんの Web サイト
2008/11/11(Tue) 12:00:11 編集(投稿者)

>こんな方法しか思いつかなかったです。

僕がリスクを被るわけではないので、止めはしません。

Win32 API レベルで書くなら、子のスレッドで出たようなシナリオも「注意を払って書く」ことで安定動作は望めます。
しかしながら、Windows Forms の実装の詳細は不明なので、どこかで何かがうまくいかなくなる可能性は十二分にある、というリスクは知っておくべきだと思いました。

> です。このような件は十分な検証が必要ですね。可能なら設計を見直すのがいいかも。

Windows Forms の使用が前提なら、個人的には再設計を強く勧めます。

> どうしようもない場合は、特にスレッド終了の部分や、データの扱いには十分注意してください。

と、言うまでもないことですが、スレッドまたぎでの Form/Control の操作にも要注意ですね。
まぁ、こんなややこしいことはしないに越したことはないのですが。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -