Каково различие между Приложением. Выполненный () и Форма. ShowDialog ()?

В моем приложении я хочу показать, что вход в систему формируется сначала и затем основная форма, если вход в систему был успешен. В настоящее время я делаю его что-то вроде этого:

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

Но тогда я начал задаваться вопросом - какой смысл Application.Run()? Почему не просто делают (new MainForm()).ShowDialog() также? Каково различие? И каков был бы корректный способ достигнуть того, что я хочу?

70
задан Vilx- 22 February 2010 в 21:52
поделиться

4 ответа

Application.Run (Form) запускает цикл сообщений в текущем потоке и отображает указанную форму. Цикл сообщений позволяет форме получать сообщения Windows (например, нажатия клавиш, щелчки мыши, недействительность рисования), чтобы она выглядела отзывчивой и взаимодействовала с пользователем. Когда вы вызываете ShowDialog () в экземпляре Form , он фактически делает то же самое и создает модальный цикл сообщений для формы, в которой был вызван ShowDialog .

Между этими двумя вызовами нет большой разницы. 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 , если вход был успешным.

66
ответ дан 24 November 2019 в 13:30
поделиться

Из MSDN:

Этот метод добавляет обработчик событий к параметру mainForm для события Closed . Обработчик событий вызывает ExitThread для очистки приложения .

http://msdn.microsoft.com/en-us/library/ms157902.aspx

5
ответ дан 24 November 2019 в 13:30
поделиться

Одно из ключевых различий заключается в том, что ShowDialog обычно является модальным диалоговым окном. Если бы вы хотели создать удобный для пользователя набор инструментов, вы бы не хотели, чтобы он состоял из модальных диалоговых окон.

Кроме того, Application.Run() принимает не только форму. У него есть несколько перегрузок.

Что касается вашего приложения, я не думаю, что это имеет большое значение. Application.Run имеет смысл, потому что он обозначает запуск вашего реального приложения.

2
ответ дан 24 November 2019 в 13:30
поделиться

Стоит ли этого только в том случае, если ваш проект является долгосрочным и на его реализацию потребуется много времени. Это, конечно, мнение здесь, но я не нашел запутанный .NET DLL еще не смог выяснить, что происходит с помощью только Reflector.

Это сдерживающий фактор , не более того. Если стоимость обратной разработки вашего кода больше, чем стоимость реализации его самим, это единственный законный случай, который я вижу для него, но если кто-то хочет увидеть, как ваш код галочки, это не очень хорошо в предотвращении этого.

Один распространенный случай, который я вижу, это то, как вы производите и/или расшифровываете лицензионный ключ. Любой, кто мотивирован разобраться в этом и копать в отражателе для вас соли/методы расшифровки не будет остановлен обфускации, я бы осмелился сказать, что это на самом деле не замедлит их.

-121--2379074-

Краткий ответ, да.

Долгий ответ, вы должны определить, что копия в вашем случае на самом деле означает по отношению к списку. Вам также нужна копия содержимого списка? Для типов значений, таких как ints, его довольно прямо вперед, если это были ссылочные типы, хотя.... у вас есть некоторые вопросы относительно того, что вы хотите ваш список, чтобы содержать.

-121--4195902-

Application.Run () предназначен для запуска приложения, в то время как MainForm является частью приложения и MainForm ()) .ShowDialog () используется только для его отображения.

Application.Run () - это точка входа для вашего приложения. аналогично методу Main () для какого-либо класса или StartStart () для приложения WebApplication

Application.Run () имеет различные перегрузки, одна из которых не имеет параметров. Этот метод начинает применение без первоначальной формы.

1
ответ дан 24 November 2019 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: