• ベストアンサー

モーダルダイアログの特徴について

fresh_homepieの回答

  • ベストアンサー
回答No.1

モーダル表示ダイアログボックスは必ずオーナーウィンドウ(画面の親子関係で親に当たるもの)の前面に表示され、ダイアログボックスが表示されている間はオーナーウィンドウを操作することができなくなります。 引数なしバージョンの ShowDialog() は、呼び出した時点のアクティブウィンドウがオーナーとなります。 同じプログラム内で別に作成しているウィンドウのタイプと ShowDialog() を実行するタイミングによっては、たまたま別のウィンドウがアクティブになっている可能性もゼロではないので注意が必要です。 ShowDialog() には引数にオーナーウィンドウを指定するオーバーロードがあるので、そちらを使用すると確実であると思います。 例)親画面のコード上でモーダルダイアログを表示する場合   cForm1.ShowDialog(this);

gin57773222
質問者

お礼

ありがとうございます 本当に勉強になりました 今まで全く意識できていないことでした

関連するQ&A

  • c#で次の次のフォームへのデータの渡し方

    c#で次の次のフォームへのデータの渡し方 お世話になります。 c#初心者です。 フォーム1にはbuttonが2つあり、どちらを押したかで 次(フォーム2)の次のフォーム(フォーム3)を開く時に そのフォームにあるボタンを表示させるか・非表示にさせるか したいと思っております。 中途半端ですが下記の様なコードを書いておりましてその先 フォーム3での記述をどの様に書いたら良いのか行き詰って しまいました。 どなたかご親切な方、ご教示頂きたく宜しくお願い申し上げます。           記 クラス using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication1 { public class Keikaku { public enum Mode { Syuuse, Syoukai } } } ---------------------------------- フォーム1 namespace WindowsFormsApplication1 { public partial class MainMenu : Form { private void button1_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syuusei; cForm2.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syoukai; cForm2.ShowDialog(); } } } ---------------------------------- フォーム2 namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private Keikaku.Mode _kakunin; public Keikaku.Mode Syuusei { set { _kakunin = value; } } private void button1_Click_1(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } } } ---------------------------------- フォーム3 namespace WindowsFormsApplication1 { public partial class Form3 : Form { } }

  • Disposeはするべきですか?

    Dim objForm as New Form1 objForm .ShowDialog() とフォームを開いた後、objForm.Dispose()と記述してフォームオブジェクトを解放するべきでしょうか? 解放するべきだとは思うのですが、色々な人のソースを見ると、そのようになっていないような気がするので…。

  • C#でのフォーム間のデータの受け渡しについて

    フォーム間のデータ(パラメータ等)の受け渡しについて教えてください。 現在Form1からForm2を起動させる場合、以下のようにForm2のインスタンスの生成時のパラメータを設定してもForm2のLoadイベントでは拾うことはできないのでしょうか? ↓実際のコード //Form1クラスのインスタンスを作成する //引数(a,b) Form2 f = new Form2(a,b); //Form1を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose(); また、上記の方法が違っていた場合、方法としてどのようなやり方があるのか教えてください。 よろしくお願いいたします。

  • モーダルダイアログで発生するイベント(C#)

    C#で、FormをShowDialog()、つまりモーダルダイアログで表示してからの話です。 ここで、当のForm以外をマウスでクリックしたりすると、当のFormのタイトルバーがチカチカしますよね。 このとき、当のFormにはどんなイベントが発生しているのでしょうか? 当のForm以外をクリックしたときに、「ダイアログのボタンを押して、値を選択してください」のようなメッセージを出したいと思っています。 そのために、そのイベントを使えばいいのかな、と思いました。 どうぞ、よろしくお願いします。

  • WindowsFormの消去について(C#)

    こんにちわ。 C#(WindowsForm)で以下のような処理を考えています。 1.起動するとForm1(ログイン画面)が開く 2-1.認証に成功 → 3へ 2-2.認証に失敗 → メッセージを表示し、ログイン画面のユーザ名にフォーカスをセット 3.Form3(メインメニュー)を開く そこで、スタートアップの画面は、Form1で良いと思うのですが、 2-1の場合に、以下のようなコードを書いてみました。 *************************************** Form3 f = new Form3(); f.ShowDialog(this); f.Dispose(); this.Close(); *************************************** これでは、次の部分で目的を達成できませんでした。 A.Form3をShowDaialog(this)で開くと、モーダルモードで開くだけとなってしまう。 Showではモードレスとなるだけ。 B.Dispose、Closeを記述してみたが、Form3が開いた時に、 画面上からForm1が消えるわけではない。 Closeでは、システム自体が終了してしまう。 そこで、ShowDialogやShowではなく、Form1を消し、Form3を表示するメソッド等あるのでしょうか? ちなみに、Form3をCloseした場合に、Form1を再度呼び出す処理は考えていません。

  • VC++:ダイアログがDispose()できない

    前略 ・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。  しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると "error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。 <質問>  VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?  もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?  どなたかお分かりになる方、ご教示いただければ幸いです。 以上、よろしくお願いします。 //------------------------------------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "ダイアログのタイトルをココに書く"; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1->FileName); // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) // openFileDialog1->Dispose(); };

  • C#プログラムにて

    C#プログラムにて お世話になります。 C#初心者です。 プログラムコードを書き始めで、早速行き 詰っています。 ステップでコードの動きを確認したところ、 program.csのMainから下記のForm1.csに 移りForm1のデザイナが表示されるのですが、 button3を押してもForm3が表れません。 また、ステップの黄色いカーソルと言いますか ステップの位置情報も消えています。 何がどう悪いのか分からなく困っています。 どなたかご親切な方、ご教授頂きたく 宜しくお願い致します。     記 using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { DialogResult ans; ans = MessageBox.Show("最新のコード表を照会しますか?", "Microsoft Visual Studio", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.OK) Application.Exit(); } private void button12_Click(object sender, EventArgs e) { Form4 cForm4 = new Form4(); cForm4.ShowDialog(); } } }

  • CDHtmlDialog で子ダイアログがアクティブになりません

    現在CDHtmlDialogクラスを使って、ダイアログベースのプログラム開発を試みています。開発環境はVisualStudio2008です。 親ダイアログにあるボタンをクリックすると、子ダイアログが親ダイアログに重なる位置に表示され、子ダイアログにあるHTML コントロールのイベント処理等ができるようにしたいのですが、うまくいかず困っています。 子ダイアログの表示まではできたのですが、アクティブになっていないようです。ただ画面に表示されているだけといいますか・・・ 子ダイアログに配置したボタンはクリックできず(カーソルが変わりません)、親ダイアログに配置したボタンはクリックできる、というような状態です。 また、ダイアログの一部が画面外になるように動かしてから元の位置に戻すと、子ダイアログの再描画がされず、その下に隠されていた親ダイアログが出てきてしまいます。 子ダイアログのプロパティは Style:子、Border:なし にしています。 手順は、 1.親ダイアログのOnInitDialogで子ダイアログをCreate。MoveWindowで位置調整。子ダイアログはShowWindowで非表示にする。 2.親ダイアログのボタンをクリックすると、子ダイアログをShowWindowで表示させる。 としています。 CDialogで同じ方法でやっていたときは何も問題なかったのですが・・・ CDHtmlDialogに関する情報はあまり出回っていないようで、こちらに質問させていただきました。 説明が分かり難い点もあるかと思いますが、ご教示よろしくお願いいたします。

  • C#について

    最近C#を勉強しはじめました。 メインのform1からボタンをクリックして別のダイアログを出しています。 そこで質問なのですが、メインのform1(親?)のグローバル変数を、 form2(子?)に渡したいのです。 グローバル変数は初期化時に-1を代入しているのですが、子のダイアログをコール時に親の初期化のところがなぜかコールされてしまい、子に渡すときは-1になってしまいます。 親のソース。グローバル変数はint型のaaaです。 namespace test { public partial class Form1 : Form {     int aaa; public Form1() { InitializeComponent(); aaa = -1; } //ボタンクリック時の関数 private void OpenMenuToolStripMenuItem_Click(object sender, EventArgs e) {       aaa = 0; Form2 f2 = new Form2(); Form2.ShowDialog(); } } } //子のソース、こっちのダイアログをコールする前にpublic partial class Form1 : Formのところが //コールされてaaaには-1が代入されてしまい、bbbに入れるときには-1になってしまいます。 namespace test { public partial class Form2 : Form { public Form2() { InitializeComponent(); Form1 f1 = new Form1(); int bbb = f1.aaa; } } } こういったやり方は普通やらないのでしょうか? 正しい方法、もしくは何か別のものが原因なのでしょうか? 初歩的な質問で申し訳ないですがよろしくお願いします。

  • C# form

    Button _Button = (Button)sender; int but = 0; if (_Button.Name == "button1") { but = 1; } if (_Button.Name == "button2") { but = 2; } if (_Button.Name == "button3") { but = 3; }      //Form2クラスのインスタンスを作成する Form2 f2 = new Form2(this); //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f2.Show(); 上記のようにボタン配列を作成し,クリックイベントを発生させています.そこで押されたボタンにより butに所定の値を入れてこれを,form2において判断値として使用したいのですが,どのようにすれば 良いでしょうか? 昨日から悩んでいるのですが自分だけでは解らないのでご教示願いたいと思います.