易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi动态事件深入分析

Delphi动态事件深入分析
2009-2-7
作者:不得闲
核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递...
首先做一个空窗体,放入一Button。
在implementation下面声明两个方法如下:
//外部方法,只声明一个参数,此时按照标准的对象内部事件方法TNotifyEvent声明,此声明中,Sender则对应为产生该事件的对象指针。
procedure ExtClick1(Sender: TObject);
begin
{asm
mov eax,[edx+8]
call showmessage
end; }
showmessage(TComponent(Sender).Name);
end;

//外部方法,声明两个参数,用来证明,对象在调用时候会传递一个Self指针,此时我们假设Frm是通过类对象传递过来的Self指针,而Sender为产生该事件的对象指针
procedure ExtClick(Frm: TObject;Sender: TObject);
begin
{asm
mov eax,[edx+8]
call showmessage
end; }
showmessage(TComponent(Sender).Name);
if Frm is TForm then
TForm(Frm).Close
end;

//然后在 ‘指定调用’按扭事件中写代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(TComponent(Sender).Name);
end;

//很显然运行的时候,点该按扭得到的是返回一个 消息内容为 ‘Button1’的对话框,这是调用Form1类的对象事件触发的方法。
//在调用 ‘调用Form类外部方法触发事件’ Click事件中写
procedure TForm1.Button2Click(Sender: TObject);
var
ExtClickEvent: TNotifyEvent;
begin
integer(@ExtClickEvent) := integer(@ExtClick1);
//将ExtClickEvent地址指针指向外部函数ExtClick1方法的地址
Button1.OnClick := ExtClickEvent;
//将该地址赋值给 Button1的OnClick事件替换以前的OnClick事件
end;

//另一个按扭写代码如下:
procedure TForm1.Button3Click(Sender: TObject);
begin
Button1.OnClick := Button1Click;//还原为对象内触发事件函数
end;

运行之后
点一下 ‘调用Form类外部方法触发事件’ ,然后在点 ‘指定调用’按扭,
showmessage(TComponent(Sender).Name);返回的值是 ‘Form1’,此时是否就已经说明了其第一个参数是否就是传递的一个Self指针呢。所以在调用Button.Click事件的时候传递过来的第一个参数为Form1内部的Self指针,


相关文档:

Delphi 7 的一个奇怪的Bug

近来发现一个Delphi莫名其妙的bug,当使用SetOptionalParam时,不能使用一连串数字的字符串,如'101',注意,是带引号的。在SaveToFile时,就会出现'Invalid field type'的异常,真是百思不得其解!连'001'这种串也不行,去掉引号,直接按数字赋值,则正常。
procedure TForm1.Button1Click(Sender: TObject);
var
  ......

Delphi 7使用ADOConnection访问MySQL

今天心血来潮在自己的电脑上安装了mysql-5.1.41-win32和mysql-connector-odbc-5.1.6-win32。以前,我曾经尝试使用DELPHI6去联接MYSQL但是在网上找很多资料都不很好用;今天突然也想起这个问题就干起回来了。
  1. 建立数据库
    use mysql;
    drop database myDB;
    create database ......

coolbar让你的delphi应用程序更酷

曹祖权
  工具条是程序员喜欢采用的组件,它具有简明直观的外形,能够方便用户执行最常用的功能。如果你使用delphi3编程,那么本人向你推荐coolbar组件。它是一种功能更为丰富的工具条,用它可以使多个传统的工具条、编辑框、组合列表框、图像甚至更多的组件集成到一个统一的coolbar中,使得应用程序窗口更为紧凑、界面 ......

Delphi的内置函数操作INI文件

利用Windows API函数WritePrivateProfileString
和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实
现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法 ......

在Delphi程序中操作注册表(转)

   32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。     
    一、创建和释放TRegistry对象  
   
    1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry   :=   TRegistry.Create;  
&n ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号