Delphi 回调函数及property的使用

要弄清楚Delphi中的回调,首先要弄清楚:

delphi中经常见到的以下两种定义

Type

TMouseProc = procedure (X,Y:integer);

TMouseEvent = procedure (X,Y:integer) of Object;

两者样子差不多但实际意义却不一样,

TMouseProc只是单一的函数指针类型;

TMouseEvent是对象的函数指针,也就是对象/类的函数/方法

区别在于类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换。

这也就是为什么delphi中可以这样赋值 button1.onClick:=button2.onClick;

却不能这样赋值 button1.onclick=buttonclick; (buttonclick为本地函数,button2.onclick为类方法)的原因!

要了解更多请访问:http://blog.csdn.net/rznice/article/details/6189094

接下来是两种回调方式:

第一种是看万一博客中的回调方式:http://www.cnblogs.com/del/archive/2008/01/15/1039476.html

第二种方式是我所需要的回调方式(两个Unit之间设置回调函数):

unit PropertyUseUnit;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type

TOnUserInfoShow = function(userName: string; userAge: Integer): Boolean of object;
// 定义事件模型中的回调函数原型

TUserInfo = class
private
FName: string;
FAge: Integer;
FOnUserInfoShow: TOnUserInfoShow;

procedure FSetAge(theAge: Integer);
public
property Name: string read FName; // 只读属性(私有变量)
property Age: Integer read FAge write FSetAge; // 读写属性(私有变量,私有方法)

property OnUserInfoShow: TOnUserInfoShow read FOnUserInfoShow
write FOnUserInfoShow; // 事件模型回调函数

constructor Create;
end;

TPropertyForm = class(TForm)
btnRead: TButton;
btnRW: TButton;
btnCallBck: TButton;
mmoText: TMemo;
procedure btnReadClick(Sender: TObject);
procedure btnRWClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnCallBckClick(Sender: TObject);
private
theUserInfo: TUserInfo;
function UserInfoShow(name: string; Age: Integer):Boolean;
{ Private declarations }
public
{ Public declarations }
end;

var
PropertyForm: TPropertyForm;

implementation

{$R *.dfm}
{ TPropertyForm }

procedure TPropertyForm.btnCallBckClick(Sender: TObject);
begin
Self.theUserInfo.OnUserInfoShow(Self.theUserInfo.name, Self.theUserInfo.Age);
end;

procedure TPropertyForm.btnReadClick(Sender: TObject);
begin
Self.mmoText.Lines.Add(‘读取只读属性姓名:‘ + Self.theUserInfo.name);
end;

procedure TPropertyForm.btnRWClick(Sender: TObject);
begin
Self.mmoText.Lines.Add(‘修改前的读写属性年龄为:‘ + inttostr(Self.theUserInfo.Age));
Self.theUserInfo.Age := 30;
Self.mmoText.Lines.Add(‘修改后的读写属性年龄为:‘ + inttostr(Self.theUserInfo.Age));
end;

procedure TPropertyForm.FormCreate(Sender: TObject);
begin
Self.mmoText.Color := clBlack;
Self.mmoText.Font.Color := clGreen;
theUserInfo := TUserInfo.Create;
Self.theUserInfo.OnUserInfoShow := Self.UserInfoShow;
end;

function TPropertyForm.UserInfoShow(name: string; Age: Integer):Boolean;
begin
Self.mmoText.Lines.Add(‘用户姓名为:‘ + Self.theUserInfo.name);
Self.mmoText.Lines.Add(‘用户年龄为:‘ + inttostr(Self.theUserInfo.Age));
Result:= True;
end;

{ TUserInfo }

constructor TUserInfo.Create;
begin
Self.FName := ‘Terry‘;
Self.FAge := 20;
end;

procedure TUserInfo.FSetAge(theAge: Integer);
begin
Self.FAge := theAge;
end;

end.

还有很多值得深究的,还望多多指教...

时间: 2024-10-14 07:02:57

Delphi 回调函数及property的使用的相关文章

delphi回调函数

疯狂delphi delphiXE7.XE8.XE10公开课A 群号:58592705 delphi回调函数 文章来源: http://anony3721.blog.163.com/blog/static/5119742010866050589/ 一.主单元 unit UnMain; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graph

Delphi回调函数及其使用

Delphi回调函数及其使用 1 回调函数的概述 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数.  这种方式,调用者在一个线程,被调用者在另一个线程. 消息: 消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个

转:Delphi 回调函数及例子

http://anony3721.blog.163.com/blog/static/5119742010866050589/ { http://anony3721.blog.163.com/blog/static/5119742010866050589/ 例子出处 } unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,StdCt

回调函数及其使用 Delphi

1 回调函数的概述   回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用者和被调用者之间的一种通知约定,当约定的事件发生时,被调用者(一般会包含一个工作线程)就会按照回调函数地址调用该函数.   这种方式,调用者在一个线程,被调用者在另一个线程.   消息: 消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个句柄和一个消息编号,

Delphi对象变成Windows控件的前世今生(关键是句柄和回调函数)

----------------------------------------------------------------------第一步,准备工作:预定义一个全局Win控件变量,以及一个精简化的Win控件类var CreationControl: TWinControl = nil; // 定义全局变量,用来表示每次刚创建的Win控件 TWinControl = class(TControl) private FDefWndProc: Pointer; // 记录原有的窗口过程,但只有

什么是回调函数

什么叫回调函数 (2012-08-02 10:37:43) 转载▼ 标签: 杂谈 分类: C 1 什么是回调 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用:回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口:异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口).

delphi公用函数

{*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 } { } {*******************************************************} unit YzDelphiFunc; interface uses ComCtrls, Forms, Windows, Classes, SysUtils, ComObj,

delphi公共函数 UMyPubFuncFroc--版权所有 (C) 2008 勇者工作室

{*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 勇者工作室 } { } {*******************************************************} unit UMyPubFuncFroc; interface uses ComCtrls, Forms, Windows, Classes, SysUtils,

嵌入式&iOS:回调函数(C)与block(OC)回调对比

学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack)(int data_i32); 2).声明一个外部函数指针. extern CallBack myCallBackPTR; 3).声明一个doSomeThingCount函数 void DSTCount(void); callBack.c 1).定义一个函数指针 CallBack myCallBa