Delphi :获取调用函数的UnitName

nqwrtyyt  于 2023-06-29  发布在  其他
关注(0)|答案(2)|浏览(145)
unit MyFirstUnit;
  uses MyTranslateUnit;
  ...
  sText := Dictionary('text to translate', UnitName);
  ...
end.
unit AnotherUnit;
  uses MyTranslateUnit;
  ...
  sText := Dictionary('new text to translate', UnitName);
  ...
end.
unit MyTranslateUnit;
  function Dictionary(sTextToTranslate: string; sUnitName: string)
  begin
    // Here I need the UnitName of the caller
    Result := ...
  end;
end.

在我的程序中有很多地方我调用Dictionary(...)。如何避免将UnitName作为第二个参数传递?
是否可以在MyTranslateUnit中获取调用者的UnitName而无需第二个参数?
我想有一个像这样的功能
function Dictionary(sTextToTranslate:字符串)

daolsyd0

daolsyd01#

只要调用发生在类的方法内部,就可以简单地编写UnitName。每个 Delphi TObject都提供了class function UnitName: string;,它给出了声明类的单元的名称。
这不会给予您有可能省略第二个参数,但是当单元被重命名或者代码在单元之间被复制或移动时,它简化了维护。

**编辑:**有一个真实的的肮脏的黑客,使这个工作没有第二个参数,它也只工作在一个类的方法。我建议把这个作为最后的手段!删除一个参数的好处很容易在未来适得其反。

像这样为TObject声明一个 class helper

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继承的。

u0njafvf

u0njafvf2#

可能,但仅在每个单元中使用附加代码

type
  TDummy = class(TObject)
  end;

function Dictionary(sTextToTranslate: string): string;
begin
  Result := MyTranslateUnit.Dictionary(sTextToTranslate, TDummy.UnitName);
end;

相关问题