让AllocateHwnd接受一般函数地址作参数
http://www.xuebuyuan.com/1889769.html
Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型:
function AllocateHWnd(Method: TWndMethod): HWND;
很多时候,我们想要创建一个窗口,而又不想因为这个参数而创建一个类,怎么办?
换句话说,就是能不能使传入的参数是个普通的函数而不是类的方法呢?答案是肯定的!
看看TWndMethod的声明:
type
TWndMethod = procedure(var Message: TMessage) of object;
实际上类的方法在执行时,总是传入了对象这个参数。
即此方法共传了两个参数,根据Delphi默认的registry调用约定,寄存器eax传递对象,edx传递Message结构变量。
因此我们可以声明处理消息的函数的类型:
type
TMyWndProc = procedure(AObject: TObject; var Message: TMessage);
我们自定义MyAllocateHWnd函数以接收这个类型的参数,内部调用AllocateHWnd:
function MyAllocateHWnd(Proc: TMyWndProc): HWND;
asm
push // AObject
push Proc// Message
call AllocateHWnd
end;
如果直接调用AllocateHwnd(Proc)是不能通过编译的!
var H: HWND; procedure MyWndProc(AObject: TObject; var Message: TMessage);
begin
if Message.Msg = WM_USER + then
ShowMessage('')
else
Message.Result := DefWindowProc(H, Message.Msg, Message.WParam, Message.LParam)
end; procedure TForm1.FormCreate(Sender: TObject);
begin
H := MyAllocateHWnd(MyWndProc)
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(H);
end; procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(H, WM_USER + , , );
end;
unit uMain; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type
TForm1 = class( TForm )
Button1 : TButton;
procedure FormCreate( Sender : TObject );
procedure FormDestroy( Sender : TObject );
procedure Button1Click( Sender : TObject );
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1 : TForm1; implementation {$R *.dfm} type
TMyWndProc = procedure( AObject : TObject; var Message : TMessage ); var
H : HWND; function MyAllocateHWnd( Proc : TMyWndProc ) : HWND;
asm
push // AObject
push Proc // Message
call AllocateHWnd
end; procedure MyWndProc( AObject : TObject; var Message : TMessage );
begin
if message.Msg = WM_USER + then
ShowMessage( 'Receive Message!' )
else
message.Result := DefWindowProc( H, message.Msg, message.WParam,
message.LParam )
end; procedure TForm1.Button1Click( Sender : TObject );
begin
PostMessage( H, WM_USER + , , );
end; procedure TForm1.FormCreate( Sender : TObject );
begin
H := MyAllocateHWnd( MyWndProc );
end; procedure TForm1.FormDestroy( Sender : TObject );
begin
DeallocateHWnd( H );
end; end.

让AllocateHwnd接受一般函数地址作参数的更多相关文章
- 让AllocateHwnd接受一般函数地址作参数(105篇博客)
http://www.xuebuyuan.com/1889769.html Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function Al ...
- php函数按地址传递参数(php引用)
php函数按地址传递参数(php引用) 一.总结 1.php引用:php引用和c++一样,都是在变量前加&(取地址符号) 2.php函数按地址传递参数:php函数按地址传递参数(php引用)也 ...
- python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。
python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...
- vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置
vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...
- nodeJS接受post传过来的参数
1.nodeJs接受Post传递的参数需要通过绑定两个事件来获取, querystring = require("querystring"); 1 app.post('/comm ...
- 百万年薪python之路 -- 函数的动态参数
1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...
- python27期day10:函数的动态参数、函数的注释、函数的名称空间、函数的嵌套、global(修改全局的)、nonlocal(修改局部的)、函数名的第一类对象及使用、作业题。
1.动态参数的作用: 能够接收不固定长度参数 位置参数过多时可以使用动态参数 * args是程序员之间约定俗称(可以更换但是不建议更换) * args获取的是一个元组 ** kwargs获取的是一个字 ...
- Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法
Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...
- Web APi之捕获请求原始内容的实现方法以及接受POST请求多个参数多种解决方案(十四)
前言 我们知道在Web APi中捕获原始请求的内容是肯定是很容易的,但是这句话并不是完全正确,前面我们是不是讨论过,在Web APi中,如果对于字符串发出非Get请求我们则会出错,为何?因为Web A ...
随机推荐
- android studio修改新项目package名称
android项目生成APK发布必须保证package唯一.新项目在已有项目基础上修改就必须修改package名称. 操作如下: 1) 在模块(module)上右键选择Refactor->Ren ...
- Auto Updating the exe from a network location when application starts z
http://www.codeproject.com/Tips/869588/Auto-Updating-the-exe-from-a-network-location-when?msg=499218 ...
- LruCache--远程图片获取与本地缓存
Class Overview A cache that holds strong references to a limited number of values. Each time a value ...
- AspNetPager 自定义html
如果,上面的分页控件里面,成功和失败都是我自己添加的,使用方法如下 anp.CustomInfoHTML = "总计%RecordCount%条记录,成功" + Success + ...
- hdu 5254 水题
纯暴力就能过的,可是题目描述真心不清楚,我看了好久好久才明白题目啥意思. 为了迅速打完,代码比较冗余. /* * Author : ben */ #include <cstdio> #in ...
- ASP.NET 如何做出简单的验证码
如果说要做验证码,那不得不提的就是GDI+绘图了.我们都知道验证码是以图片形式展示的,而且是动态生成的,这样就需要我们去画出它. 科普一下,什么是GDI+? GDI+是图形设备接口(GDI)的高级版本 ...
- CAT XQX --- 省市三级级联实现说明
最终效果: 满足要求, 上代码 : 1. 需要调用这个控件 的地方:添加引用,因为里面写着逻辑呢..... <script type="text/javascript" ...
- 状态管理cookie 案例
1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...
- hadoop的ganglia数据监控
如果我们想知道当前运行的hadoop集群的状态,可以通过hadoop的客户端和web页面来获得,但是如果我们想知道当前集群的繁忙程度,如读写次数,这些工具就办不到了.幸运的是hadoop提供了一种ga ...
- Github在windows7环境下使用入门
1.下载并安装 下载和安装一般都没什么问题,网上的链接一大堆,不过还是在此给一个安装的地址和安装的参考吧. 当然,安装完成后要保证git能使用,必须配置github 2.配置github 首先是要创建 ...