Вопрос: Как организовать подгрузку ресурсов из DLL для разноязычных версий?
Как мне записать и считать из DLL свойство Caption компонента TButton(я делаю русскую и анг. версию) и при
переключении приложение должно считать из соответствующих DLL разные свойства компонентов).
Ответ :
Попробуем обьяснить. Процесс долгий но простой.
1. Создадим h-файл где будут идентификаторы сообщений
например
code:
--------------------------------------------------------------------------------
static const BT_NEW_CAPTION = 1;
static const BT_SAVE_CAPTION = 2;
static const BT_LOAD_CAPTION = 3;
....
--------------------------------------------------------------------------------
2. Создаем n-файлов для n языков, следующего содержания.
Например для руского
code:
--------------------------------------------------------------------------------
#include "consts.h"
STRINGTABLE
BEGIN
BT_NEW_CAPTION "Создать"
BT_SAVE_CAPTION "Сохранить"
BT_LOAD_CAPTION "Загрузить"
END
--------------------------------------------------------------------------------
и для английского
code:
--------------------------------------------------------------------------------
#include "consts.h"
STRINGTABLE
BEGIN
BT_NEW_CAPTION "New"
BT_SAVE_CAPTION "Save"
BT_LOAD_CAPTION "Load"
END
--------------------------------------------------------------------------------
3. при помощи утилиты brcc32 создаем из этих файлов res файлы, т.е.
в командой строке пишем
brcc32.exe -r lang_rus.rc
brcc32.exe -r lang_eng.rc
тем самым мы подготовили ресурсные файлы
4.создаем проект для руской длл к которому подключаем (Project->Add to project...)lang_rus.res.
Компилируем, получаем длл файл.
Повторяем шаг 4 для английской версии.
5.переходим к гланой программе. создаем функцию которая будет менять надписи на кнопках. Входные данные для функции
будет имя длл.
code:
--------------------------------------------------------------------------------
#include "consts.h"
void ChangeLang(String szDllName)
{
HINSTANCE hInst = LoadLibrary(szDllName.c_str());
if(NULL == hInst){
MessageBox(Application->Handle, String().sprintf("Cannot load the '%s' library ", szDllName).c_str(),
"Error", MB_OK | MB_ICONERROR);
return;
}
char szBuff[1024];
LoadString(hInst, BT_NEW_CAPTION, szBuff, sizeof(buff));
Form1->btNew->Caption = szBuff;
LoadString(hInst, BT_SAVE_CAPTION, szBuff, sizeof(buff));
Form1->btSave->Caption = szBuff;
LoadString(hInst, BT_LOAD_CAPTION, szBuff, sizeof(buff));
Form1->btLoad->Caption = szBuff;
FreeLibrary(hInst);
}
--------------------------------------------------------------------------------
6. вызываем эту функцию с нужным параметром, например
ChangeLang("lang_rus.dll");
!!!! файлы .длл должны быть в той же папке что и .ехе файл программы, в противном случае придется писать полный путь к длл.
Например, если в папке с прогрпммой есть подпапка Languages где находятся длл тогда вызов функции будет таким
ChangeLang("Languages\\lang_rus.dll");
--------------------------------------------------------------------------------
|