请教-回调函数怎么用

请问------------回调函数如何用?
看了几天资料,没看懂,
这回调函数是什么作用?
下面的函数是怎么调用的?



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.