做项目的时候,发现这个Frame很好用,为了省空间、调用和修改方便,就将Frame封装到dll(动态链接库)里面,确实很好使。

效果图如下:

上图是临时测试用的,忘了将Frame的align设置成alClient,不过刚好可以看出来白色区域是从dll里加载的Frame,还调用了Frame的按钮单击事件。

下面是大概的建立流程:

1、File -> New -> Other -> Delphi Projects -> 新建一个Dll文件

2、然后继续 File -> New -> Other -> Delphi Projects -> Delphi Files -> VCL Frame,新建一个Frame窗体

在dll里新建非Form的窗口视窗程序时,会弹出如下对话框,英文不去管它,直接点Yes,No的话我没试过,不确定啥后果。。

3、在Frame上随便放一些什么组件,这里我放置了一个Memo和Button来测试效果,如下图:

4、然后写上Button组件的OnClick事件,用于测试。

并在Frame单元的程序代码实现部分,{$R *.dfm}这个编译指令下面,写上一个创建Frame的过程,其他dll的相关操作和规范要求可以百度。

此处需要注意,需要手动定义一个 Frame(名字可以任意取): TFrame1(类名就是Frame的Name值,也可以任意取)。

5、编译并创建dll文件,我习惯右键Build。

快捷键我不熟悉,另附万一老师的快捷键大全:http://www.cnblogs.com/del/archive/2007/12/04/982851.html

编译后就得到了一个封装了Frame的Dll文件可供调用了,如下图:

6、最后新建一个Exe应用,静态或者动态调用Dll文件。

完整代码如下:

//Dll文件本身
library Project1; { Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. } uses
System.SysUtils,
System.Classes,
Unit1 in 'Unit1.pas' {Frame1: TFrame}; {$R *.res} begin
end. //Dll封装的Frame单元
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type
TFrame1 = class(TFrame)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Frame1: TFrame1; //此处手动添加 implementation {$R *.dfm} procedure TFrame1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
Memo1.Lines.Add('Hello Delphi! Hello World!' + #13#10 + 'Do You Love This World?');
end; //Frame创建过程
procedure getFrameRun(Parent:THandle); stdcall; export;
begin
Application.handle := Parent;
//将容器设为应用程序句柄
//以非模态创建并显示窗口
if Frame1 = nil then
Frame1 := TFrame1.Create(Application);
Frame1.ParentWindow := Parent; //将容器设置为父窗口
Frame1.Show;
end; //exports
exports
getFrameRun; end. //调用Dll的程序单元
unit Unit2; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
//dll文件如果不在同一文件夹就加上路径
procedure getFrameRun(Parent:THandle); stdcall; external 'Project1.dll'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
begin
getFrameRun(Panel1.Handle); //静态调用创建Frame1
end; end.

  

Delphi 封装Frame到Dll文件的更多相关文章

  1. 关于delphi PAServer 远程调试DLL文件

    用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...

  2. delphi 基础之三 编写和调用dll文件

    delphi 编写和调用dll文件   Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...

  3. Windows中DLL文件的意义及其作用

    Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...

  4. 如何将.il、.res文件封装成dll文件

    将你的.il..res文件保存在你的硬盘上,如下图: 我存放的路径在E盘的test文件夹中,我们开始封装了咯.进入DOS命令,如下图: 我们通过DOS命令先进入.il..res文件目录,如下图: 然后 ...

  5. Delphi 使用之dll文件生成与调用

    DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...

  6. Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)

    用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...

  7. 将DLL文件直接封装进exe执行文件中(C#)

    前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...

  8. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  9. C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

    原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了.      原来的写的框架只支持c#插件,这个好做 ...

随机推荐

  1. stm32 smartcard调试--不用st8024

    关于stm32 smartcard功能调试,官方提供的例程是配合8024芯片进行控制的.程序可从地址:http://www.pudn.com/downloads420/sourcecode/embed ...

  2. 【HDOJ】2645 find the nearest station

    裸BFS. /* 2645 */ #include <iostream> #include <queue> #include <cstdio> #include & ...

  3. java学习面向对象之继承

    在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...

  4. phpMyAdmin import.php 安全漏洞

    漏洞名称: phpMyAdmin import.php 安全漏洞 CNNVD编号: CNNVD-201307-068 发布时间: 2013-07-05 更新时间: 2013-07-05 危害等级:   ...

  5. 【模拟】Codeforces 710C Magic Odd Square

    题目链接: http://codeforces.com/problemset/problem/710/C 题目大意: 构造一个N*N的幻方.任意可行解. 幻方就是每一行,每一列,两条对角线的和都相等. ...

  6. 第一个ios程序

    1.ios的理解: Operating System,简称OS,操作系统,ios是苹果操作系统. 2.Xcode开发环境: 苹果公司开发的编程软件,是开发人员建立OS X 和 iOS 应用程序的最快捷 ...

  7. BFS 10.1.5.253 1502

    http://10.1.5.253/acmhome/problemdetail.do?&method=showdetail&id=1502 //1502 #include <st ...

  8. Jack Straws(判断线段是否相交 + 并查集)

    /** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840    题意:    判断线段 ...

  9. [经典] 在未排序数组中返回topK大的数

    解法一,排序 先从大到小快排,然后扫前K个返回 时间复杂度:O(NlogN),空间复杂度O(1) 解法二,优先队列 前K个放入优先队列中,与最小堆顶元素比较大小,若大于则删除堆顶并插入:否则跳过 时间 ...

  10. 使用 HTMLTestRunner.py

    HTMLTestRunner.py python 2版本 下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html 教程:http://www. ...