zoukankan      html  css  js  c++  java
  • 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;
     

    至此完成。

  • 相关阅读:
    Eclipse Java注释模板设置详解
    windows server 2008 配置安装AD 域控制器
    linux 用户、用户组不能是全数字
    python if __name__ == '__main__'解析
    完美解决:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x
    yum Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
    在Eclipse中手动安装pydev插件,eclipse开发python环境配置
    xp系统打开软件程序总是弹出警告窗口,很烦人对不,怎么办呢?进来看
    UliPad双击没反应,UliPad打不开
    安装Django,运行django-admin.py startproject 工程名,后不出现指定的工程解决办法!!
  • 原文地址:https://www.cnblogs.com/ChinaEHR/p/2709221.html
Copyright © 2011-2022 走看看