Delphi:如何获得Calling-function或function-I-am-in?

时间:2017-10-14 21:29:13

标签: delphi

有没有办法获得Calling-function(最佳)或功能-I-am-in(2nd)? (用于设置该函数的回调) 我宁愿不必每次都指定我调用的函数的名称。请注意,这些函数是类方法。

以下是我正在做的事情:(并且不喜欢)

procedure TX.SetMeTimer(FAnimate:Tproc);
begin
  Timer1.OnTimer:=FAnimate;
end; 

procedure TX.Animate1;
begin
  SetMeTimer(Animate1);
  DoSomething;
end;
procedure TX.Animate2;
begin
  SetMeTimer(Animate2);
  DoSomething;
end;
// to TXAnimate500, until you are sick of copying the function name....

这就是我想要的样子:(调用函数方法)

procedure TX.StartReEntrantTimer(FAnimate:Tproc);
begin
  Timer1.OnTimer:=CallingFunction;
end; 

procedure TX.Animate;
begin
  SetMeTimer();
  DoSomething;
end;

或功能-I-am-in方法

procedure TX.StartReEntrantTimer(FAnimate:Tproc);
begin
  Timer1.OnTimer:=F;
end; 

procedure TX.Animate;
begin
  SetMeTimer(FunctionIamIn);
  DoSomething;
end;

为什么呢?对使用此工具的用户进行时间和动作研究,输入错误的函数名称是一个重要的错误原因,我想将其删除。

1 个答案:

答案 0 :(得分:1)

Delphi附带的DUnit测试代码的单元TestFramework.pas有一个函数CallerAddr(在Delphi 2005中)实现如下:

function CallerAddr: Pointer; {$IFNDEF CLR} assembler; {$ENDIF}
{$IFDEF CLR}
begin
  Result := nil;
 end;
{$ELSE}
const
  CallerIP = $4;
asm
   mov   eax, ebp
   call  IsBadPointer
   test  eax,eax
   jne   @@Error

   mov   eax, [ebp].CallerIP
   sub   eax, 5   // 5 bytes for call

   push  eax
   call  IsBadPointer
   test  eax,eax
   pop   eax
   je    @@Finish

@@Error:
   xor eax, eax
@@Finish:
end;
{$ENDIF}

(以后的版本已被修改,因此您应该检查自己的Delphi版本的实现。)

它用于在DUnit测试中在调用方法的地址处引发异常。应该可以使用它或至少使其适应您的目的。

请注意,这可能仅适用于Win32程序。