Delphi:获取调用函数的UnitName

时间:2018-03-14 09:37:59

标签: delphi

class

unit MyFirstUnit;
  uses MyTranslateUnit;
  ...
  sText := Dictionary('text to translate', UnitName);
  ...
end.

unit AnotherUnit;
  uses MyTranslateUnit;
  ...
  sText := Dictionary('new text to translate', UnitName);
  ...
end.

我的程序中有很多地方我称之为字典(...)。如何避免将UnitName作为第二个参数传递?
是否可以在没有第二个参数的情况下在MyTranslateUnit中获取调用者的UnitName?

我想要一个像

这样的功能
  

function Dictionary(sTextToTranslate:string)

1 个答案:

答案 0 :(得分:1)

只要调用发生在类的方法中,您就可以简单地编写UnitName。每个Delphi TObject都提供class function UnitName: string;,它给出了声明类的单位名称。

这不会让您省略第二个参数,但它简化了重命名单位或在单位之间复制或移动代码时的维护。

编辑:如果没有第二个参数,有一个真正的肮脏黑客可以使它工作,它也只能在类的方法中工作。我建议只能作为最后的手段使用它!删除一个参数的好处很容易在将来适得其反。

为TObject声明一个类助手,如下所示:

type
  TRealDirtyDontDoItObjectHelper = class helper for TObject
  public
    class function Dictionary(const sTextToTranslate: string): string;
  end;

implementation

class function TRealDirtyDontDoItObjectHelper.Dictionary(const sTextToTranslate: string): string;
begin
  { whatever implementation should go here }
  Result := UnitName + ': ' + sTextToTranslate;
end;

现在你可以打电话给

Caption := Dictionary('title');

UnitName赋予方法所属类的单元的任何方法内。请注意,这意味着当前实例的类,而不一定是声明方法的一些继承类。

我还应该提一下,这个用于TObject 的类助手不会干扰任何其他类的类助手,即使它们明显继承自TObject