Вопрос: Как организовать подгрузку ресурсов из 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");



--------------------------------------------------------------------------------

	

Электронные Книги по компьютерным программам
На правах рекламы:
Логин
Пароль
Запомнить меня