Q&A

  • 폼이름으로 폼을 생성하려면...?
폼 이름을 알고 있을 때 폼을 생성할 수 있을까요?



즉, 내가 생성해야 할 폼이 TMyForm 타입의 폼이라고 할 때

"TMyForm"이라는 문자열로부터 실제 클래스 객체를 만들 수

있을까에 대한 것입니다.



왠만한 곳은 다 찾아봤는데 RTTI와 관계가 있다는 것 말고

실제 구현해놓은 예제 코드는 찾아보기가 힘드네요.



그런 방법이 있다면 한번쯤 구현해볼만한 주제가 아닌가

생각됩니다.



델파이 고수들의 도움 바랍니다.

6  COMMENTS
  • Profile
    홍효선 1999.11.02 05:03
    올려 놓으신 글을 참고로

    아래와 같이 폼이름으로 폼을 생성하는 프로시져를 만들고져 합니다.



    procedure Proc_LoadForm(pTForm:string; pForm: TForm);

    var

    newClass: TPersistentClass;

    begin

    if pForm = nil then

    begin

    RegisterClass(TPersistentClass(pTForm)); // Error

    newClass := GetClass(pTForm);

    Application.CreateForm(TComponentClass(newClass), pForm);



    pForm.Show;

    Exit;

    end;

    pForm.WindowState := wsNormal;

    pForm.Show;

    end;



    근데 윗 부분의 "Error"라고 표시 한곳에서 에러가 발생 하던데

    어떤 문제가 있는지 좀 봐주세요....?



    개선할 점이 있다면 좀 제시해 주시면 감사하겠습니다.



    이상호 wrote:

    > 폼 이름을 알고 있을 때 폼을 생성할 수 있을까요?

    >

    > 즉, 내가 생성해야 할 폼이 TMyForm 타입의 폼이라고 할 때

    > "TMyForm"이라는 문자열로부터 실제 클래스 객체를 만들 수

    > 있을까에 대한 것입니다.

    >

    > 왠만한 곳은 다 찾아봤는데 RTTI와 관계가 있다는 것 말고

    > 실제 구현해놓은 예제 코드는 찾아보기가 힘드네요.

    >

    > 그런 방법이 있다면 한번쯤 구현해볼만한 주제가 아닌가

    > 생각됩니다.

    >

    > 델파이 고수들의 도움 바랍니다.

  • Profile
    이상호 1999.09.04 18:11
    답변을 올려주신 두분께 감사드립니다.



    하지만 아직 제가 원하는 해결책은 없어서 아쉽네요.



    먼저 김성동님께서 답해주신 저도 한번 시도해본 것인데, 실행해보면 런타임 에러

    가 발생됩니다.



    그리고 구창민님께서 답해주신 내용은 제 질문의 의도와는 조금 다른 것 같습니다.



    제 질문의 요지는 문자열로 표현된 폼 클래스 이름만 알고 있을 때 그 폼 클래스의

    인스턴스를 어떻게 생성하는 것인가에 대한 것입니다.



    그러므로 구창민님의 답변에 있는 "with TForm.Create( Application ) do"에서는

    TForm이라는 클래스 이름 자체를 이미 사용했기 때문에 제가 적용하기에는

    맞지 않을 것 같습니다.





  • Profile
    구창민 1999.09.04 06:59
    이상호 께서 말씀하시기를...

    > 폼 이름을 알고 있을 때 폼을 생성할 수 있을까요?

    >

    > 즉, 내가 생성해야 할 폼이 TMyForm 타입의 폼이라고 할 때

    > "TMyForm"이라는 문자열로부터 실제 클래스 객체를 만들 수

    > 있을까에 대한 것입니다.

    >

    > 왠만한 곳은 다 찾아봤는데 RTTI와 관계가 있다는 것 말고

    > 실제 구현해놓은 예제 코드는 찾아보기가 힘드네요.

    >

    > 그런 방법이 있다면 한번쯤 구현해볼만한 주제가 아닌가

    > 생각됩니다.

    >

    > 델파이 고수들의 도움 바랍니다.



    이상호님 안녕하세요?

    폼 이름은 문자열입니다.

    아래처럼 생성시키시면 됩니다.



    procedure TForm1.Button1Click(Sender: TObject);

    var i: ShortInt;

    begin

    for i:= 2 to 5 do

    with TForm.Create( Application ) do

    begin

    Name := 'Form' + IntToStr( i );

    Show;

    end;

    end;



    그럼 항상 즐거운 프로그래밍 되시길~~

  • Profile
    김성동 1999.09.04 03:36
    음...



    테스트 해보지는 않았습니다만

    이렇게 하면 되지 않을까 생각 되네요.



    var

    Form : TForm;

    begin

    Application.CreateForm(TComponentClass(GetClass("TMyForm")), Form);

    end;



    혹시 동작하지 않는다면 Classes.pas와 Forms.pas를 유심히 들여다 보시면 해결되리라 봅니다.



    이상호 께서 말씀하시기를...

    > 폼 이름을 알고 있을 때 폼을 생성할 수 있을까요?

    >

    > 즉, 내가 생성해야 할 폼이 TMyForm 타입의 폼이라고 할 때

    > "TMyForm"이라는 문자열로부터 실제 클래스 객체를 만들 수

    > 있을까에 대한 것입니다.

    >

    > 왠만한 곳은 다 찾아봤는데 RTTI와 관계가 있다는 것 말고

    > 실제 구현해놓은 예제 코드는 찾아보기가 힘드네요.

    >

    > 그런 방법이 있다면 한번쯤 구현해볼만한 주제가 아닌가

    > 생각됩니다.

    >

    > 델파이 고수들의 도움 바랍니다.





  • Profile
    이상호 1999.09.04 19:13
    GetClass를 사용하기 전에 한 가지 해주어야 할 일이 있더군요.



    먼저 GetClass를 사용하기 이전에 어디선가(Form Create라면 상관없을 거

    같네요) RegisterClass('TMyForm')을 먼저 해 주는 것입니다.



    그러면 등록된 클래스에 대한 정보를 구할 수가 있어서 런타임 에러가 발생하지

    않더군요.



    // 아래는 샘플 코드...



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    RegisterClass(TMyForm);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var

    form: TForm;

    newClass: TPersistentClass;

    begin

    newClass := GetClass('TMyForm');

    Application.CreateForm(newClass, form);

    form.Show;

    end;





    김성동 께서 말씀하시기를...

    > 음...

    >

    > 테스트 해보지는 않았습니다만

    > 이렇게 하면 되지 않을까 생각 되네요.

    >

    > var

    > Form : TForm;

    > begin

    > Application.CreateForm(TComponentClass(GetClass("TMyForm")), Form);

    > end;

    >

    > 혹시 동작하지 않는다면 Classes.pas와 Forms.pas를 유심히 들여다 보시면 해결되리라 봅니다.

    >

    > 이상호 께서 말씀하시기를...

    > > 폼 이름을 알고 있을 때 폼을 생성할 수 있을까요?

    > >

    > > 즉, 내가 생성해야 할 폼이 TMyForm 타입의 폼이라고 할 때

    > > "TMyForm"이라는 문자열로부터 실제 클래스 객체를 만들 수

    > > 있을까에 대한 것입니다.

    > >

    > > 왠만한 곳은 다 찾아봤는데 RTTI와 관계가 있다는 것 말고

    > > 실제 구현해놓은 예제 코드는 찾아보기가 힘드네요.

    > >

    > > 그런 방법이 있다면 한번쯤 구현해볼만한 주제가 아닌가

    > > 생각됩니다.

    > >

    > > 델파이 고수들의 도움 바랍니다.

    >

    >





  • Profile
    미노 2000.01.22 19:29
    모든 고수님께 감사합니다.

    최종 코드는 다음과 같습니다.



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls;



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure FormCreate(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    uses Unit2;



    {$R *.DFM}



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    RegisterClass(TMyForm);

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var

    form : TForm;

    newClass : TPersistentClass;

    begin

    newClass := GetClass('TMyForm');

    Application.CreateForm(TComponentClass(newClass), form);

    form.Show;

    end;



    end.