Подтвердить что ты не робот

Есть ли преимущество в использовании resourcestring вместо строки const?

Не могли бы вы сказать мне, есть ли какое-то преимущество (меньше места для хранения, увеличения скорости и т.д.) при использовании:

resourcestring
    MsgErrInvalidInputRange = 'Invalid Message Here!';

вместо

const
    MsgErrInvalidInputRange : String = 'Invalid Message Here!';
4b9b3361

Ответ 1

Опция const будет быстрее, чем resourcestring, потому что позже вызывается Windows API для получения текста ресурса. Вы можете сделать это быстрее, используя некоторый механизм кеширования. Это то, что мы делаем в расширенном RTF Delphi.

И это хорошая идея, чтобы сначала загрузить resourcestring в строку, если вам придется много раз обращаться к ресурсу resourcestring.

Основная задача resourcestring - разрешить i18n (интернационализация) вашей программы.

У вас есть Менеджер переводов с некоторыми версиями среды разработки Delphi. Но он зависит от внешних DLL.

Вы можете использовать систему gettext, исходящую из мира Linux, из http://dxgettext.po.dk, которая зависит от внешних файлов .po.

Мы включили наш собственный механизм i18n в нашу структуру, который переводит и кэширует текст resourcestring и использует внешние .txt файлы (вы можете использовать текстовые файлы UTF-8 или Unicode, от Delphi 6 до XE). Кэширование делает это так же быстро, как использование константы. См. http://synopse.info/fossil/finfo?name=SQLite3/SQLite3i18n.pas

Существуют другие решения с открытым исходным кодом или коммерческие решения.

О хранении размера, resourcestring хранятся как буферы UC2. Таким образом, resourcestring будет использовать больше памяти, чем строка до Delphi 2009. Поскольку Delphi 2009, все строки являются unicodestring, то есть UCS2, поэтому у вас не будет больше размера хранилища. Во всех случаях размер хранилища для текста не является большим параметром размера для приложения (растровые изображения и размер кода имеют гораздо больший эффект для конечного exe).

Ответ 2

Строки ресурсов хранятся как записи STRINGTABLE в вашем ресурсе exe, константы хранятся как часть сегмента фиксированных данных. Поскольку они являются частью раздела ресурсов, вы можете извлечь их и DFM, перевести их и сохранить в модуле ресурсов (только для данных DLL). Когда приложение Delphi запускается, он ищет эту DLL и будет использовать строки из него вместо тех, которые включены в ваш EXE, для загрузки переводов.

Документация Embarcadero docwiki охватывает Менеджер переводов, но многие другие инструменты перевода Delphi также используют строки ресурсов.

Ответ 3

Как уже упоминалось, строки resourcestring будут включены в отдельный ресурс в вашем exe и, как таковые, имеют преимущества, когда вам нужно обслуживать несколько языков в пользовательском интерфейсе вашего приложения.

Как уже упоминалось, константные строки включены в раздел данных вашего приложения.

До D2007

В версиях Delphi до D2007 константные строки были сохранены как строки Ansi, требующие одного байта на символ, тогда как строки ресурсов будут храниться в UTF-16: кодировка по умолчанию Windows (хотя, возможно, не для Win9x). IIRC D2007 и предыдущие версии не поддерживали кодированные файлы UTF-8. Таким образом, любые строки, закодированные в ваших источниках, должны поддерживаться кодами ANSI, и, как следствие, они не выходят за рамки многоязычной плоскости Unicode. Это означает, что будет использоваться только UCS-2 часть UTF-16, и все строки могут храниться в двух байтах на символ.

Вкратце: до строк константы D2007 принимают один байт на символ, строки ресурсов берут два байта на символ.

D2009 и

Delphi был включен в Unicode в версии D2009. С тех пор все немного по-другому. Строки Resourcestring сохраняются как UTF-16. Никакой другой вариант здесь, поскольку они "управляются" Windows.

Строки Consts - это совсем другая история. Поскольку D2009 Delphi хранит несколько версий каждой строки const в вашем exe. Каждая версия в другой кодировке. Константу можно сохранить как строки Ansi, строки UTF-8 и строки UTF-16.

Какое из этих кодировок сохраняется, зависит от использования константы. По умолчанию будет использоваться UTf-16, поскольку это стандартная внутренняя кодировка Delphi. Назначьте ту же константу "нормальной" (UTF-16) строке, а также переменной AnsiString, а константа будет сохранена в exe как UTF-16, так и Ansi...

De-озвучивание

По внешнему виду (экспериментируя с D5 и D2009) Delphi "де-dupes" const строками, тогда как это не делает этого для строк resourcestring.

Ответ 4

С помощью resourcestring компилятор помещает эти строки в качестве ресурса stringtable в исполняемый файл, позволяя кому-либо (например, вашей команде перевода) редактировать их с помощью редактора ресурсов без необходимости перекомпилировать приложение или иметь доступ к исходному коду.

Ответ 5

Также есть третий вариант:

Const   MsgErrInvalidInputRange = 'Неверное сообщение здесь!';

Последний может быть более функциональным, потому что компилятор не выделяет пространство в сегменте данных, он может помещать строку в сегмент кода. Также помните, что то, что может быть сделано с типизированными константами, зависит от директивы $WRITEABLECONST, хотя я не знаю, что именно компилятор, когда он включен или выключен.