请问在使用下列代码时是否有一些优势(例如更少的存储空间、提高速度等):
resourcestring
MsgErrInvalidInputRange = 'Invalid Message Here!';
取代
const
MsgErrInvalidInputRange : String = 'Invalid Message Here!';
请问在使用下列代码时是否有一些优势(例如更少的存储空间、提高速度等):
resourcestring
MsgErrInvalidInputRange = 'Invalid Message Here!';
取代
const
MsgErrInvalidInputRange : String = 'Invalid Message Here!';
使用const选项比resourcestring更快,因为后者将调用Windows API获取资源文本。您可以通过使用一些缓存机制来加快速度。这就是我们在Enhanced Delphi RTL中所做的。
如果您需要多次访问resourcestring内容,那么首先将其加载到字符串中是一个好主意。
resourcestring的主要目的是允许程序进行i18n(国际化)。
您可以在某些Delphi IDE版本中使用翻译管理器。但它依赖于外部DLL。
您可以使用从Linux世界引入的gettext系统,即http://dxgettext.po.dk,它依赖于外部.po文件。
我们在框架中包含了自己的i18n机制,它可以翻译和缓存资源字符串文本,并依赖于外部的.txt文件(您可以使用UTF-8或Unicode文本文件,从Delphi 6到XE)。缓存使其与const用法一样快。请参见http://synopse.info/fossil/finfo?name=SQLite3/SQLite3i18n.pas
还有其他开源或商业解决方案。
关于存储大小,resourcestring被存储为UC2缓冲区。因此,在Delphi 2009之前,resourcestring将比string使用更多的内存。自Delphi 2009以来,所有字符串都是unicodestring,即UCS2,因此您不会有更多的存储空间。在所有情况下,文本的存储大小不是应用程序的最大大小参数(位图和代码大小对最终exe有更大的影响)。
资源字符串存储在exe资源的STRINGTABLE条目中,常量存储为固定数据段的一部分。由于它们是资源部分的一部分,因此您可以提取它们和DFMs,将其翻译并存储在资源模块(仅数据DLL)中。当Delphi应用程序启动时,它会查找该DLL,并使用其中的字符串来加载翻译,而不是使用包含在EXE中的字符串。
Embarcadero docwiki介绍了如何使用Translation Manager,但许多其他Delphi翻译工具也使用资源字符串。
使用resourcestring,编译器会将这些字符串作为一个字符串表资源放在可执行文件中,这样任何人(比如你的翻译团队)都可以使用资源编辑器进行编辑而无需重新编译应用程序或访问源代码。
还有第三个选项:
const MsgErrInvalidInputRange = '无效的消息!';
后者应该更高效,因为它告诉编译器不要在数据段中分配空间,而是可以将字符串放在代码段中。另外,请记住,使用类型常量所能做的取决于$WRITEABLECONST指令,尽管我不知道编译器何时打开或关闭。
asm S db 'foo'
并使用一些技巧将 OFFSET S 传递到外部作用域。如果我没记错的话,可写类型常量和初始化变量是完全等价的。 - Free Consulting