package中的类已注册:
initialization
  RegisterClass(TForm1);
  showmessage('加载成功');
finalization
  showmessage('卸载成功!');
  UnRegisterClass(TForm1);调用方法:
function TForm2.CreateFormByClassName(const ClassName: string):Integer;
var
 UClass:TPersistentClass;
 UForm:TCustomForm;
begin
  Result:=mrNone;
  UClass:=GetClass(className);
  if UClass=nil then
  begin
    ShowMessage('没有找到类');
    Exit;
  end;  UForm:=TCustomForm(TComponentClass(UClass).Create(Application));
  ShowMessage('包中的类创建成功!');
  UForm.ShowModal;
  
end;
但包中的窗体就是不显示而是显示我定义的"没有找到类",即uclass=nil
我不知道是怎么回事,请高手解答。

解决方案 »

  1.   

    建议在TForm1所在的单元中使用initialization 
        RegisterClass(TForm1); 
        showmessage( '加载成功 '); 
    finalization 
        showmessage( '卸载成功! '); 
        UnRegisterClass(TForm1); 
    ----------------------------------------
    有RegisterClass(TForm1)的代码,
    必须在本单元,或被引用单元中,package文件,不能被引用到新工程中!
      

  2.   

    动态调用BPL的窗体
    unit UfrmMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TfrmMain = class(TForm)
        btn1: TButton;
        btn2: TButton;
        btn3: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
        procedure btn3Click(Sender: TObject);
      private
        function CreateFormByClassName(const ClassName: string): TCustomForm;
        function CreateDataModuleByClassName(const ClassName: string): TDataModule;
        procedure UnloadAddInPackage(ModuleInstance: HMODULE);
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementationvar
      ModuleInstance1: HMODULE;
    {$R *.dfm}
    //---------------------------------------------------------------
    //动态加载 Package
    //---------------------------------------------------------------
    procedure TfrmMain.btn1Click(Sender: TObject);
    begin
      ModuleInstance1 := LoadPackage('Package1.bpl');
    end;//---------------------------------------------------------------
    //将 Package 中的 Form1 带出
    //---------------------------------------------------------------
    procedure TfrmMain.btn2Click(Sender: TObject);
    var
      frm : TcustomForm;
    begin
      frm := CreateFormByClassName('TForm1');
      try
        frm.ShowModal;
      finally
        frm.Release;
      end;
    end;//---------------------------------------------------------------
    //释放 Package
    //---------------------------------------------------------------
    procedure TfrmMain.btn3Click(Sender: TObject);
    begin
      UnloadAddInPackage(ModuleInstance1);
    end;//---------------------------------------------------------------
    //自订函式 - CreateFormByClassName() , 建立 Form
    //---------------------------------------------------------------
    function TfrmMain.CreateFormByClassName(const ClassName: string): TCustomForm;
    var
      AClass: TPersistentClass;
    begin
      AClass := GetClass(ClassName);
      if AClass=nil then exit;
        Result := TComponentClass(AClass).Create(Application) as TCustomForm;
        //或 Result := TCustomForm(TComponentClass(AClass).Create(Application));
    end;//---------------------------------------------------------------
    //自订函式 - CreateDataModuleByClassName() , 建立数据模块
    //---------------------------------------------------------------
    function TfrmMain.CreateDataModuleByClassName(const ClassName:string): TDataModule;
    var
      AClass: TPersistentClass;
    begin
      Result := nil;
      AClass := GetClass(ClassName);
      if AClass=nil then exit;
        Result := TComponentClass(AClass).Create(Application) as TDataModule;
    end;//---------------------------------------------------------------
    //自订函式 - UnloadAddInPackage() , 释放 Package
    //---------------------------------------------------------------
    procedure TfrmMain.UnloadAddInPackage(ModuleInstance: HMODULE);
    var
      i: Integer;
      M: TMemoryBasicInformation;
    begin
      for i := Application.ComponentCount - 1 downto 0 do
      begin
        VirtualQuery(GetClass(Application.Components[i].ClassName), M, SizeOf(M));
        if (ModuleInstance = 0) or (HMODULE(M.AllocationBase) = ModuleInstance) then
          Application.Components[i].Free;
      end;
      //下面这两个函式应该是只要取其中一个呼叫即可
      UnRegisterModuleClasses(ModuleInstance); //直接注销 Package
      UnloadPackage(ModuleInstance); //间接注销 , 呼叫 Package 中 的 finalization
    end;
    end.