Q&A

  • 폼이름을 변수로 받아서 동적으로 생성하는 문제
폼이름을 스트링 변수로 받아서 폼을 동적으로 생성하려고 하는데,
TForm인 FormInst가 nil로 받아서 폼이 생성이 않되고 있습니다.

참고로 소스는 아래와 같습니다.

클래스로 폼을 등록시켰습니다.
procedure TForm_Main.FormCreate(Sender: TObject);
begin
RegisterClasses([TForm_SYS010]);
end;

동적으로 폼을 생성하는 루틴입니다.
procedure TForm_Main.ListView_SubDblClick(Sender: TObject);
var
CurItem   : TListItem;
FormClass : TFormClass;
FormInst  : TForm;
begin
CurItem   :=  ListView_Sub.Selected;
FormClass :=  TFormClass( GetClass( 'TForm_' +
                                          CurItem.SubItems.Strings[0] ) );
Application.CreateForm(FormClass, FormInst); <-- FormInst가 nil
end;

실제로 아래의 값이 대입되어야 함.
FormClass <--  TForm_SYS010 : 정상적으로 대입됨.
FormInst  <--  Form_SYS010  : 이 부분에서 대입이 않되어 문제가 발생

한가지 더 질문하겠습니다.
리스트뷰에서 아이템이 여러개 있을 때, 실제 아이템이 없는 빈 공간을
더블클릭하면 Access Violation Error가 발생하는 문제도 부탁합니다.
1  COMMENTS
  • Profile
    이상목 2002.05.06 18:42
    스트링으로 폼이름받아 생성

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterClass(Tform2);
      RegisterClass(Tform3);
      RegisterClass(Tform4);
      RegisterClass(Tform5);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      f : Tformclass;
    begin
      f := tformclass(findClass(edit1.text));
      with f.create(self) do                  
       show;                                
    end;

    빈공간클릭의 경우에는
    listview.selected 가 nil 일때 리스트아이템을 동작시킬때
    예외가 발생합니다.
    더블클릭이벤트 시작부분에서 selected nil 이면 exit 하면 되겠네요.