<양병규>
아래 게시물의 예제를 만들던중 사용된건데 별도로 따로 설명합니다.

폼은 보통 TForm을 상속하게 됩니다.

보통은 폼디자이너를 이용해서 만들게되는데....

그렇지 않고 콤포넌트 만들듯이 그냥 새 유닛에서 TForm을 상속해서 새로운 폼 클래스를 작성하면...

컴파일은 잘되나 실행해보면 dfm 리소스가 없다고 에러가 납니다.

폼디자이너를 사용하지 않고 TForm을 상속해서 코딩으로만 폼을 만들고자 할때는 다음과 같이 하면됩니다.



생성자를 override해서 다음과 같이 작성합니다.


type
  TForm1 = class(TForm)
  private
  publiuc
    constructor Create(AOwner: TComponent); override;
  end;

constructor TForm1.Create(AOwner: TComponent);
begin
  CreateNew( AOwner );
end;



중요한건 생성자에서 inherited를 하지 않고 CreateNew를 호출한다는겁니다. 물론 생성자에서 CreateNew 다음 라인부터는 원하는 일을하면 됩니다.

이렇게 하면 실행시에 dfm 리소스를 로딩하지 않습니다.

그러므로 dfm 없이 그냥 코딩으로만 폼을 디자인할 수 있습니다. 폼에 얹을 모든 콤포넌트의 생성, 소멸, 프로퍼티 세팅, 이벤트 세팅을 모두 일일이 코딩해야합니다.

물론 나머지는 모두 동일합니다.

이걸 꼭 사용해야만 하는 경우는 별로 없습니다. 간단한 폼인데 exe에 dfm리소스가 포함되는게 아깝다고 생각되는 경우에는 쓸수 있을겁니다.

^^



<장성호>
해결했습니다. 간단하네요...

생성자에서
TForm(Owner)로 상위 클래스생성자를 호출하는 부분에서
인자를 바꿔 다른 생성자를 불러주면 되네요
Delphi에서는 CreateNew로 표현되던데 ....

---------샘플-----------------------
class TForm3 : public TForm
{
public:
    __fastcall TForm3(TComponent* Owner);
};
//------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner,1)                                                         //===> 이부분이 핵심
{
    this->Caption="Form3";
}
//====================================

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    TForm3 *frm3=new TForm3(this);                               //실제사용하는 부분
    frm3->ShowModal();
}
//---------------------------------------------------------------------------

TForm(Owner)  ==> TForm(Owner,1)     이렇게 호출하면 됩니다.  쩝쩝


그럼 즐플...



장성호 님이 쓰신 글 :
: 델파이로는 간단히 생성자 오버로딩으로 되던데.. (델마당에 팁이 있음)
:
: 똑같은 방법으로 잘 안되네요
:
: 어떻게 해야할지....