在包Package里RegisterClass一个Class(TMyClass),在exe程序中却不能GetClass('TMyClass')
调试时确定已经执行了
RegisterClass(TMyClass)
我的写法:
initialization
RegisterClass(TMyClass);
在exe程序中,我先Handle := LoadPackage('PackageName')
确保了Handle是有值的,且我调试Package时,确定他已经执行了。
然后我MyClass := GetClass('TMyClass')
但返回的MyClass is nil
调试时确定已经执行了
RegisterClass(TMyClass)
我的写法:
initialization
RegisterClass(TMyClass);
在exe程序中,我先Handle := LoadPackage('PackageName')
确保了Handle是有值的,且我调试Package时,确定他已经执行了。
然后我MyClass := GetClass('TMyClass')
但返回的MyClass is nil
TMyClass,是我在包里定义的一个Class
比如: TForm1 = Class(TForm) 中的TForm1就是我的MyClass
我怀疑那个CLASS怎么定义的有关..
把涉及隐私的部分删了,再把代码贴出来吧.
下面是那个Package的代码
unit VirtualDB;interfaceuses
SysUtils, Classes, DB, DBTables;type
TConcreteDataModule = class(TDataModule)
dbDemo: TDatabase;
Query1: TQuery;
private
{ Private declarations }
public { Public declarations }
end;var
ConcreteDataModule: TConcreteDataModule;implementation{$R *.dfm}
initialization
RegisterClass(TConcreteDataModule);
end.下面是调用Package的exe程序的代码
unit TestPackageFrm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, DB, StdCtrls, Grids, DBGrids, DBTables,
ComCtrls;type
TTestPackageForm = class(TForm)
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
Button1: TButton;
StatusBar1: TStatusBar;
procedure FormActivate(Sender: TObject);
private
aDBConnect:THandle ;
procedure LoaddbPackage;
procedure LoadDataModule;
{ Private declarations }
public
{ Public declarations }
end;var
TestPackageForm: TTestPackageForm;implementation{$R *.dfm}procedure TTestPackageForm.LoadDataModule;
var
iCounter : Integer;
dataModuleClass:TPersistentClass ;
admGlobal:TDataModule ;
aQuery:TQuery ;
begin
{Note that TApplication "owns" this form and thus it must be freed priorto unloading the package }
// dataModuleClass := GetClass('TConcreteDataModule');
dataModuleClass := GetClass('TConcreteDataModule');
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) = 'TQUERY' then begin
aQuery := TQuery(admGlobal.Components[iCounter]);
DataSource1.DataSet := aQuery;
break;
end;
end;
end;
end;
procedure TTestPackageForm.LoaddbPackage;
begin //我们必须加载数据库Package以便连结到数据库
try
aDBConnect := LoadPackage('Bpl\DBPackages.bpl');
LoadDataModule ;
except on E : Exception do begin
MessageBeep(Word(-1));
ShowMessage(E.Message);
Application.Terminate;
end;
end;
end;procedure TTestPackageForm.FormActivate(Sender: TObject);
begin
LoaddbPackage ;
end;end.
只要关键的一个BPL, VCL.BPL.原因你想通了也较容易理解VirtualDB------------>VCL.BPL (RegisterClass)TestPackage.exe-------->vcl.bpl (GetClass 所在单元不要静态编译进主程序)这样主程序与动库包必须共享同一个VCL.BPL包..
在下面的输入框中,不要输入你的package名称,点击ok,编译即可