【问题标题】:Delphi How can i find a resource name from resourcestring unitDelphi 如何从资源字符串单元中找到资源名称
【发布时间】:2015-03-19 13:15:01
【问题描述】:

情况是:

unit abc;

interface

resourcestring
  aabbcc = 'my text here';

implementation

end.

从我的应用程序中,我收到了错误代码“aabbcc”。是否可以使用错误代码访问资源名称 aabbcc ?

【问题讨论】:

  • 您的问题我不清楚,抱歉,请检查PResStringRec(@aabbcc)^.Identifier 表达式是否对您有用。

标签: delphi resourcestring


【解决方案1】:

我想您正在要求具有以下签名和行为的函数:

function GetNamedResourceString(const Name: string): string;

Assert(GetNamedResourceString('aabbcc') = 'my text here');

资源字符串存储在程序中的字符串表资源中,其中每个字符串都有一个数字索引。您在程序中使用的命名标识符在运行时不会保存在任何地方。因此,没有内置方法可以获取文本 'aabbcc' 并发现它与哪个字符串资源相关联。

但是,一种方法可以在您的代码中获取 Delphi resourcestring 标识符并发现其数字 ID。将表达式@aabbcc 类型转换为PResStringRec,然后读取其Identifier 字段。查看 System.pas 中的 LoadResString 以了解 RTL 如何使用此信息。

您可以在运行时使用PResStringRec 值来构建TDictionary<string, PResStringRec>,然后使用该字典来实现上述假设的GetNamedResourceString 函数。

NamedResources := TDictionary<string, PResStringRec>.Create;
NamedResources.Add('aabbcc', PResStringRec(@aabbcc));

function GetNamedResourceString(const Name: string): string;
begin
  Result := LoadResString(NamedResources[Name]);
end;

如果我是为实际项目执行此操作,我可能会使用预构建脚本来解析输入文件,以根据相应的 resourcestring 声明自动生成对 NamedResources.Add 的调用。

【讨论】:

  • 良好的指示。谢谢。
【解决方案2】:

您的resourcestring 被编译为字符串表资源。这些由数字标识符标识。编译器维护您声明的resourcestring 实例和数字标识符之间的映射。当您访问 resourcestring 时,编译器知道数字标识符,并发出使用该标识符的代码。本质上,您希望做的是能够从您的 resourcestring 的名称和数字标识符进行映射。不幸的是,该地图仅在编译期间存在。它不包含在可执行文件中。

您唯一的希望是编译器为资源字符串生成 RTTI 信息。但是,它不会这样做,除非我错了。

鉴于这些限制,您将需要提出自己的机制来映射名称和资源字符串。一种可能性是避免使用内置的resourcestring,并通过您自己的机制管理字符串表资源及其标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多