1. ホーム
  2. c#

Application.Run()とForm.ShowDialog()の違いは何ですか?

2023-12-18 03:12:52

質問

私のアプリケーションでは、最初にログインフォームを表示し、ログインが成功した場合にメインフォームを表示したいと考えています。現在、私はこのようなことをやっています。

var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
    Application.Run(new MainForm());

しかしその後、私は疑問を持ち始めました。 Application.Run() ? なぜ、単に (new MainForm()).ShowDialog() にもしないのですか?何が違うのでしょうか?そして、私が望むことを実現するための正しい方法は何でしょうか?

どのように解決するのですか?

Application.Run(Form) は、現在のスレッドでメッセージループを開始し、指定されたフォームを表示します。メッセージループは、フォームが Windows メッセージ (例: キーの押下、マウスのクリック、ペイントの無効化) を受信して、応答するように見せ、ユーザーと対話できるようにするものです。このため ShowDialog() を呼び出すと Form インスタンスでモーダルメッセージループを作成します。 ShowDialog が呼び出されたフォームに対してモーダルメッセージのループを作成します。

2つの呼び出しの間に大きな違いはありません。 Application.Run は、メインフォームが閉じられたときにリソースの整理をするための特別なイベント処理を追加します ( Application.ThreadExit ).

WinForms アプリケーションを開始する推奨される方法は Application.Run を使うことですが、私はこれが規則というよりも慣習であると信じています。を使用する最大の理由は Application.Run を使う最大の理由は、複数の非モーダルなフォームを開きたい場合です。これを使うことができます。

new Form().Show();
new Form().Show();
Application.Run();

を使って実現することはできませんでした。 ShowDialog() メソッドを使用してこれを実現することはできません。


ログインフォームを表示し、ログインに成功したらメインフォームを表示する方法というご質問ですが、今のままで問題ないと思います。

if (new LoginForm().ShowDialog() == DialogResult.OK)
{
    Application.Run(new MainForm());
}

もうひとつの方法は、自分で配管を行い MainForm の終了イベントで LoginForm の終了イベントで、ログインに成功した場合に表示されます。