Delphi나 C++Builder에서 Form을 Wizard로 생성하면
*.dfm파일이 소스(*.pas 또는 *.cpp , *.h) 와 함께 생성됩니다.
이 dfm파일은 컴파일하면서 프로그램에 리소스로 함께 묶이게 되죠
VCL에서는 폼의 생성자에 이정보를 읽어와서 Form위에 올려진 Component들과 이벤트 등을 생성해주는것입니다.
그런데 *.dfm 파일이 없이 Form을 생성할수 있을까요?
TForm3를 *.dfm 파일없이 아래와 같이 코딩했습니다.
class TForm3: public TForm
{
public:
__fastcall TForm3::TForm3(TComponent* Owner){};
};
그리고 아래처럼 생성하면 어떻게 될까요?
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TForm3 *frm=new TForm3(this);
frm->ShowModal();
delete frm;
}
그러면
*** EResNotFount with message 'Resource TForm3 not found' ***
위와같은 에러 메세지가 뜨죠..
TForm3에 대한 리소스를 못찾겠다나 뭐라나....
그러면 Delphi나 C++Builder에서 TForm을 상속받은 폼을 코딩으로 생성할 방법은 없는것인가?
그것은 TForm의 두번째 생성자인
TForm(Classes::TComponent* AOwner, int Dummy) 형태의생성자를 이용하면 됩니다.
이 생성자에서는 리소스를 찾아서 동적으로 폼위의 컨트롤을 만들고 이벤트를 만들고 하는 부분이 생략되어있습니다.
그러므로 아래와 같은 형태로 class를 코딩하면 *.dfm 파일이 없이
폼을 만들수 있습니다.
class TForm3: public TForm
{
public:
__fastcall TForm3::TForm3(TComponent* Owner);
void __fastcall TForm3::FormCreate(TObject *Sender);
};
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner,1) //==> 핵심.. 생성자에서 TForm의 두번째 생성자를 호출하도록 합니다.
{
this->OnCreate=FormCreate;
}
void __fastcall TForm3::FormCreate(TObject *Sender)
{
ShowMessage("Form3의 OnCreate가 제대로 호출되는가?");
}
그럼...
|