Delphi中DLL或Package窗体载入与显示

Delphi应用程序架构中有一种模式,采用DLL或Package存储业务窗体,当需要时从其中载入到主程序中,这时候需要对DLL或Package中窗体进行处理,步骤如下:

1、定义窗体基类

type
  TfrmBase = class(TForm)
    Panel1: TPanel;
  private
    { Private declarations }
  protected
    procedure Loaded;override;
  public
    { Public declarations }
    procedure UpdateActions; override;
  end;

  TfrmBaseClass = class of TfrmBase;

implementation

{$R *.dfm}

{ TfrmBase }

procedure TfrmBase.Loaded;
begin
  inherited;
  //将窗体改变为嵌入化 
  align   :=   alClient;
  BorderStyle   :=   bsNone;
  BorderIcons   :=   [];
end;

procedure TfrmBase.UpdateActions;
begin
  inherited;
  //将方法Public化
end;
 

2、创建具体的实例窗体

TfrmDll = class(TfrmBase)

 

3、通过窗体数据窗体类

function GetDllFormClass : TfrmBaseClass;
begin
  Result := TfrmDll;
end;

exports
  GetDllFormClass;

 

4、主窗体中动态载入DLL和创建DLL中的窗体对象

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  if DllHandle > 0 then
    Exit;

  DllHandle := LoadLibrary('FormDll.dll');
  if DllHandle > 0 then
  begin
    GetDllFormClass := GetProcAddress(DllHandle, 'GetDllFormClass');
    ifAssigned(GetDllFormClass) then
    begin
      cfrm := GetDllformClass;
      vfrm := cfrm.Create(Application);      
      //设置窗体的Parent,通过ParentWindow方法实现,这点很重要
      vfrm.ParentWindow := TabSheet1.Handle;
    end;
  end;
end;

5、在主窗体上放置一个TApplicationEvents控件,在OnIdle事件中填写以下代码:

procedure TfrmMain.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  //当系统空闲时,处理子窗体的ActionUpdate事件
  if Assigned(vfrm) then
    vfrm.UpdateActions;
end;

 

6、在OnMessage事件中填写以下代码:

procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  //如果窗体变量存在,则需要对消息进行判断和处理,如果是窗体变量的消息,则不进一步处理
  if Assigned(vfrm) then
  begin
    if IsDialogMessage(vfrm.Handle, Msg) then
      Handled := true;
  end;
end;
 

至此完成。

posted @ 2012-09-30 15:05  玻璃城市  阅读(4030)  评论(1编辑  收藏  举报