これ何て呼びますか Part2

VS2013 Comunity C#を使っています。
起動後のフォームを非表示にした後、何らかのイベントでフォームを表示させようとしています。
マイクロソフトの以下の頁を参考にしたら、うまくいったのですが、
//-----------------------------------------------------------------
方法 : スタートアップ Windows フォームを非表示にする
https://msdn.microsoft.com/ja-jp/library/754w18d …
//-----------------------------------------------------------------

次のサイトには、「System.Windows.Forms.Loadイベントは一度だけとは限らない」と書いてあります。
http://d.hatena.ne.jp/Kazzz/20070913/p4

今後、プログラムを作っていったときに、都合が悪くならないように以下のようにShow()を使うように書き換えたのですが、メッセージボックスのOKを押した後、フォームを表示せずに終了してしまいます。
なぜなんでしょうか?
書き換える前にはフォームは正常に表示されます。
//********************************************
class MainApplication
{
public static void Main()
{
// Form1 f1 = new Form1();//MS code
Form1 f1 = new Form1();//変更
System.Windows.Forms.MessageBox.Show("The application "
+ "is running now, but no forms have been shown.");
f1.Text = "Running Form";

// f1.ShowDialog();//MS code
f1.Show();//変更

}
}
//*******************************************

質問者からの補足コメント

  • うーん・・・

    すばやい回答ありがとうございます。

    >ということで、やりたいことはなんですか?
    何らかのイベントでフォームを表示させ、各種の設定をしようとしています。

    書かれていることが難しいので、じっくりと読んでみます。
    でも、要するにShowでは簡単にはできないということですね。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/07/09 10:40
  • うーん・・・

    >ということは、コンソールアプリケーションで作成したのでしょうから、プログラムを起動するとコ>マンドプロンプトが開いたりしませんか?

    「Windows フォームアプリケーション」で作成しています。
    まず、起動時にフォームを表示するアプリケーションを作成した後、イベントで開くように変更するため、前述のMSのサイトのC#プログラムをコピーし、サイトに書かれた手順で起動時にはフォームを表示しないようにしました。
    コマンドプロンプトも開いていないようです。

    とりあえず、ShowDialogで作ってみます。
    ありがとうございます。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/07/09 13:29

A 回答 (2件)

>メッセージボックスのOKを押した後、フォームを表示せずに終了してしまいます。



表示した瞬間にプロセスが終了したのでしょう。

>// f1.ShowDialog();//MS code

https://msdn.microsoft.com/ja-jp/library/c7ykbed …
『 このメソッドが呼び出されると、次に続くコードは、ダイアログ ボックスが閉じるまで実行されません。』
ということで、ダイアログ(フォーム)を閉じるまでそこから先(Main()の終わり)までは進みません。

>f1.Show();//変更

『表示』するだけです。
表示に関して関連するコードは実行されるでしょうが、それだけです。
https://msdn.microsoft.com/ja-jp/library/39wcs2d …

フォーム上のコントロールに対しての操作を継続することもできません。
で、「表示した後、即プロセス終了」ではフォームに対して強制的に閉じる処理が呼び出されるかと思われます。
# フォームのデストラクタが呼ばれる…でしょうね。


ということで、やりたいことはなんですか?
f1.Show()でなければならないのであれば、それ相応の処理を自前でやる必要がありますが…。
# C#でメッセージループを処理…ですかね?
この回答への補足あり
    • good
    • 0

>何らかのイベントでフォームを表示させ、各種の設定をしようとしています。



フォームの初期状態を非表示にしておく…とか。
もっとも、「Windows フォームアプリケーション」で作成しないと「なんらかのイベント」の受信もできませんが。

>public static void Main()

ということは、コンソールアプリケーションで作成したのでしょうから、プログラムを起動するとコマンドプロンプトが開いたりしませんか?
# バッチファイル中から起動などの「既存のコマンドプロンプトから起動」であれば問題ないでしょうけども。
# 無限ループ(実際には適当にSleep()?して、なんらかの通知を待つ…ことになるでしょうけど、その場合でもコンソールアプリケーションが適しているかは微妙ですかね)

Windowsの各種リソースの観点からすると…
必要になった時にそのフォームを開くべきかと思われます。
# 「(各種初期化の時間も惜しんで)即座に開く」という需要でないのなら。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A