我开发了8个基类Form窗体,其它界面设计都是继承这8个基类Form窗体,现想把这8个基类Package,但Package后加入工程中,无法继承,请问要如何才能继承。

解决方案 »

  1.   

    基类form安装步骤:
    1.打开基类包文件,编译并安装。
    2.在包文件中选择打开基类文件,然后在其窗体上右键单击,在弹出的对话框中选择Add to Repository,打开其窗体;
    3.Title和Page中写好,注意不要写反;
    4.点击“确定”,关闭Add to Repository 窗体后即可file-new-other里选择inherited,我这里没问题
      

  2.   

    可以动态引入LoadPackage('Package1.bpl');
    然后继承form;好像无法像delphi IDE那样可视化继承form
      

  3.   

    //动态引用BPLunit 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.
      

  4.   

    窗体打包没出现问题,但是在工程中动态调用BPL出错如下:
        Project CHQCost.exe raised exception class EFilerError with message 'Aclass named TdxTreeListColumn already exists'在工程的Packages->Build with runtime packages加入了pkgFormReg(注册包)
    主界面中加载包如下:
    m_hDemoPak := LoadPackage('pkgBaseForm.bpl');跳出上面的错误,如何解决呀
    pkgBaseForm.bpl,pkgFormReg.bpl编译没出错;并确认pkgFormReg.bpl没问题