我想自己做一个包应用的实验,思路是这样的:
自己做一个公共datamodule,被包括到一个新制作的包中。
然后其他的程序都可以调用这个包。但是我遇到了一个麻烦。
先看程序:
单元文件是:
unit CenterDM;interfaceuses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, ADODB;type
TCenterDataModule = class(TDataModule)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;var
CenterDataModule: TCenterDataModule;implementation{$R *.DFM}
initialization
RegisterClass(TCenterDataModule);
finalization
UnRegisterClass(TCenterDataModule);end.);
====================================================================
调用这个包的主程序:
unit mainunit;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, Grids, DBGrids, ADODB;type
TMainForm = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
procedure LoaddbPackage; { Public declarations }
procedure LoadDataModule;
end;var
MainForm: TMainForm;
dataModuleClass: TPersistentClass;
admGlobal:TDataModule;
aDBConnect: HMODULE;
implementation{$R *.DFM}procedure TMainForm.LoaddbPackage;begin
//我們必須載入資料庫Package以便連結到資料庫
try aDBConnect := LoadPackage('CenterDMPackage.bpl');
LoadDataModule; except on E: Exception do
begin MessageBeep(Word(-1));
ShowMessage(E.Message);
Application.Terminate; end;
end;
end;procedure TMainForm.LoadDataModule;
var
iCounter: Integer; aQuery:TAdoquery;
begin{ Note that TApplication "owns" this form and thus it must be freed prior
to unloading the package }
dataModuleClass:= GetClass('TCenterDataModule');
//
if dataModuleClass <> nil then
begin
admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin if UpperCase(admGlobal.Components[iCounter].ClassName) = 'TAdoQUERY' then
begin aQuery := TadoQuery(admGlobal.Components[iCounter]);
DataSource1.DataSet := aQuery;
break; end; end; end;
end;procedure TMainForm.FormActivate(Sender: TObject);
begin
LoaddbPackage;
end;end.
============================================================
在上面getclass时总是返回nil,所以我无法利用包中类的功能。
请高人指点。谢谢。
自己做一个公共datamodule,被包括到一个新制作的包中。
然后其他的程序都可以调用这个包。但是我遇到了一个麻烦。
先看程序:
单元文件是:
unit CenterDM;interfaceuses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, ADODB;type
TCenterDataModule = class(TDataModule)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;var
CenterDataModule: TCenterDataModule;implementation{$R *.DFM}
initialization
RegisterClass(TCenterDataModule);
finalization
UnRegisterClass(TCenterDataModule);end.);
====================================================================
调用这个包的主程序:
unit mainunit;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, Grids, DBGrids, ADODB;type
TMainForm = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
procedure LoaddbPackage; { Public declarations }
procedure LoadDataModule;
end;var
MainForm: TMainForm;
dataModuleClass: TPersistentClass;
admGlobal:TDataModule;
aDBConnect: HMODULE;
implementation{$R *.DFM}procedure TMainForm.LoaddbPackage;begin
//我們必須載入資料庫Package以便連結到資料庫
try aDBConnect := LoadPackage('CenterDMPackage.bpl');
LoadDataModule; except on E: Exception do
begin MessageBeep(Word(-1));
ShowMessage(E.Message);
Application.Terminate; end;
end;
end;procedure TMainForm.LoadDataModule;
var
iCounter: Integer; aQuery:TAdoquery;
begin{ Note that TApplication "owns" this form and thus it must be freed prior
to unloading the package }
dataModuleClass:= GetClass('TCenterDataModule');
//
if dataModuleClass <> nil then
begin
admGlobal:=TDataModule(TComponentClass(dataModuleClass).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin if UpperCase(admGlobal.Components[iCounter].ClassName) = 'TAdoQUERY' then
begin aQuery := TadoQuery(admGlobal.Components[iCounter]);
DataSource1.DataSet := aQuery;
break; end; end; end;
end;procedure TMainForm.FormActivate(Sender: TObject);
begin
LoaddbPackage;
end;end.
============================================================
在上面getclass时总是返回nil,所以我无法利用包中类的功能。
请高人指点。谢谢。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货