一个关于 WndProc 的问题 (100分)

  • 主题发起人 主题发起人 ddev
  • 开始时间 开始时间
D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道,在 CreateWindow(Ex) 的过程中,要求 WndProc 是一个全局的函数指针,而 VCL 却能够把这个函数封装到类的成员函数表中,这实在是一个绝妙的手法,因为这样就可以把 API 中的回调函数也类似地封入类中(不知道行不行?我想应该可以吧,只是我不知道...)。但对于VCL 的源码,却怎么也看不明白,请教各位高手,这应该如何实现呢?能不能说得透彻些。谢谢。<br><br>示例:(例子是错误的,只是为说明实现要求)<br><br>type<br>&nbsp; &nbsp; TCallBackFunc = function(N: Longint): Longint;<br><br>function DoCallBack(Func: TCallBackFunc): Longint;<br>var<br>&nbsp; &nbsp; x: Longint;<br>begin<br>&nbsp; &nbsp; Result := Func(x);<br>end;<br><br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; Edit1.Text := IntToStr(DoCallBack(GetData));<br>end;<br><br>function TForm1.GetData(x: Integer): Longint;<br>begin<br>&nbsp; &nbsp; if x &gt; 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; Result := 100 else<br>&nbsp; &nbsp; &nbsp; &nbsp; Result := 0;<br>end;<br>
 
GetData(x: Integer): Longint;<br>是方法不是函数Delphi的方法和普通函数是有区别的.方法是一个结构<br>请参看Delphi的帮助TMethod :<br>type<br>&nbsp; TMethod = record<br>&nbsp; &nbsp; Code, Data: Pointer;<br>&nbsp; end;<br>Code是该方法的函数指针,Data是对象指针,就是方法里面那个隐含的Self。<br>所以你可以声明一个方法类型,就是把上面的函数的类型修改:<br>type<br>&nbsp; &nbsp;TCallBackFunc = function(N: Longint): Longint of object;<br>加上一个of Object;就变成了方法的指针。但就不能被除了Delphi和BCB之外的其他的语言调用了。<br>
 
&gt;&gt; 但对于VCL 的源码,却怎么也看不明白,请教各位高手,这应该如何实现呢?<br>&nbsp; &nbsp;关键是你现在懂什么呢????不然叫人白说你懂的呀!!!<br><br>呵呵~~~~~~~~~~~~~~~~
 
to wr960204:<br>谢谢你的答复。但我的确需要这样的一种处理。我写了一个规则处理函数(Dlls),<br>这个规则根据一个脚本描述(规则表)来修订系统内的数据。由于一次把所有可能<br>的变量传入函数完全是一种浪费,因此采用了一个回调函数,其格式为:<br>typedef void LOGICCALLBACK(LOGICVAR&amp; var, const int action);<br>EXTERN_EXPORT void __stdcall logic_exec(const char* expr, LOGICCALLBACK* call_back);<br>当解析过程遇到变量时,就可设 action = LA_GET ,并调用 call_back 来获取<br>变量的值及相关属性,而处理完成后,再次设 action = LA_SET,再调用 call_back <br>来通知系统更新变量的值。函数本身没有什么特殊,关键就是这个回调函数,因为我要<br>处理的数据及方法在系统中的一个类中。如果直接调用,则必定有:全局函数与成员函数<br>的错误。怎么办?
 
哈哈,解决!!!!<br><br><br>type<br>&nbsp; &nbsp; &nbsp; &nbsp; TCallBackProc = procedure(inst: Pointer; var x: Longint);<br><br>procedure GetData(inst: Pointer; func: TCallBackProc);<br>var<br>&nbsp; &nbsp; &nbsp; &nbsp; x: Longint;<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; func(inst, x);<br>end;<br><br>procedure FakeFunc(inst: Pointer; var x: Longint);<br>var<br>&nbsp; &nbsp; &nbsp; &nbsp; cls: TForm1;<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; cls := TForm1(inst);<br>&nbsp; &nbsp; &nbsp; &nbsp; cls.CallBackFunc(inst, x);<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; GetData(Self, FakeFunc);<br>end;<br><br>procedure TForm1.CallBackFunc(inst: Pointer; var x: Integer);<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; x := 100;<br>end;<br><br><br>如果其他人有什么新的看法,继续,待会再结...
 
好奇,我想问你一下,<br>你这样到底有什么很大的用处吗???<br><br>呵呵~~~~~~~~~~~~~~~~
 
to netsoft:<br>用标准C写的Dll,其中的回调函数能够直接在 BCB/Delphi 的类中调用吗?<br>就象我举的 GetData() 函数,如果该函数在 Dll 中,那么直接调用我想是不行的。<br><br>我解决的就是这个问题,你有更好的建议么?<br><br>
 
其实,说明白些,是在我的一个应用中,处理一批对象,但该对象根据其中某些值<br>的变化,会影响到其它的数据的变动。而这个变动规则,我暂时还不能完全定义,<br>或者说是不可完整定义的。因此把这个规则定义成一个格式化的脚本,处理数据时,<br>直接分析这个规则文本来纠正这些对象中的数值。这样的好处就是:如果规则变动,<br>程序可以不动。由于这个解析规则是写到 Dll 中的,因此才会有上述的问题。举个<br>例子:如果有一个对象<br>MyObject {<br>&nbsp; &nbsp; int &nbsp;level;<br>&nbsp; &nbsp; double value;<br>}<br><br>在程序内部,根据处理,比如:level 现在 为 3,value 计算出一个结果,然后,<br>检验规则,如果发现当 level &gt; 2 时,要求 value 必须不小于某个值或者需要加<br>上某个值,因此可以把这个数据放到规则表中去检验,以校正 value。而规则表的<br>格式就类似于:level &gt; 2 ? value *= 1.5;
 
你的意思是调用时传一个 TCallBackFunc 出去吧,<br>然后自己可以写一个程序或直接处理,<br>非常好呀,<br><br>呵呵~~~~~~~~~~~~~~~~~
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
后退
顶部