Delphi 封装Frame到Dll文件
做项目的时候,发现这个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文件的更多相关文章
- 关于delphi PAServer 远程调试DLL文件
用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...
- delphi 基础之三 编写和调用dll文件
delphi 编写和调用dll文件 Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...
- Windows中DLL文件的意义及其作用
Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...
- 如何将.il、.res文件封装成dll文件
将你的.il..res文件保存在你的硬盘上,如下图: 我存放的路径在E盘的test文件夹中,我们开始封装了咯.进入DOS命令,如下图: 我们通过DOS命令先进入.il..res文件目录,如下图: 然后 ...
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- Delphi中编写无输出函数名的DLL文件(有点意思)(400多篇博客)
用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的 ...
- 将DLL文件直接封装进exe执行文件中(C#)
前言:由于项目需要,需制作一个注册机,将个人PC的MAC值和硬盘序列号与软件进行绑定,由于笔者的C++不是很好,所以采用C#进行开发.但在采用C#的时候,获取硬盘的MAC值和序列号的时候又不是很准确, ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了. 原来的写的框架只支持c#插件,这个好做 ...
随机推荐
- websphere安装和mvn dependency:copy-dependencies
http://www.blogjava.net/paulwong/archive/2009/09/19/295657.html http://ljhzzyx.blog.163.com/blog/sta ...
- DB2中SQLSTATE=57016 SQLCODE=-668
执行 alter table DW_RPT.TRPT_JV_COGNOS_RPT add CENTER_CD varchar(10) ALTER TABLE DW_RPT.TRPT_JV_COGNOS ...
- DB2中时间格式化
values to_char(current timestamp - 7 hours,'hh24')||'点' values varchar(hour(current time + 5 hour))| ...
- 【调侃】IOC前世今生(转)
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- linux下的webserver BOA及CGIC库的使用指南(转帖)
我把网页挂载到nfs 下面的文件中(需要新建一个文件www ),不过这样很方便! 安装过程 ====================================================== ...
- Computer Vision Algorithm Implementations
Participate in Reproducible Research General Image Processing OpenCV (C/C++ code, BSD lic) Image man ...
- [Locked] One Edit Distance
One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 分析: ...
- AGG 之贝塞尔插值
原文: http://liyiwen.iteye.com/blog/705489 之前 comp.graphic.algorithms 上有一个讨论,是关于怎么样使用曲线对多边形进行插值处理,使得最终 ...
- Wireless Password - HDU 2825(ac自动机+状态压缩)
题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...
- Mongodb query查询
Query.All("name", "a", "b");//通过多个元素来匹配数组Query.And(Query.EQ("name ...