有没有办法获得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;
为什么呢?对使用此工具的用户进行时间和动作研究,输入错误的函数名称是一个重要的错误原因,我想将其删除。
答案 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程序。