Q&A

  • RegisterClass로 동적폼 생성 시 폼생성 되지 않는 문제.
안녕하세요.
질문 한가지가 있어 검색끝에 찾지 못해 올립니다.

질문 사항은
한폼에서 다른 폼을 생성시켜  보여주는 작업을 하려는데요.
호출하려는 폼 또는 호출되는 폼에서 'QForms'  또는 'Forms' 를 uses 로 포함한 unit 파일을 참조하면
RegisterClass로 폼이 생성되지 않습니다.
그러니까

'A' : 다른 폼을 호출하려는 폼
'B' : 호출 되는 폼, 아래 'C'파일을 uses에 포함 함
'C' : 공용으로 사용할 함수를 모아놓은 Unit 파일, 상단 uses 절에 'QForms' 가 추가되어있음

이런 상태에서 'A' 폼에서 'B' 폼을 생성하기 위해 GetClass 함수를 실행시키면 값을 가져오지 못하고
Nil 값을 되돌립니다.
'C' 폼의 uses 절에서 'QForms'를 빼버리면 또 해당 폼의 생성이 잘되구요.
만들어 놓은 함수 들 때문에 빼버릴 수 없고 'QForms'  또는 'Forms' 파일 안에 RegisterClass 등이 사용되어서 그런 것인지..
도저히 찾지 못하겠네요.
아시는 분 꼭 부탁드립니다.

아래는 제가 테스트 했던 코드입니다. Delphi 7 버젼입니다.


<!--CodeS-->

// A Form File  'B' Form을 호출하는 폼

unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, cxPC, cxControls;

type
  TfmMain = class(TForm)
    cxPageControl1: TcxPageControl;
    cxTabSheet1: TcxTabSheet;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
                                                                                  
var
  fmMain: TfmMain;

implementation


{$R *.dfm}

procedure TfmMain.Button1Click(Sender: TObject);
var
  zFormClass : TFormClass;
  zForm      : TForm;
begin
  zFormClass := TFormClass(GetClass('TfmCustomer'));
  if zFormClass = nil then
  begin
    showmessage('aa');
    exit;
  end;

  zForm := zFormClass.Create(self);
  zForm.Parent := cxTabSheet1;
  zForm.Align  := alClient;

  zForm.Show;
end;

end.




// B Form File   'A' 에게 호출되는 폼

unit uCustomer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfmCustomer = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;            
    Panel3: TPanel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmCustomer: TfmCustomer;

implementation

uses uCx_global_;


{$R *.dfm}


initialization
    RegisterClass(TfmCustomer); //해당 Tform명
finalization
    UnRegisterClass(TfmCustomer);

end.



// C Unit File   'A' 또는 'B' 에서 참조하는 Unit

unit uCx_global_;

interface

uses QForms;

{
  function  ExeManagementSql(pForm    : TForm;    pTableName, pKeyField : String; pWhereStr : String = '') : Boolean; overload;
  function  getInsertStr(pForm    : TForm;    pTableName : String)            : String; overload;
///////////////////////
.............. 기타 함수 선언 및 구현
///////////////////////
}


implementation

end.

<!--CodeE-->

2  COMMENTS
  • Profile
    최용일 2007.06.14 21:03
    안녕하세요. 최용일입니다.

    왜 uses절에 Forms유닛이 아니라 QForms 유닛을 쓰시는지요? QForms유닛은 Windows용이 아니라 Kylix용 유닛입니다. QForms 대신에 Forms유닛을 쓰시면 별 문제 없을겁니다.

    델파이 유닛들중에서 Q로 시작되는 유닛들은 대부분 리눅스 플랫폼에서 동작하는 Kylix를 위한 유닛들입니다.

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

  • Profile
    DelChoBo 2007.06.14 21:43
    완전 허걱~ 이네요.    ㅡ.ㅡ;;
    이것 때문에 많은 시간을 허비했는데..
    Kylix용 유닛을 쓰고 있었다니...
    완전히 바보된 느낌이.. 흑~ ㅠ.ㅠ

    덕분에 바로 해결되었습니다.
    몇개(?)의 Kylix용 유닛을 빼버리고 나니.. ^^;;;;
    감사합니다.

    좋은 오후되시길.. ^^