回调函数(200分)

  • 主题发起人 主题发起人 NbBoy
  • 开始时间 开始时间
N

NbBoy

Unregistered / Unconfirmed
GUEST, unregistred user!
请大家帮我解释一下回调函数,并给我一个演示源码.
 
问题: 回调函数 ( 积分: 10 ) &nbsp;<br>分类: Object Pascal &nbsp;<br> <br>来自: kenmen, 时间: 2000-12-04 0:17:03, ID: 409657 &nbsp;<br>请问啥是回调函数? <br>怎用? <br> <br>来自: robertcool, 时间: 2000-12-04 11:40:35, ID: 409926 &nbsp;<br>Callback <br><br> <br>来自: Iknow, 时间: 2000-12-04 12:43:15, ID: 409974 &nbsp;<br>回调函数就是不会主动被调用, 而什么时候被调用就不知道了. <br>一般来说, 回调函数是用在其他异步的线程/进程/DLL函数中的, <br>调用者不知道调用了谁的函数, 而被调用者不知道什么时候会被调用. <br><br>简单地说就象回call机一样的. <br>你不知道什么时候会被call(调用^_^) <br> <br>来自: colx, 时间: 2000-12-05 23:26:04, ID: 410578 &nbsp;<br>关注此题 <br> <br>来自: kenmen, 时间: 2000-12-05 23:54:30, ID: 410604 &nbsp;<br>能说详细点吗? <br> <br>来自: iforever, 时间: 2000-12-10 19:34:04, ID: 414535 &nbsp;<br>好象跟CALL机不太一样哎. <br>CALL人的一般知道在CALL谁, 被CALL的往往也知道CALL它的人. <br><br> <br>来自: Jams, 时间: 2000-12-10 20:12:50, ID: 414557 &nbsp;<br>好像在Windows的创建过程中,也用到过回调函数. <br>当窗口建立后,系统就调用该函数,完成对窗口参数的设置,如窗口名,图标,窗口类型等! <br>其何时被调用,则是不确定的,就像以上诸位的比喻那样! <br> <br>来自: iforever, 时间: 2000-12-11 9:00:25, ID: 414899 &nbsp;<br>这种问题不是谁一两句话就能说清楚的. <br>还是找本书看看吧. <br> <br>来自: kenmen, 时间: 2000-12-13 0:15:12, ID: 416737 &nbsp;<br>我也有书看,但不大明。。。。 <br> <br>来自: wjiachun, 时间: 2000-12-27 14:44:14, ID: 426313 &nbsp;<br>kenmen:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。 <br><br> <br>来自: BaKuBaKu, 时间: 2001-01-07 13:49:15, ID: 434473 &nbsp;<br>kenmen 还没有明白,老猫就杀贴子了。 <br><br> 回调函数是一个普通的函数,写好以后,你可以把它的地址传给另外的函数或进程,交由 <br>对方去调用。 <br> 比如窗口消息响应函数:WndProc ,这个函数写好以后,就在 WNDCLASS 结构中填入函数 <br>地址,调用 RegisterClass 函数注册该窗口类,等于把函数的地址交给了操作系统。 <br> 当操作系统接收到发给这个窗口的消息的时候,就会调用你的 WndProc,这就是一个回调 <br>函数的实质。 <br>typedef struct _WNDCLASS { &nbsp; &nbsp;// wc &nbsp; <br> &nbsp; UINT &nbsp; &nbsp;style; <br> &nbsp; &lt;font color = #ff0000&gt;&lt;strong&gt;WNDPROC lpfnWndProc; &lt;/font&gt;&lt;/strong&gt; <br> &nbsp; int &nbsp; &nbsp; cbClsExtra; <br> &nbsp; int &nbsp; &nbsp; cbWndExtra; <br> &nbsp; HANDLE &nbsp;hInstance; <br> &nbsp; HICON &nbsp; hIcon; <br> &nbsp; HCURSOR hCursor; <br> &nbsp; HBRUSH &nbsp;hbrBackground; <br> &nbsp; LPCTSTR lpszMenuName; <br> &nbsp; LPCTSTR lpszClassName; <br>} WNDCLASS; <br><br> <br>来自: 莫大先生, 时间: 2003-07-16 21:52:00, ID: 2034894 &nbsp;<br>那么其他的函数也可以把地址传给其他函数阿?两者有什么区别? <br> <br>得分大富翁: Iknow-5,Jams-5,
 
问题: 请详解回调函数(新手) ( 积分: 100 ) &nbsp;<br>分类: 非技术问题 &nbsp;<br> <br>来自: jwang, 时间: 2001-03-26 21:23:51, ID: 481283 &nbsp;<br>请举个例子 <br> <br>来自: 热血, 时间: 2001-03-26 21:27:31, ID: 481288 &nbsp;<br>unit MainFrm; <br>interface <br>uses <br> Windows, Messages, SysUtils, Classes, Graphics, Controls, <br> Forms, Dialogs, StdCtrls, ComCtrls; <br>type <br> TWindowInfo = class <br> &nbsp; WindowName, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// The window name <br> &nbsp; WindowClass: String; // The window's class name <br> end; <br> TMainForm = class(TForm) <br> &nbsp; lbWinInfo: TListBox; <br> &nbsp; btnGetWinInfo: TButton; <br> &nbsp; hdWinInfo: THeaderControl; <br> &nbsp; procedure btnGetWinInfoClick(Sender: TObject); <br> &nbsp; procedure FormDestroy(Sender: TObject); <br> &nbsp; procedure lbWinInfoDrawItem(Control: TWinControl; Index: Integer; <br> &nbsp; &nbsp; Rect: TRect; State: TOwnerDrawState); <br> &nbsp; procedure hdWinInfoSectionResize(HeaderControl: THeaderControl; <br> &nbsp; &nbsp; Section: THeaderSection); <br> end; <br>var <br> MainForm: TMainForm; <br>implementation <br>{$R *.DFM} <br>function EnumWindowsProc(Hw: HWnd; AMainForm: TMainForm): Boolean; stdcall; <br>var <br> WinName, CName: array[0..144] of char; <br> WindowInfo: TWindowInfo; <br>begin <br> Result := True; <br> GetWindowText(Hw, WinName, 144); // Obtain the current window text <br> GetClassName(Hw, CName, 144); &nbsp; &nbsp;// Obtain the class name of the window <br> WindowInfo := TWindowInfo.Create; <br> with WindowInfo do <br> begin <br> &nbsp; SetLength(WindowName, strlen(WinName)); <br> &nbsp; SetLength(WindowClass, StrLen(CName)); <br> &nbsp; WindowName := StrPas(WinName); <br> &nbsp; WindowClass := StrPas(CName); <br> end; <br> MainForm.lbWinInfo.Items.AddObject('', WindowInfo); // Add to Objects array <br>end; <br><br>procedure TMainForm.btnGetWinInfoClick(Sender: TObject); <br>begin <br> EnumWindows(@EnumWindowsProc, 0); <br>end; <br><br>procedure TMainForm.FormDestroy(Sender: TObject); <br>var <br> i: integer; <br>begin <br> for i := 0 to lbWinInfo.Items.Count - 1 do <br> &nbsp; TWindowInfo(lbWinInfo.Items.Objects).Free <br>end; <br><br>procedure TMainForm.lbWinInfoDrawItem(Control: TWinControl; Index: Integer; <br> Rect: TRect; State: TOwnerDrawState); <br>begin <br> lbWinInfo.Canvas.FillRect(Rect); <br> with TWindowInfo(lbWinInfo.Items.Objects[Index]) do <br> begin <br> &nbsp; DrawText(lbWinInfo.Canvas.Handle, PChar(WindowName), <br> &nbsp; &nbsp; Length(WindowName), Rect,dt_Left or dt_VCenter); <br> &nbsp; Rect.Left := Rect.Left + hdWinInfo.Sections[0].Width; <br> &nbsp; DrawText(lbWinInfo.Canvas.Handle, PChar(WindowClass), <br> &nbsp; &nbsp; Length(WindowClass), Rect, dt_Left or dt_VCenter); <br> end; <br>end; <br><br>procedure TMainForm.hdWinInfoSectionResize(HeaderControl: <br> &nbsp;THeaderControl; Section: THeaderSection); <br>begin <br> lbWinInfo.Invalidate; // Force ListBox1 to redraw itself. <br>end; <br><br>end. <br><br>delphi开发人员指南的例子 <br> <br>来自: jwang, 时间: 2001-03-26 22:20:23, ID: 481311 &nbsp;<br>这个例子我见过。徐新华的DELPHI5从书中有。 <br>我要 <br>&lt;font color=#00ff00&gt;回调函数的概念、特点、功能、用法和在什么时候需要用到回调函数?&lt;/font&gt; <br> <br>来自: 房客, 时间: 2001-03-26 22:24:20, ID: 481314 &nbsp;<br>关注此题 <br> <br>来自: mikedeakins, 时间: 2001-03-26 22:34:34, ID: 481325 &nbsp;<br>调用的函数(内部代码)需要使用你编写的一个函数(外部代码)。 <br>用途:枚举。因为每局一般要遍历内部的链表结构,如果利用什么序号来访问就太慢了 <br>(算法复杂度基于n*n),利用回调函数,复杂度基于 n 。 <br>有的时候要使用数据类型无关,但是无法解决两个数据的一些关系,也需要调用回调函数。 <br>这个函数返回常量确定关系。(参见 TList 的排序回调函数) <br>回调函数很有用,不过别用得太多,否则程序的一部分代码看起来像是宏定义。 <br> <br>来自: jwang, 时间: 2001-03-26 23:00:34, ID: 481352 &nbsp;<br>&lt;font size=22 我好象明白了一些。&lt;/font&gt; <br>我刚学HOOK,见到CALLBACK函数,不知其它哪些地方还要用到它? <br><br> <br>来自: jwang, 时间: 2001-03-26 23:02:05, ID: 481353 &nbsp;<br>对不起,搞措大小了。 <br><br> <br>来自: jwang, 时间: 2001-03-26 23:04:44, ID: 481357 &nbsp;<br>请坛主把我的那个大字体的帖子删除。 <br>我重写一便“ <br>我刚学HOOK,见到CALLBACK函数,不知其它哪些地方还要用到它?” <br> <br>来自: 热血, 时间: 2001-03-27 9:48:20, ID: 481657 &nbsp;<br>callback都是api要求的 <br>比如enumprocess和setwindowhookex都要求函数是回调函数 <br> <br>来自: g622, 时间: 2001-03-27 9:49:23, ID: 481661 &nbsp;<br>看到那个兰色的&quot;ID&quot;了吗 点一下 自己改 <br> <br>来自: 55555, 时间: 2001-03-27 9:59:03, ID: 481675 &nbsp;<br>关注此题 <br> <br>来自: jwang, 时间: 2001-03-27 16:23:42, ID: 482198 &nbsp;<br>热血兄,可有详尽资料介绍: <br>回调函数的概念、特点、功能、用法和在什么时候需要用到回调函数? <br>EMAIL过来,我也该给分了! <br> <br>来自: 热血, 时间: 2001-03-28 9:09:21, ID: 482888 &nbsp;<br>这些都可以查msdn <br>不同的函数使用方法都不同啊 <br> <br>来自: jwang, 时间: 2001-05-21 15:01:08, ID: 538135 &nbsp;<br>多人接受答案了。 <br> <br>问题讨论没有结束 ...
 
问题: 什么是回调函数,最好有例子! ( 积分: 49 ) &nbsp;<br>分类: Windows API &nbsp;<br> <br>来自: M16, 时间: 2002-12-23 16:22:00, ID: 1530826 &nbsp;<br>顺便问一句,哪里有《英雄》的盗版卖??? <br> <br>来自: withdraw, 时间: 2002-12-23 16:27:00, ID: 1530844 &nbsp;<br>上网down <br>type test=function(string str); <br>procedure do_function(test test1); <br>var String str1; <br>begin <br>str1:=&quot;asdad&quot;; <br> &nbsp;test1(str1); <br>end <br><br>好像是这样 <br> <br>来自: jsxjd, 时间: 2002-12-23 16:38:00, ID: 1530886 &nbsp;<br>23. DLL和回调函数例子 <br>以下是完整的例子: <br><br>DLL 程序 <br><br>library Project2; <br><br><br>uses <br> SysUtils, <br> Classes; <br> function AddTwo(x,y:integer):integer;stdcall; <br> begin <br> &nbsp; Result:=x+y; <br> end; <br> function MultiTwo(x,y:integer):integer;stdcall; <br> begin <br> &nbsp; Result:=x*y; <br> end; <br>{$R *.RES} <br> exports AddTwo,MultiTwo; <br>begin <br>end. <br><br><br><br>调用程序 <br>unit Unit1; <br><br>interface <br><br>uses <br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, <br> StdCtrls; <br><br>type <br> TForm1 = class(TForm) <br> &nbsp; Button1: TButton; <br> &nbsp; procedure Button1Click(Sender: TObject); <br> private <br> &nbsp; { Private declarations } <br> public <br> &nbsp; { Public declarations } <br> end; <br><br>var <br> Form1: TForm1; <br><br>implementation <br><br>{$R *.DFM} <br>function AddTwo(x,y:integer):integer;stdcall;external 'project2.dll'; <br>function MultiTwo(x,y:integer):integer;stdcall;external 'project2.dll'; <br>type <br> TCallBackFun=function(x,y:integer):integer;stdcall; <br><br>function Myfun(x,y:integer;f:TCallBackFun):integer; <br>begin <br> result:=TCallBackFun(f)(x,y); <br>end; <br>procedure TForm1.Button1Click(Sender: TObject); <br>begin <br> showmessage(inttostr(MyFun(10,20,@AddTwo))); <br> showmessage(inttostr(MyFun(10,20,@MultiTwo))); <br>end; <br><br>end. <br><br> <br>来自: M16, 时间: 2002-12-23 16:49:00, ID: 1530949 &nbsp;<br>to jsxjd <br>你说的意思我大概明白了,但是向你这个dll中 <br>函数完全可以直接调用,为什么非要用什么回调函 <br>数呢,请进一步解释,谢谢! <br> <br>来自: wlmmlw, 时间: 2002-12-23 17:00:00, ID: 1531004 &nbsp;<br>把函数A做为一个参数传递给一个被调用函数B <br>这样B就可以反过来调用A了。 <br>比如B在列出一个目录下的所有子目录,如果它设置了一个回调用函数,这样它就可以在 <br>找到每个子目录的时候调用一下回调用函数来通知你,你就可以在回调用函数做某些操作。 <br><br> <br>来自: youou, 时间: 2002-12-23 17:13:00, ID: 1531061 &nbsp;<br>回调函数是一种特殊的引出函数,是由WINDOWDS环境直接调用的函数。 <br> &nbsp; &nbsp; &nbsp; 不是被应用程序调用,而是被WIN 32 DLL或其他DLL调用。 <br><br> <br>来自: vine, 时间: 2002-12-23 17:17:00, ID: 1531079 &nbsp;<br>可以看看<Delphi5 开发人员指南>里面的部分 <br>很多地方有这个的电子书呵 ! <br> <br>来自: pcexplorer, 时间: 2002-12-23 17:27:00, ID: 1531121 &nbsp;<br>回调函数很有用 <br>比如你的线程在一个单独的单元里,线程的功能是不断刷新主窗口上的进度条,如果不用回调 <br>函数那么你必须要做的是A(主单元)引用B,B引用A而且这样结构就很差,如果用了回调函数就 <br>只要A引用B就可以了。 <br>如: <br>TMyProc = procedure (iMax, iPosition: Integer); <br><br>//线程构造 <br>//FProc: Pointer; <br>constructor Create(AProc: Pointer); <br>begin <br> inherited Create(False); <br> FProc := AProc; <br>end; <br><br>procedure CallMyProc; <br>begin <br> TMyProc(FProc)(Max, Position); <br>end; <br><br>//OnExecute <br>synchronize(CallMyProc); <br>//这样主程序只要做一个函数来操纵本单元窗口上的东西就可以了 <br>procedure MyProc(iMax, iPosition: Integer); <br>begin <br> with Form1 do <br> begin <br> &nbsp; ProgressBar1.Max := iMax; <br> &nbsp; &nbsp;ProgressBar1.Position := iPosition; <br> end; <br>end; <br><br>//创建线程把函数地址传递到线程中,在线程中得到了地址就可以调用了, <br>//这样线程单元就完全独立开来了,不引用主窗口的单元却操纵了主窗口的东西 <br>with SomeThread.Create(@MyProc) do <br><br>//我在我的程序里经常用回调函数很有用 <br>//其实任何一个Windows程序都用到和回调函数在CreateWindow的时候就必须向Windows传递一个 <br>//函数地址,你回发现您并没有调用,但实际程序确实工作了,Why?因为Windows调用了这个函数, <br>//这个就是原理 <br> <br>来自: pcexplorer, 时间: 2002-12-23 17:32:00, ID: 1531141 &nbsp;<br>说了半天在给断代码吧 <br>unit Unit3; <br><br>interface <br><br>uses <br> Classes, Windows, Forms; <br><br>type <br> TMyCallBackProc = procedure (FMin, FMax, FPosition: integer); <br><br> TMyThread2 = class(TThread) <br> private <br> &nbsp; FProc: Pointer; <br> &nbsp; { Private declarations } <br> &nbsp; procedure SynchProcedure; <br> protected <br> &nbsp; procedure Execute; override; <br> public <br> &nbsp; constructor Create(const AProc: Pointer); <br> end; <br><br>implementation <br><br>{ TMyThread2 } <br><br>constructor TMyThread2.Create(const AProc: Pointer); <br>begin <br> FProc := AProc; <br> inherited Create(false); <br>end; <br><br>procedure TMyThread2.Execute; <br>begin <br> FreeOnTerminate := true; <br> Synchronize(SynchProcedure); <br>end; <br><br>procedure TMyThread2.SynchProcedure; <br>const <br> cMin = 0; <br> cMax = 100; <br>var <br> i: integer; <br>begin <br> if FProc &lt;&gt; nil then <br> &nbsp; for i := cMin to cMax do <br> &nbsp; begin <br> &nbsp; &nbsp; TMyCallBackProc(FProc)(cMin, cMax, i); <br> &nbsp; &nbsp; Sleep(100); <br> &nbsp; &nbsp; Application.ProcessMessages; <br> &nbsp; end; <br>end; <br><br>end. <br><br>//---------------------------------------- <br>procedure MyCallBackProc(FMin, FMax, FPosition: integer); <br>begin <br> with Form1.ProgressBar2 do <br> begin <br> &nbsp; Min := FMin; <br> &nbsp; Max := FMax; <br> &nbsp; Position := FPosition; <br> end; <br>end; <br><br>procedure TForm1.Button1Click(Sender: TObject); <br>var <br> MyThread2: TMyThread2; <br>begin <br> MyThread2 := TMyThread2.Create(@MyCallBackProc); <br>end; <br> <br>来自: youou, 时间: 2002-12-23 19:05:00, ID: 1531337 &nbsp;<br>呵~~ <br><br>不错。。还是上面两位说得清楚明白哦。。 <br><br> <br>来自: 人在昆明, 时间: 2002-12-23 19:09:00, ID: 1531344 &nbsp;<br>search 了一下硬盘,找到了一个算法的,以前写的 <br>题目 是那个 著名的生小兔的问题,说一堆兔子三个月后会生一对小兔,然后每个月 <br>生一对,小兔长到三个月后每个月又可以生一对,假设都不死,按照这个规律20个月 <br>后多少只兔子。 <br>分析过程: <br>{ <br> &nbsp; 不知道大家发现了没有 规律如下: <br>  数学中有一个以他的名字命名的著名数列: <br>  1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, …… <br> &nbsp; 从第三个月每个月的 兔子数目是前两个月的和 <br> &nbsp; 那么问题就变成了,求第 n 项 得值,那么就是一个递归而已了 <br>} <br>下面是 我的递归算法: <br>function TRabbit.RecursionRabbit(iNum: Integer): Integer; <br>var <br> I: Integer; <br>begin <br> if (iNum = 1) or (iNum = 2) then <br> &nbsp; Result := 1 <br> else <br> &nbsp; Result := RecursionRabbit(iNum - 1) + RecursionRabbit(iNum - 2) <br>end; <br> <br>来自: 人在昆明, 时间: 2002-12-23 19:11:00, ID: 1531346 &nbsp;<br>不好意思,看错啦,回调 去看看消息循环的那些东西吧,呵呵。 <br> <br>来自: youou, 时间: 2002-12-23 20:30:00, ID: 1531539 &nbsp;<br>我想给 pcexplorer 加分。。 <br>谢谢你讲得这么明白~~ <br><br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=1531533 <br>请来这领分。。。 <br><br><br><br> <br>来自: M16, 时间: 2003-01-17 11:45:00, ID: 1585907 &nbsp;<br>接受答案了. <br> <br>得分大富翁: pcexplorer
 
问题: 谁能形象地举例说明何为回调函数? ( 积分: 50 ) &nbsp;<br>分类: 控件 - 开发 &nbsp;<br> <br>来自: ykjt, 时间: 2005-11-17 14:01:00, ID: 3268474 &nbsp;<br>它是如何工作的?有何用途? <br> <br>来自: 41426277, 时间: 2005-11-17 14:05:22, ID: 3268476 &nbsp;<br>你的函数在另一个函数里运行, <br>形象吧. <br>回调函常用在设备上,如声卡,视频卡等等 <br> <br>来自: ykjt, 时间: 2005-11-17 14:49:27, ID: 3268536 &nbsp;<br>还不好理解 <br> <br>来自: 7030, 时间: 2005-11-17 15:03:23, ID: 3268570 &nbsp;<br>use mmsystem <br>function timeSetEvent(uDelay, uResolution: UINT; <br> lpFunction: TFNTimeCallBack; dwUser: DWORD; uFlags: UINT): MMRESULT; stdcall; <br>这个一个定时器创建函数,lpfunction就指一个回调函数,在这个回调函数里可以通过代码说明定时器触发时该做什么事,这样理解行否? <br> <br>来自: flamingo, 时间: 2005-11-17 18:19:09, ID: 3268870 &nbsp;<br>“形象地举例说明”???? <br><br>好吧,我来形象一番: <br><br>回调,好比是你是雌性的,一个公的来使用了,他就插进来,就算完成了一次回调。 <br><br>物理意义上,这个被回调的函数就象是个雌性的函数,具有回调能力的函数就是公函数,雌函数就是按照公函数的要求开放了一个口子,公函数在需要的时候就可以顺着这个口子插进来了。回去复习一下生理卫生的课程对你会有很大帮助的!!! <br> <br>来自: ykjt, 时间: 2005-11-18 20:22:57, ID: 3269060 &nbsp;<br>好象窗口函数是回调函数,它是如何工作的? <br> <br>来自: ykjt, 时间: 2005-11-18 20:40:18, ID: 3269068 &nbsp;<br>找了一点资料,为同样想知道本问题答案的朋友共享 <br>================================================ <br>使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。C++中一般要求在回调函数前加CALLBACK,这主要是说明该函数的调用方式。DialogBox的回调函数实际上是个窗口过程,用来处理所有消息。其定义为: <br> &nbsp; BOOL CALLBACK DialogProc( <br> &nbsp; &nbsp;<br> &nbsp; &nbsp;HWND hwndDlg, // handle of dialog box <br> &nbsp; &nbsp;UINT uMsg, // message <br> &nbsp; &nbsp;WPARAM wParam, // first message parameter <br> &nbsp; &nbsp;LPARAM lParam // second message parameter <br> &nbsp; &nbsp;); <br> &nbsp; 在Win32 API中有详细说明。一般使用C++ Builder或MFC的往往没有使用SDK编程的经验,建议找一些SDK编程的书看一下,否则很难理解如何使用窗口过程。 <br> &nbsp; 至于钩子函数,只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数,不过这种叫法不太流行。 <br>========================== <br>frank的意见: <br> &nbsp; 我对回调函数的理解虽然粗浅,但是我觉得会让人更容易理解:回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。 <br> &nbsp; 声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS系统。不要把它当作你的某个类的成员函数。 <br> &nbsp; &nbsp;===================== <br>ping的意见: <br> &nbsp; frank说:回调函数属于WINDOWS系统。我觉得不应该说回调函数是属于系统的。应该说是程序把这段代码的触发交由系统来做。而这种做法是WINDOWS提供的处理机制吧,因为消息是系统一手掌握着的,由系统来调用我们的程序对消息的处理部分,这样子会比较方便。不然我们又得花力气去读消息列表了。(不知道我说的对不对,接触系统还不深,请高手指教哦) <br>============================= <br>也即:回调函数只在约定的情况出现时才被系统调用,是这样吗?那么,是如何约定的呢? <br> <br>来自: ykjt, 时间: 2005-11-18 20:59:08, ID: 3269083 &nbsp;<br>function EnumWindows ( <br> lpEnumFunc: TFNWndEnumProc; <br> lParam: LPARAM): BOOL; stdcall; <br><br>type <br> EnumWindowsProc = function (Hwnd: THandle; <br> &nbsp; Param: Pointer): Boolean; stdcall; <br><br>function GetTitle (Hwnd: THandle; Param: Pointer): Boolean; stdcall; <br>var <br> Text: string; <br>begin <br> SetLength (Text, 100); <br> GetWindowText (Hwnd, PChar (Text), 100); <br> FormCallBack.ListBox1.Items.Add ( <br> &nbsp; IntToStr (Hwnd) + ': ' + Text); <br> Result := True; <br>end; <br><br>procedure TFormCallback.BtnTitlesClick(Sender: TObject); <br>var <br> EWProc: EnumWindowsProc; <br>begin <br> ListBox1.Items.Clear; <br> EWProc := GetTitle; <br> EnumWindows (@EWProc, 0); <br>end; <br>调用getTitle时,参数是如何传递给它? <br>Hwnd: THandle; <br>Param: Pointer <br>分别传入了什么参数? <br> <br>来自: lich, 时间: 2005-11-21 8:40:10, ID: 3270713 &nbsp;<br>就是你给个函数地址,我来调用 <br> <br>来自: ykjt, 时间: 2005-11-21 9:28:43, ID: 3270787 &nbsp;<br>有回调能力的一定是win api吗?自已能否编写具有回调能力的函数?谁有例子学习一下。 <br> <br>来自: lich, 时间: 2005-11-21 12:18:02, ID: 3271082 &nbsp;<br>回调只是一种进行通知的方法 <br> <br>来自: 风林坡, 时间: 2005-11-21 13:29:16, ID: 3271190 &nbsp;<br>回调函数就是将某种方法或者接口给对方,对方可以再需要的时候使用你提供的方法或者接口。 <br>回调用到的地方非常多,绝不仅限于WinAPI,在Delphi中,事件其实就是利用的回调机制,不过是类方法而已。 <br>举一个生活中的例子,电影中也能看到的,比如说某个组织的人要去办事情,在办事情的过程中可能要向组织报告工作或者请求指示等等,这个时候他需要某些方法能够联系到组织,组织就为他专门提供了一部手机和一部对讲机,手机用来报告工作进度,对讲机用来请求指示。这种情况,手机和对讲机就可以理解为是组织提供给他的回调函数:) <br><br>呵呵,不知道这个例子是否形象 <br> <br>来自: id_delphibbs, 时间: 2005-11-21 14:12:17, ID: 3271262 &nbsp;<br>你的电话号码,你的家庭地址就是回调,用途就是告诉别人你如何找到我。 但你不会打电话找自己三。 <br> <br>来自: jsxjd, 时间: 2005-11-21 14:12:47, ID: 3271263 &nbsp;<br>参数不是普通的数据,而是函数 <br> <br>来自: 刘麻子, 时间: 2005-11-21 14:19:44, ID: 3271276 &nbsp;<br>http://www.2ccc.com/article.asp?articleid=1923 , 看看&quot;程序21-3&quot;和&quot;程序21-4&quot; <br> <br>来自: 刘麻子, 时间: 2005-11-21 14:24:23, ID: 3271283 &nbsp;<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3266111 <br> <br>来自: 340340, 时间: 2005-11-21 14:40:28, ID: 3271316 &nbsp;<br>寒周老大flamingo的回复......同时感谢楼主找的资料 <br> <br>来自: ykjt, 时间: 2005-11-22 10:43:28, ID: 3272167 &nbsp;<br>谢谢各位 <br> <br>来自: 刘麻子, 时间: 2005-12-16 18:11:12, ID: 3299592 &nbsp;<br>flamingo &lt;&gt; aimingoo <br> <br>得分大富翁: 41426277-6,7030-6,flamingo-6,id_delphibbs-6,jsxjd-6,lich-6,风林坡-7,刘麻子-7,
 
在家说的我还是不太满意,能常情况下我们都是主动调用Windows API函数,但是在某些情况下Windows API也会调用我们写的自定义函数这就称为回调函数,通常情况下我们只知道在什么事件下我们自定义函数会被调用.但是我不理解什么是函数占位符. 以及如何具体运用.<br>请大家继续关注本贴.
 
接受答案了.
 
后退
顶部