情况是:

unit abc;

interface

resourcestring
  aabbcc = 'my text here';

implementation

end.


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

最佳答案

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

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;


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

关于delphi - Delphi如何从resourcestring单元中找到资源名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29145598/

10-10 23:24
查看更多