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 |