Советы по Delphi



         

Таблицы строк - часть 2


После того, как .res-файл прилинкуется к приложению, вы можете воспользоваться связанными ресурсами из любого модуля вашего проекта, даже если вы определили директиву $R в секции реализации (implementation) другого модуля.

Вот пример использования Windows API функции LoadString() для загрузки в массив символов третьей строки из таблицы строк:

if LoadString(hInstance,3,@a,sizeof(a)) <> 0 then ....

В этом примере функция LoadString() передает дескриптор (hInstance) модуля, содержащего ресурс, индекс требуемой строки, адрес массива символов, куда будет передана строка и размер самого массива. Функция LoadString возвращает количество реально переданных символов без учета терминатора. Будьте внимательны: при использовании UNICODE количество загружаемых байт будет другим.

Ниже приведен исчерпывающий пример создания многоязыкового приложения с помощью Delphi. Приложение совместимо как с 16, так и с 32-битными версиями Delphi.

Для этого вам придется создать два идентичных .rc-файла, один для 16-битной версии, второй для 32-битной, т.к. используемые ресурсы для каждой платформы свои. В данном примере мы создадим один файл с именем STRTBL16.rc, а другой с именем STRTBL32.rc. Скомпилируйте файл STRTBL16.rc с помощью 16-битного компилятора BRCC.exe (расположен в каталоге BIN Delphi 1) и файл STRTBL32.rc с помощью BRCC32.exe (расположен в той же директории 32-битной версии Delphi).

Во время работы приложения мы выясняем язык операционной системы, установленный по умолчанию. Метод получения такой информации отличается для 16- и 32-битной версии Windows. Чтобы сделать код более читабельным, мы позаимствовали "языковые" константы из файла Windows.pas, применяемого в 32-битной версии Delphi.

{$IFDEF WIN32}
{$R STRTBL32.RES}{$ELSE}
{$R STRTBL16.RES}const LANG_ENGLISH = $09;const LANG_SPANISH = $0a;const LANG_SWEDISH = $1d;{$ENDIF}


function GetLanguage : word;
{$IFDEF WIN32}
{$ELSE}
vars : string;i : integer;{$ENDIF}
begin
{$IFDEF WIN32}
GetLanguage := GetUserDefaultLangID and $3ff;{$ELSE}
s[0] := Char(GetProfileString('intl','sLanguage','none',@s[1],sizeof(s)-2));for i := 1 to length(s) dos[i] := UpCase(s[i]);if s = 'ENU' then GetLanguage := LANG_ENGLISH elseif s = 'ESN' then GetLanguage := LANG_SPANISH elseif s = 'SVE' then GetLanguage := LANG_SWEDISH elseGetLanguage := LANG_ENGLISH;{$ENDIF}
end;


procedure TForm1.FormCreate(Sender: TObject);
var
a : array[0..255] of char;StrTblOfs : integer;begin

{Получаем текущий язык системы и начало соответствующих строк в таблице}case GetLanguage ofLANG_ENGLISH : StrTblOfs := 0;LANG_SPANISH : StrTblOfs := 16;LANG_SWEDISH : StrTblOfs := 32;elseStrTblOfs := 0;end;
{Загружаем и устанавливаем заголовок кнопки "Yes" в соответствии с языком}if LoadString(hInstance,StrTblOfs + 1,@a,sizeof(a)) <> 0 thenButton1.Caption := StrPas(a);
{Загружаем и устанавливаем заголовок кнопки "No" в соответствии с языком}if LoadString(hInstance,StrTblOfs + 2,@a,sizeof(a)) <> 0 thenButton2.Caption := StrPas(a);end;

[000228]




Содержание  Назад  Вперед