高人请帮看下-为什么小弟我无法调用这个回调函数
高人请帮看下------------为什么我无法调用这个回调函数
我想使用一个代码,找出大图里的所有子图,但碰到了两个问题:
1.如果用Compare函数的方式,总是只能找到第一个图,找不到所有的子图,是什么原因?
2.但如果用了回调函数,是不是可以实现这个功能?但为什么我调用回调函数时提示出错?
文件1,main.pas
------解决方案--------------------
主调函数里面的MyEnumImageProc变量没有初始化
------解决方案--------------------
TBDEnumImageProc = function(Left, Top: Integer; Bmp: TBDBitmapData; lParam: Integer): Boolean
这是一个函数指针的定义,所以LZ需要定义一个独立的函数--注意,不是在类里面定义,而是一个单独的函数作为句柄来传入
譬如
function aTest(Left, Top: Integer; Bmp: TBDBitmapData; lParam: Integer): Boolean
begin
showMessage("this is a test");
end;
然后调用的地方加上
MyEnumImageProc:= aTest;
我想使用一个代码,找出大图里的所有子图,但碰到了两个问题:
1.如果用Compare函数的方式,总是只能找到第一个图,找不到所有的子图,是什么原因?
2.但如果用了回调函数,是不是可以实现这个功能?但为什么我调用回调函数时提示出错?
文件1,main.pas
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ExtDlgs;
type
TMainForm = class(TForm)
Image1: TImage;
Image2: TImage;
Memo1: TMemo;
Button1: TButton;
OpenPictureDialog1: TOpenPictureDialog;
OpenPictureDialog2: TOpenPictureDialog;
Label1: TLabel;
Button2: TButton;
Memo2: TMemo;
procedure Image1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
LibDir, LibName: string; //位置和名称
end;
var
MainForm: TMainForm;
strTmp: string;
implementation
uses Math, BitmapData;
{$R *.dfm}
procedure TMainForm.Image1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
procedure TMainForm.Image2Click(Sender: TObject);
begin
if OpenPictureDialog2.Execute then
Image2.Picture.LoadFromFile(OpenPictureDialog2.FileName);
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Image1.Picture.Bitmap.PixelFormat := pf24bit;
Image2.Picture.Bitmap.PixelFormat := pf24bit;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
bd1, bd2: TBDBitmapData;
i, j, k, x, y: Integer;
b: Boolean;
tmp1: string;
MyEnumImageProc:TBDEnumImageProc;//定义回调函数
begin
try
bd1 := TBDBitmapData.Create;
bd2 := TBDBitmapData.Create;
bd1.LoadFromBitmap(Image1.Picture.Bitmap);
Application.ProcessMessages;
LibName := 'c:\s.bmp';//读取子图片
if not FileExists(LibName) then
Continue;
Image2.Picture.LoadFromFile(LibName); // 加载库模版图片
bd2.LoadFromBitmap(Image2.Picture.Bitmap); //加截要匹配的图片
for y := 0 to bd1.Height - 1 do //从上到下 表示的是图1,也就是要搜索的大图
begin
for x := 0 to bd1.Width - 1 do //从左到右
begin
//再扫小图的每个点
//if bd1.Compare(bd2, x, y) then //****将每一个像索点位置的图片进行对比,但这个代码只能找出第一个图,没办法找出最后一个图????*****
if bd1.EnumImage(bd2,MyEnumImageProc) then //这个调用回调函数,想把所有的子图找出座标点出来,但却报错了????????
begin
Memo2.Lines.Add('Found:' + IntToStr(x)+ IntToStr(y));//找出子图在大图上的座标点
end;
end;
end;
end;
finally
bd1.Free;
bd2.Free;
end;
end;
end.
------解决方案--------------------
主调函数里面的MyEnumImageProc变量没有初始化
------解决方案--------------------
TBDEnumImageProc = function(Left, Top: Integer; Bmp: TBDBitmapData; lParam: Integer): Boolean
这是一个函数指针的定义,所以LZ需要定义一个独立的函数--注意,不是在类里面定义,而是一个单独的函数作为句柄来传入
譬如
function aTest(Left, Top: Integer; Bmp: TBDBitmapData; lParam: Integer): Boolean
begin
showMessage("this is a test");
end;
然后调用的地方加上
MyEnumImageProc:= aTest;