VCL(Delphi 또는 C++BUilder) 에서는
시스템 큐에서 Message를 가져와서(GetMessage or PeekMessage)
해당 윈도우프로시져로 Despatch 해주는 루프가 Application 객체에서 담당하고 있습니다.
그런데 Application에서는 MainForm이 Close되면 프로그램을 종료하도록 되어있습니다.
그럼 메인폼은 어떻게 결정될가요?
Application->CreateForm(...); 이런식으로 맨먼저 생성되는 Form이 메인폼이 됩니다.
C++Builder 같은 경우 Projectxx.cpp 파일에 보면
WinMain이 있는데
여기서 Application->CreateForm(..) 으로 맨먼저 생성하는 폼이 메인폼이 됩니다.
결론적으로
VCL에서는 Application->MainForm이 Close되면 어플리케이션 자체가 종료되기때문에
메인폼은 프로그램 끝날때까지 Close하지 말아야 합니다.
음.. 님의 경우에는
Form2를 먼저 띄우는데 Form2가 먼저뜨면 Form2가 메인폼이 되기때문에...
문제가 발생한듯 합니다.
Projectxx.cpp 의
WinMain에서
Form2를 Create하여 ShowModal을 먼저 하는것이 좋을것 같습니다.
문론 Form2를 Create할때 Application->CreateForm 생성하지 마시고
그냥 new를 사용해서 생성해야 하구요...
대충 다음과 같이...
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
TForm2 *frm2=new TForm2(Application);
frm2->ShowModal();
// Application->CreateForm(__classid(TMainForm), &MainForm);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
그럼...
Terry 님이 쓰신 글 :
: 메인폼에서 셋팅을 하고 확인버튼을 누르면
: 하위 폼이 생성되도록 프로그램을 만들고 있습니다.
: 확인 버튼을 누르면 메인폼을 종료시키고 하위폼만 작동되게 하고싶은데
: 메인폼을 Close시켜버리면 하위폼까지 죽어버리더군요
: 좋은 방법이 없을까요?
:
: void __fastcall TForm2::Button1Click(TObject *Sender)
: {
: Application->CreateForm(__classid(TMainForm), &MainForm);
: MainForm->ShowModal();
: Close():
: }
: //---------------------------------------------------------------------------