我想自己做一个包应用的实验,思路是这样的:
自己做一个公共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,所以我无法利用包中类的功能。
请高人指点。谢谢。