请教-回调函数怎么用
请问------------回调函数如何用?
看了几天资料,没看懂,
这回调函数是什么作用?
下面的函数是怎么调用的?
------解决方案--------------------
看了几天资料,没看懂,
这回调函数是什么作用?
下面的函数是怎么调用的?
type
TBDEnumImageProc = function(Left, Top: Integer; Bmp: TBDBitmapData; lParam:
Integer): Boolean;
public
function EnumImage(Bmp: TBDBitmapData; EnumImageProc: TBDEnumImageProc;
lParam: Integer = 0): Boolean; overload;
//从当前位图中查找所有与Bmp一致的子图,返回是否找到,
//无论是否找到都不会修改self.Error,
//按从左到右,从上到下的顺序查找,
//每找到一个子图,就调用回调函数EnumImageProc,如果EnumImageProc
//返回false就停止查找,结束函数,
//Bmp:子图数据;
//EnumImageProc:回调函数;
//lParam:调用回调函数时发出的参数,可省略。
function TBDBitmapData.EnumImage(Bmp: TBDBitmapData; EnumImageProc:
TBDEnumImageProc; lParam: Integer): Boolean;
var
x, y: Integer;
Res: Boolean;
begin
result := false;
Res := true;
for y := 0 to self.FHeight - Bmp.FHeight - 1 do
begin
for x := 0 to self.FWidth - Bmp.FWidth - 1 do
begin
if self.Compare(Bmp, x, y) then
begin
result := true;
Res := EnumImageProc(x, y, Bmp, lParam);
if not Res then
break;
end;
end;
if not Res then
break;
end;
end;
------解决方案--------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
// 回调函数声明
TBDEnumImageProc = function(Left, Top: Integer; Bmp: TBDBitmapData; lParam:
Integer): Boolean;
TBDBitmapData = class
public
function EnumImage(Bmp: TBDBitmapData; EnumImageProc: TBDEnumImageProc;
lParam: Integer = 0): Boolean; overload;
end;
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 回调函数定义
function MyBDEnumImageProc(Left, Top: Integer; Bmp: TBDBitmapData; lParam:
Integer): Boolean;
begin
ShowMessage('回调函数执行了');
end;
// 调用
procedure TForm1.btn1Click(Sender: TObject);
var
bdBmpData:TBDBitmapData;
begin
bdBmpData:=TBDBitmapData.Create;
bdBmpData.EnumImage(...,MyBDEnumImageProc,...);
bdBmpData.Free;
end;
function TBDBitmapData.EnumImage(Bmp: TBDBitmapData; EnumImageProc:
TBDEnumImageProc; lParam: Integer): Boolean;
var
x, y: Integer;
Res: Boolean;
begin
result := false;
Res := true;
for y := 0 to self.FHeight - Bmp.FHeight - 1 do
begin
for x := 0 to self.FWidth - Bmp.FWidth - 1 do
begin
if self.Compare(Bmp, x, y) then
begin
result := true;
Res := EnumImageProc(x, y, Bmp, lParam);
if not Res then
break;
end;
end;
if not Res then
break;
end;
end;
end.