如何在Delphi中获取当前过程/函数的名称(作为字符串)

And*_*and 25 delphi procedure compile-time

是否可以在过程/函数中获取当前过程/函数的名称作为字符串?我想在编译时会有一些"宏"扩展.

我的情况是这样的:我有很多程序被给予记录,他们都需要从检查记录的有效性开始,因此他们将记录传递给"验证程序".如果记录无效,验证程序(所有程序都是同一个程序)会引发异常,并且我希望异常的消息不包括验证程序的名称,而是包含调用验证程序的函数/过程的名称程序(自然地).

就是,我有

procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
 if <StructIsInvalid> then
    raise Exception.Create(Sender + ': Structure is invalid.');
end;
Run Code Online (Sandbox Code Playgroud)

然后

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SomeProc1');
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SomeProcN');
  ...
end;
Run Code Online (Sandbox Code Playgroud)

如果我可以写出类似的内容,那么它会更容易出错

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, {$PROCNAME});
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, {$PROCNAME});
  ...
end;
Run Code Online (Sandbox Code Playgroud)

然后每次编译器遇到{$ PROCNAME}时,它只是将当前函数/过程的名称替换为"宏"作为字符串文字.

更新

第一种方法的问题在于它容易出错.例如,由于复制粘贴,你很容易弄错:

  procedure SomeProc3(const Struct: TMyStruct);
  begin
    ValidateStruct(Struct, 'SomeProc1');
    ...
  end;
Run Code Online (Sandbox Code Playgroud)

或错别字:

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SoemProc3');
  ...
end;
Run Code Online (Sandbox Code Playgroud)

或者只是暂时的混淆:

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SameProc3');
  ...
end;
Run Code Online (Sandbox Code Playgroud)

Fra*_*ois 10

我们正在做类似的事情,只依赖于一个约定:在一开始就把SMethodName一个const 包含函数名.
然后我们所有的例程都遵循相同的模板,我们在Assert和其他异常引发中使用这个const.
由于const与常规名称的接近程度,很少有机会将拼写错误或任何差异留在那里很长时间.
YMMV当然......

procedure SomeProc1(const Struct: TMyStruct);
const
  SMethodName = 'SomeProc1';
begin
  ValidateStruct(Struct, SMethodName);
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
const
  SMethodName = 'SomeProcN';
begin
  ValidateStruct(Struct, SMethodName);
  ...
end;
Run Code Online (Sandbox Code Playgroud)

  • ......以及我最终解决的解决方案.但是,如果Delphi编译器的未来版本可以支持简单的宏,那将会很棒.据我所知,这将是微不足道的实施. (4认同)

Dav*_*vid 8

我认为这是这个问题的重复:如何在Delphi 7中获取当前方法的名称?

答案是,为此,您需要在项目中使用某种形式的调试信息,并使用例如JCL函数从中提取信息.

我要补充一点,我没有在D2009/2010中使用过新的RTTI支持,但如果你能用它做一些聪明的话,我也不会感到惊讶.例如,这将向您展示如何列出类的所有方法,并且每个方法都由TRttiMethod表示.它来自TRttiNamedObject,它具有Name属性,该属性"指定反射实体的名称".我确信必须有一种方法来获取你当前所处的位置,即你当前所处的方法.这都是猜测,但试着去试试吧!