情况是:
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/