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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[954] [퀴즈] vcl 객체 생성 방법의 차이는?
장성호 [nasilso] 8669 읽음    2010-02-24 03:07
아래에 두가지 Form클래스의 인스턴스 생성방법이 있습니다.

두방법에 차이점을  2가지 이상 찾아보세요

//방법1 
    Application->CreateForm(__classid(TmyForm), &myForm);


//방법2
    myForm = new TmyForm(Application);
Frigate [devilica]   2010-02-24 15:17 X
저는 빌더와 델파이가 같은 구조를 쓴다는 전제하에 양쪽 소스를 비교하면서 파악했습니다.
두 방법 모두 TmyForm 클래스를 이용하여 myForm이라는 폼객체를 생성시키는 것은 동일하나
방법1의 경우 TApplication 클래스에서 MainForm의 생성여부를 검사해서 생성되어있지 않을경우 MainForm으로 설정해주고 TaskBar에 등록을 합니다. 메인폼으로 등록이 될 경우 프로그램이 종료될때까지 소멸되지 않으며, 다른 클래스에서 메인폼을 종료시킬 경우에프로그램이 종료되게 됩니다. 만약 Application클래스의 Run메소드 실행 전 메인폼이 등록되지 않을경우 프로그램은 메세지 루프를 그냥 빠져나가게 됩니다.
반면, 방법2로 생성된 폼은 메인폼으로 등록되지 않으며 그 객체를 소멸하거나 Close메소드를 사용한다고 하더라고 프로그램이 종료되지는 않습니다.
차이점이 더 있을것 같습니다.  혹시 아시는분이 있으면 부탁드립니다.
장성호 [nasilso]   2010-02-24 15:59 X
네..
빌더에서도 VCL은 Object-Pascal로 되어있습니다.
같은 버젼인경우에 delphi랑 빌더의 vcl소스가 같다고 보시면 됩니다.

음 그리고 말씀하신 대로
   Application->CreateForm 으로 폼을 생성하면 
   Application->MainForm이 없을경우 생성된 폼이 메인폼이 되죠

맞습니다. 제가 생각한것중 하나입니다.

또 없을까요?
  
이길남.HoPe [miru0418]   2010-02-25 10:07 X
Application->CreateForm은 생성자 호출을 TComponet의 생성자를 호출하게 됩니다.
하지만, TComponet의 생성자가 virtual이기 때문에 Form의 생성자를 호출하게 됩니다.
그리고 new는 바로 Form의 생성자를 호출하게됩니다.

아는 동생과 의논하다가 찾은건 new를 쓸경우 Form의 생성자가 없으면 문제가 발생되고,
craeteform을 호출하면 Form의 생성자가 없으면 어짜피 TComponet의 생성자를 호출하게 됨으로 문제가 발생되지 않습니다.

이게 맞는지는 잘 모르겠지만...제 생각입니다. *^^*
장성호 [nasilso]   2010-02-25 11:55 X
와우~! 정말 그렇게요!  고건 몰랐던 사실입니다.

Application->CreateForm으로 폼을 생성하면 Form의 생성자 없이도 폼을 생성할수가 있네요

class TForm2 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
//    __fastcall TForm2(TComponent* Owner); //생성자 삭제하구..
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Application->CreateForm(__classid(TForm2),&Form2);
    if(Form2)Form2->ShowModal();
}

제가 모르는것 또 어떤것이 나올까 기대가 되네요
아루스 [tinydew4]   2010-07-19 14:46 X
메인 폼 등록하기 전에 HandleNeeded 프로시저로 핸들을 만들게 되니 조금 일찍 핸들이 만들어 지는 것도 다른 점 이겠죠?

+ -

관련 글 리스트
954 [퀴즈] vcl 객체 생성 방법의 차이는? 장성호 8669 2010/02/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.