Program Tip

Application.Run ()과 Form.ShowDialog ()의 차이점은 무엇입니까?

programtip 2020. 11. 5. 18:54
반응형

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이 맞지 않음).

참고 URL : https://stackoverflow.com/questions/2314514/whats-the-difference-between-application-run-and-form-showdialog

반응형