Q&A

  • 동적 Form 생성에 관한 Error......해결 좀 부탁 합니다.
어려운 고민좀 부탁 드립니다.......



TForm1 은 Available Form 입니다.

폼은 찾는데 Create 에서 Error 가 나는군요..

부탁 드립니다.



procedure TMainForm.menuClick(Sender: TObject);

var

FormClass :TFormClass;

begin



FormClass := TFormClass(FindComponent('TForm1'));

openForm(FormClass);



end;

.

.

.

.

.

.

Procedure TMainForm.OpenForm(FormClass:TFormClass);

var

I:Integer;

Form:TForm;

begin

Form := nil;

For i := 0 to Application.ComponentCount - 1 do

if Application.Components[i].ClassType = FormClass then

Form := (Application.Components[i] as FormClass);



Form := Formclass.Create(Application);

Form.Show;



end;





1  COMMENTS
  • Profile
    최용일 2001.02.09 22:48
    안녕하세요. 최용일입니다.



    클래스 메소드에 대한 이해가 약간 부족하신거 같습니다...



    FindComponent메소드는 현재 소유하고 있는(이미 생성되어 있는) 컴포넌트의 인스턴스를



    돌려줍니다. 그러니까 TForm1이 Available Form이니까 TForm1이 이미 생성되어 있지 않



    으면 아래 구문은 nil을 반환합니다. 생성되어 있다 하더라도 Owner가 TMainForm이 아니



    라 Application이어도 역시 nil을 반환하죠. TMainForm.FindComponent를 호출했으니까요



    또하나 인자에는 클래스이름이아니라 인스턴스 이름이 들어가야합니다. TForm1이 아니라



    Form1이 들어가야죠...



    > FormClass := TFormClass(FindComponent('TForm1'));



    아마도 하실려는 일이 메타클래스로부터 폼을 생성하실려는거 같은데 아래와 같이 하세요...



    procedure TMainForm.FormCreate(Sender: TObject);

    begin

    RegisterClass(TForm1); // TForm1 메타클래스(class-reference type) 등록

    end;



    procedure TMainForm.MenuClick(Sender: TObject);

    var

    FormClass :TFormClass;

    begin

    FormClass := TFormClass(GetClass('TForm1'));

    OpenForm(FormClass);

    end;



    procedure TMainForm.OpenForm(FormClass: TFormClass);

    var

    Form: TForm;

    begin

    Form := Formclass.Create(Application);

    Form.Show;

    end;



    ^^ 항상 즐코하세요...



    정종수 wrote:

    > 어려운 고민좀 부탁 드립니다.......

    >

    > TForm1 은 Available Form 입니다.

    > 폼은 찾는데 Create 에서 Error 가 나는군요..

    > 부탁 드립니다.

    >

    > procedure TMainForm.menuClick(Sender: TObject);

    > var

    > FormClass :TFormClass;

    > begin

    >

    > FormClass := TFormClass(FindComponent('TForm1'));

    > openForm(FormClass);

    >

    > end;

    > .

    > .

    > .

    > .

    > .

    > .

    > Procedure TMainForm.OpenForm(FormClass:TFormClass);

    > var

    > I:Integer;

    > Form:TForm;

    > begin

    > Form := nil;

    > For i := 0 to Application.ComponentCount - 1 do

    > if Application.Components[i].ClassType = FormClass then

    > Form := (Application.Components[i] as FormClass);

    >

    > Form := Formclass.Create(Application);

    > Form.Show;

    >

    > end;

    >

    >