Application.Run ()과 Form.ShowDialog ()의 차이점은 무엇입니까?
내 응용 프로그램에서 먼저 로그인 양식을 표시하고 로그인이 성공하면 기본 양식을 표시하고 싶습니다. 현재 나는 다음과 같이하고 있습니다.
var A = new LoginForm();
if ( A.ShowDialog() == DialogResult.OK )
Application.Run(new MainForm());
그러나 나는 궁금해하기 시작했습니다 Application.Run(). 왜 잘하지 (new MainForm()).ShowDialog()않습니까? 차이점이 뭐야? 그리고 내가 원하는 것을 달성하는 올바른 방법은 무엇입니까?
Application.Run(Form)현재 스레드에서 메시지 루프를 시작하고 지정된 양식을 표시합니다. 메시지 루프를 사용하면 폼이 Windows 메시지 (예 : 키 누름, 마우스 클릭, 페인트 무효화)를 수신하여 응답하는 것처럼 보이고 사용자와 상호 작용할 수 있습니다. 당신이 호출 할 때 ShowDialog()A의 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입니다.
MSDN에서 :
이 메서드는 Closed 이벤트에 대한 mainForm 매개 변수에 이벤트 처리기를 추가합니다. 이벤트 핸들러는 ExitThread를 호출하여 애플리케이션을 정리합니다.
http://msdn.microsoft.com/en-us/library/ms157902.aspx
내 테스트에서 다음과 같은 주요 차이점을 발견했습니다.
Application.Run을 사용하면 양식의 닫기 단추 (빨간색 X)가 DialogResult.None을 반환합니다. 그러나 ShowDialog를 사용하는 경우 닫기 단추는 DialogResult.Cancel을 생성합니다.
이것이 당신에게 중요합니까? 내 코드에서 DialogResult.Cancel을 테스트하여 응용 프로그램의 종료 코드를 확인했습니다. 빨간색 X가 양식을 닫는 데 사용되었을 때 깨졌습니다. 이제 성공적인 종료를 나타 내기 위해 DialogResult.OK를 테스트합니다.
return myForm.DialogResult == DialogResult.OK ? 0 : 1;
한 가지 주요 차이점은 ShowDialog가 일반적으로 모달 대화 상자라는 것입니다. 사용자에게 친숙한 도구 집합을 만들려면 모달 대화 상자로 구성하지 않는 것이 좋습니다.
또한 Application.Run ()은 단순한 양식 이상을 허용합니다. 몇 가지 과부하가 있습니다.
귀하의 신청에 관해서는 그다지 중요하지 않다고 생각합니다. Application.Run은 실제 응용 프로그램의 시작을 나타 내기 때문에 나에게 의미가 있습니다.
public static void Run(
ApplicationContext context );
두 가지 형식을 포함하는 다른 접근 방식의 깔끔한 예가 있습니다.
차이점에 대한보다 구체적인 예를 보려면 :
기본 양식이 MDI 양식 인 경우 닫기 버튼 (오른쪽 상단의 'x'또는 Alt-F4)을 클릭 할 때의 동작은 양식을 표시하는 데 사용하는 방법에 따라 다릅니다.
를 사용하면 Application.Run(mainForm)자식 양식의 닫기 이벤트가 실행되고 기본 양식의 닫기 이벤트가 실행됩니다.
를 사용하면 mainForm.ShowDialog기본 양식의 닫기 이벤트가 실행되고 자식 양식의 닫기 이벤트는 실행되지 않습니다.
Application.Run()은 응용 프로그램의 MainForm일부이며 MainForm()).ShowDialog()표시하는 데만 사용됩니다.
Application.Run()는 entry point귀하의 응용 프로그램에 대한. Main()일부 클래스 또는 ApplicationStart()WebApplication에 대한 메서드 와 동일
Application.Run () 에는 다른 오버로드가 있으며 그중 하나는 매개 변수가 없습니다. 이 방법은 초기 양식없이 신청을 시작합니다.
내 테스트에서 DialogResult와 함께 Application.Run 버튼을 사용하면 DialogResult가있는 버튼이 OnFormClosing을 누르고 양식을 닫는 ShowDialog와 비교할 때 양식이 닫히지 않습니다 (OnFormClosing이 맞지 않음).
'Program Tip' 카테고리의 다른 글
| 표면과 질감의 차이 (SDL / 일반) (0) | 2020.11.05 |
|---|---|
| Docker Compose 버전 3에서 메모리 및 CPU 제한을 지정하는 방법 (0) | 2020.11.05 |
| Python 클래스 정의 구문 (0) | 2020.11.05 |
| ": $ {foo = value}"의 콜론 연산자 설명 (0) | 2020.11.05 |
| IEnumerable의 폐기를 고려해야합니까? (0) | 2020.11.05 |