请问在DELPHI7中如何动态创建和调用package中的窗体?最好有例子

解决方案 »

  1.   

    http://www.delphiun.com/article_view.asp?id=58
      

  2.   

    var ModuleInstance1: HMODULE;
    {$R *.dfm}
    // 动态加载 Package
    procedure TForm0.Button1Click(Sender: TObject);
    begin
    ModuleInstance1 := LoadPackage('Package1.bpl');
    end;
    // 将 Package 中的 Form1 带出
    procedure TForm0.Button2Click(Sender: TObject);
    var frm: TcustomForm;
    begin
    frm:= CreateFormByClassName('TForm1');
    try
    frm.ShowModal;
    finally
    frm.Release;
    end;
    end;
    procedure TForm0.Button3Click(Sender: TObject);
    begin
    UnloadAddInPackage(ModuleInstance1);
    end;
    // 自订函式 – CreateFormByClassName() , 建立 Form
    function TForm0.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 TForm0.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 TForm0.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;