C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[2743] Re:[질문]로그온하도록 하는 방법...
박지훈.임프 [cbuilder] 3841 읽음    2000-01-17 00:00
이정희 님이 쓰신 글 :
: 로그온하는 창을 통해 메인화면에 들어도록 하려 합니다..
: 데이터 모듈에 데이터베이스를 놓아 데이터베이스 에디터를 정의(?)하고 나서...
: 새로운 폼을 만들어서...
: 사용자아이디를 Edit1,패스워드를 Edit2라 하고 OK버튼을 누르면
: 메인화면으로 가도록 하려 합니다...
: 어떻게 하면 되련지...
: 어디를 찾아 봐도 없길래..
: 여기에 남기니 잘 가르쳐 주시길 바랍니다...
:



임펠리테리입니다.

질문하시는 의도를 알겠습니다.
원래 빌더로 작성된 프로그램에서는, 가장 먼저 생성되는 폼이 그 프로그램의 메인폼으로 자동으로
등록되도록 되어있습니다. 그러므로 만약 지금 메인폼으로 사용하려고 하는 폼보다 먼저 로그인
다이얼로그를 생성해버리면, 그 로그인 다이얼로그가 메인폼이 되어버립니다.

여기서 메인폼이라는 의미를 한번 짚어보고 넘어갈 필요가 있습니다. 프로그램의 메인폼은 여러
면에서 중요한 의미가 있습니다. 예를 들어, 메인폼을 닫으면 프로그램 자체가 종료됩니다.
또한 메인폼이 아닌 폼을 최소화시킬 경우 프로그램의 다른 폼들은 그대로 있지만, 메인폼을
최소화시키면 프로그램 전체가 최소화됩니다.

사실 별로 어려운 문제는 아닙니다만, 어쨌든 이 문제를 해결하려면 약간은 '깊은' 이해가 필요합
니다. 앞에서 말한, 메인폼이 되는 방법을 좀 더 정확하게 짚어봅시다. 저는 앞에서 그냥 간단히
"가장 먼저 생성되는 폼이 그 프로그램의 메인폼으로 자동으로 등록된다" 라고 말했지만, 좀 더
정확히 말하면, 정적으로, 즉 Application::CreateForm() 메소드로 생성된 폼일 경우에 해당되는
말입니다. 이 Application::CreateForm() 메소드는 프로젝트 자체의 소스(프로젝트이름.cpp)에
나오는 WinMain(), 즉 프로젝트 전체의 메인함수에서 사용되는 것으로, 사용자가 별도의 코딩을
하지 않고도 자동으로 폼이 생성되도록 빌더가 자체적으로 생성해주는 코드입니다. 이 코드를
통해 폼이 생성될 경우, 가장 먼저 생성된 폼이 메인폼으로 등록됩니다.

다시 말하면, 이 메소드, 즉 정적으로 생성하지 않은 폼의 경우에는 이러한 메인폼 지정 메커니즘
의 영향을 받지 않는다는 말입니다. 결론적으로, 메인폼으로 사용할 폼이 Application::CreateForm
() 메소드에 의해 생성되기 전에 이 메소드가 아닌, 즉 일반적인 동적생성 방법을 통해 로그인
다이얼로그를 띄우면, 메인폼은 그대로 메인폼으로 남아있게 되는거죠.

결론적으로, 프로젝트의 소스가 다음과 같은 형태가 되어야 합니다.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Form2 = new TForm2(Application);
         Form2->ShowModal();
         if(Form2->ModalResult == mrCancel)
             return 0;
         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    return 0;
}

여기서는, 로그인 다이얼로그에서 Cancel 버튼을 눌렀을 경우 프로그램을 종료하도록 했습니다.
물론 Form2의 헤더는 인클루드해줘야 하구요.


이 방법이 가장 정확한 방법임에도 불구하고..
좀 복잡하고 어렵지요? 그래서 조금 변칙이긴 합니다만, 더 간단한 방법을 하나 더 소개하죠.
메인폼의 OnShow 이벤트 핸들러를 만들어서, 다음과 같이 코딩하세요.
void __fastcall TForm1::FormShow(TObject *Sender)
{
    Form2->ShowModal();
    if(Form2->ModalResult == mrCancel)
        Application->Terminate();
}

물론 이 경우에도 Form2를 동적으로 생성할 수 있습니다만, 코딩을 최대한 줄여보고자 하는
열망에서(?) 잔머리를 굴린 것이므로 정적으로 생성한다고 가정한 것입니다.
이 방법에서는 메인폼이 이미 생성된 상태에서, 메인폼이 보여지기 직전에 로그인 폼을 보여준
것입니다.

두가지 모두 정상적으로 동작합니다. 차이는, 두번째 방법의 경우 이미 메인폼이 생성된 후
보여지기 직전에 로그인 폼을 보여주고 틀릴 경우 강제로 종료하는 것이므로, 아무래도 정상적인
방법인 첫번째 방법에 비해 조금은 불안할 수도 있다는 것입니다. 물론 프로그램이 아주 크거나
해서 전체 컴퓨터에 영향을 많이 줄 경우에나 그런 불안한 결과를 볼 수 있을 거구요.

그럼 참고하시길...

+ -

관련 글 리스트
2725 [질문]로그온하도록 하는 방법... 이정희 3499 2000/01/14
2743     Re:[질문]로그온하도록 하는 방법... 박지훈.임프 3841 2000/01/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.