質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

14052閲覧

C#のMessageBoxが表示される条件のようなものはあるのでしょうか?

GiveAHand

総合スコア286

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/07/29 10:13

編集2016/07/31 12:54

今まで何気なくMessageBoxを使っていて、表示されなかったケースというのが一度も無かったのですが、今作成しているプログラムでオブジェクトのイベントではない、関数内でMessageBoxを書くと、表示されないので、どうしてなのか理由がわからず悩んでいます。

例えば、ボタンクリックイベント内で、

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 MessageBox.Show("こんにちは。"); 4 return; 5}

このような書き方であれば、メッセージボックスは出ます。

しかしながら、

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 function(); 4 return; 5} 6 7private void function() 8{ 9 MessageBox.Show("こんにちは。"); 10 return; 11}

こんな感じで、処理を関数にして、関数内でメッセージボックスを呼ぶと、エラーにはなりませんが、メッセージが出ません。

これは何故でしょう?

また、いろいろ調べたところ、ソースの中で、webBrowserをnewしているのですが、このwebBrowserのnewをしなければ、メッセージボックスはきちんと表示される事がわかりました。

また、webBorwserをnewしても、メッセージボックスを2回連続でshowすると、2回目は表示される事がわかりました。

ちなみに、こんな風にです。

C#

1private void function() 2{ 3 4 // webBrowserのサブクラスを作成し、インスタンス化 5 int iRet = webBrowser1.NavigateAndWait(); 6 7 DialogResult result; 8 result = MessageBox.Show("こんにちは。"); // これは表示されない 9 result = MessageBox.Show("こんばんは。"); // これは表示される 10 11 return; 12}

また、表示されないメッセージボックスのresultには、値は"NO"になっており、表示される方は、"OK"になっています。

また、使っているのは、Visual Studio Comunity 2015で、OSは、Wndows 7です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/29 14:37

自分も普通に表示されそうな気がしますが環境依存のものがなにかあるかもしれないので詳細に環境(.netのバージョン、wpfか否かetc.)を書いてみたらどうでしょう。
GiveAHand

2016/11/12 01:26

返信大変遅くなりましてすいません。環境はVisualStudio2015です。
guest

回答3

0

ベストアンサー

これだけではわかりません。問題が再現する最小の完全なソース(省略の無いソース)を提示していただけますか?

今再現しているもののソース全文ではありません。あくまでも問題が再現する最小のソースの全文です。

投稿2016/07/30 00:29

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/07/31 12:56

Zuishin様 ご回答ありがとうございます。 再現する最小のソースを質問欄に追記致しました。 いろいろ試した結果、ソース内で、サブクラス化したwebBrowserをnewするとメッセージボックスが表示されなくなる事がわかりました。
Zuishin

2016/07/31 13:16 編集

あとわざわざ「完全なソース(省略のないソース)」と言ったのは、問題となる部分を省略して欲しくなかったからです。今回はこの WebBrowser から派生したクラスに問題があることが明白なので、とりあえずこのクラスを小さく削って、再現する最小のソースにしてもらえますか?
Zuishin

2016/07/31 13:17

さらに言うならこれ、メモリリークがあるのでやめたほうがいいとアドバイスしたものじゃありませんか?
Zuishin

2016/07/31 13:21

ここまで書いてもう一つ思い当たったことがあります。 メッセージボックスのオーナーが件の WebBrowser (非表示・画面外)になっているために表示されていないのかもしれません。 メッセージボックスのオーナーをフォームに明示的に指定して試してみてください。 MessageBox.Show(form1, "こんにちは");
GiveAHand

2016/11/12 01:33

Zusishin様 お返事が大変遅くなりましてすみません。 あれからバタバタしてしまい未解決のままですが、 MessageBox.Show(form1, "こんにちは"); こちら、まだ試していないのですが、 今、この件から既に退いてしまっていますので、 実際に試してみたらまたご連絡させて頂きます。 いつも、親身になって回答下さり、ありがとうございます。
tetsu123

2017/03/15 18:44

私も同じような状況になっていましたが、Zuishinさんが指摘されているようにvisibleをfalseにしていたことが原因でした。(私の場合はformのvisibleをfalseにしていました) visibleをいじっていたらそこらへんを見てみると良いかもしれません。
guest

0

提示コードで出ます。
ステップ実行するなりでそもそもShow()に辿り着いているか
確認してみてください。

投稿2016/07/29 10:26

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/07/29 11:01

ozwk様 そうなんですか? ステップ実行で確かにshowにたどり着いていますが、 確かに表示されません。。。
ozwk

2016/07/29 11:52

試しにShow()の戻り値を受け取って直後に標準出力にでも出力してみては?
GiveAHand

2016/07/31 12:15

ozwk様 戻り値というのは、 DialogResult result; result = MessageBox.Show("こんにちは"); このようにしてみると、resultに"No"が入っていました。 また、不思議な事に、 DialogResult result; result = MessageBox.Show("こんにちは"); result = MessageBox.Show("こんばんは"); と、MessagBoxを2つ連続させると、2回めである「こんばんは」の方はメッセージボックスが出力される事がわかりました。 また、プログラム中でwebBrowserのサブクラスをnewしているのですが、これをやめるときちんとメッセージボックスが表示される事がわかりました。 でも、なぜこのようになってしまうかはわかりません。
GiveAHand

2016/07/31 12:22

ちなみにですが、メッセージボックスを2つ連続した場合、何故か最初のメッセージボックス(表示されない方)の戻り値が"NO"で、次のメッセージボックスの戻り値(表示される方)は"OK"です。 そもそもメッセージボックスでOKもNOも何も選択していないのに、これは一体どういうことなのでしょう?
guest

0

掲示されたコードだと普通に表示されそうですが…
試しにfunction呼び出し前後でもMessageBox.Showを行ってみては?

それでfunction内のものだけダイアログが表示されないのなら関数化した際に何らかの要因で出ないということなんでしょう。

ちなみにMessageBox.Showの部分でブレークポイント貼ってきちんと止まりますか?

ビルド情報が古くなっているとか何かでヒットしなくなってる(ブレークポイントで止まらない)とかないですか?

投稿2016/07/29 17:08

Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/07/31 12:46

KotoriMaturi様 アドバイスありがとうございます。 >試しにfunction呼び出し前後でもMessageBox.Showを行ってみては? はい。 いろいろやってみたところ、処理の中のwebBrowserのnewをしなければ、メッセージボックスは表示されることはわかりました。 また、webBrowserをnewしても、メッセージボックスの表示を2回連続で行うと、なぜか2回めは表示される事がわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問