안녕하세요.
질문 한가지가 있어 검색끝에 찾지 못해 올립니다.
질문 사항은
한폼에서 다른 폼을 생성시켜 보여주는 작업을 하려는데요.
호출하려는 폼 또는 호출되는 폼에서 '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-->
왜 uses절에 Forms유닛이 아니라 QForms 유닛을 쓰시는지요? QForms유닛은 Windows용이 아니라 Kylix용 유닛입니다. QForms 대신에 Forms유닛을 쓰시면 별 문제 없을겁니다.
델파이 유닛들중에서 Q로 시작되는 유닛들은 대부분 리눅스 플랫폼에서 동작하는 Kylix를 위한 유닛들입니다.
^^ 항상 즐코하세요...