Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/37: Рейтинг темы: голосов - 37, средняя оценка - 4.97
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069

DLL как контейнер языковых файлов

14.10.2011, 10:46. Показов 8434. Ответов 53
Метки нет (Все метки)

Доброе утро! Прошу совета у опытных программистов!
Разумно ли использовать DLL как контейнер языков приложения?
Если да то помогите осуществить таккак я с DLL не работал.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.10.2011, 10:46
Ответы с готовыми решениями:

Использование dll как контейнер для файлов в builder 6
Пишу игру. Нужно спрятать BMPшные картинки в dll и прямо оттуда их загружать в Image. Как это реализовать именно в 6'ом builder'е?

DLL, как контейнер изображений.
Тут прилеплена тема DLL, как контейнер изображений. На скриншоте показано окно с параметрами добавленного изображения(там идентификатор...

Builder 6. DLL, как контейнер для изображений
Вот в этой статье все замечательно расписано про DLL как контейнер для изображений. Возможно глупый вопрос, но в С++ Builder 6 этот процесс...

53
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 10:59
Проект рад хе2, а ты пробовал на 6 билдере я так думаю
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
20.10.2011, 13:33  [ТС]
Цитата Сообщение от Flyer Посмотреть сообщение
Проект рад хе2, а ты пробовал на 6 билдере я так думаю
Builder 6 его вобще не видит как Project, видать пошол большой разрыв между поколениями Builderov

Добавлено через 1 час 7 минут
---------------------------------------------------------------------------------------------
Ответ на мой вопрос решит мою проблему с языками...

Как вместо того чтоб при загрузке языка не писать все названия как в примере:
пример:
C++
1
2
3
Button1->Caption = Ini->ReadString("Buttons","Button1","");
  Label1->Caption = Ini->ReadString("Labels","Label1","");
  CheckBox1->Caption = Ini->ReadString("CheckBoxs","CheckBox1","");
А написать одной строчкой типа:
C++
1
Ini->ReadString("Все компоненты","Caption","");
и чтоб все Captionы сменились на те что в ini.

Добавлено через 33 минуты
Из всего изученного я понял что надо писать для каждого компонента свой отдельный оператор загрузки Captiona из ини.
Надо написать код который будет загружать Captionы из ини все по одной команде.
0
Прогер
 Аватар для Programmer.
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
20.10.2011, 14:50
Samrisbe,
Цитата Сообщение от Samrisbe Посмотреть сообщение
Легче всего так и сделать но я присоеденяюсь к той партии которая за хранение языковых настроек в ini, и врятли обрету покой пока не сделаю как советует уважаемый LK.
Programmer мои соболезнования по поводу компа. Если хоть чемто смогу тебе помочь, я буду только рад.
Спасибо дружишее, комп не жално(Шас лучще, новый комп купил), Я сегодня собераюс к другу пойти и достать проект с того винта а то 2 месяца царапал внем

Ну Я тоже сделал вчера в ини, не выжу и внем проблем

Я както в цикле сделал, Вечером покажу если хочеш.
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
20.10.2011, 15:58  [ТС]
Я вот как придумал но пока немогу осуществить выбивает ошибку при исполнении программы:

поэтапно мои действия:
шаг первый:
У меня четыре CheckBoxа выбора языка, я выбираю первый "украинский"
1. Украинский v
2. Руский
3. Английский
4. Эстонский

шаг второй:
Кликаю по батону сменить язык на выбранный в : CheckBox->Checked == true
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (CheckBox1->Checked == true) // если выбран Украинский
TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Ukr.ini");// подключаю ini с украинским языком
 
if (CheckBox2->Checked == true) // если выбран Русский
TIniFile *Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Rus.ini");// подключаю ini с Русским языком
 
// и считываю данные из ini
  Button1->Caption = Ini->ReadString("Buttons","Button1","");
  Label1->Caption = Ini->ReadString("Labels","Label1","");
  CheckBox1->Caption = Ini->ReadString("CheckBoxs","CheckBox1","");
// отключаю ini
  delete Ini;
по идеи все ок но компилятору такой вариант не нравится и он говорит:
C++
1
[BCC32 Error] Unit1.cpp(88): E2451 Undefined symbol 'Ini'
Про последний шаг моих действий:
C++
1
2
3
  Button1->Caption = Ini->ReadString("Buttons","Button1","");
  Label1->Caption = Ini->ReadString("Labels","Label1","");
  CheckBox1->Caption = Ini->ReadString("CheckBoxs","CheckBox1","");
Если эту ошибку исправить получится отличный вариант!

Добавлено через 34 минуты
Ура я сделал это сам

Четкая смена языка причем не надо писать отдельный оператор на каждый язык, я просто подсовываю под чтение тот ини который соответствует выбору языка пользователем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  TIniFile* Ini;
if (CheckBox2->Checked == true){
   Ini =  new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Rus.ini");}
if (CheckBox3->Checked == true){
   Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Eng.ini");}
if (CheckBox4->Checked == true){
   Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Ukr.ini");}
if (CheckBox5->Checked == true){
   Ini = new TIniFile(ExtractFilePath(Application->ExeName)+"\\Lang\\Est.ini");}
 
  Button1->Caption = Ini->ReadString("Buttons","Button1","");
  Label1->Caption = Ini->ReadString("Labels","Label1","");
  CheckBox1->Caption = Ini->ReadString("CheckBoxs","CheckBox1","");
 
  delete Ini;
Блин всю ночь и пол дня угрохал чтоб сделать так как мне хотелось.
LK твои пример я так и не понял, аемсори.
Конечно не без помощи добрых людей тобиш форумчан всем спасибо.
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 17:59
Programmer., как сдох и как погиб ?
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
20.10.2011, 18:09  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
Programmer., как сдох и как погиб ?
С ним все впорядке он купил новый ПК. Теперь программы будут вылетать как горячии пирожки
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 18:10
да я уже в курсе

Цитата Сообщение от Samrisbe Посмотреть сообщение
1. ...не надо писать отдельный оператор на каждый язык, я просто подсовываю под чтение тот ини который соответствует выбору языка пользователем.
C++
1
2
3
  TIniFile* Ini;
if (CheckBox2->Checked == true){
   Ini =  new TIniFile
2. твои пример я так и не понял...
а разве в моих "примерах" этого не было - объявления глобальной переменной ини , радиокнопок вместо твоих чекбоксов и дальше все то, что ты придумал за всю ночь и пол-дня:
C++
1
2
3
4
5
6
7
8
  TIniFile * Eng;
...
void __fastcall TFormMain::RadioButtonLEngClick(TObject *Sender)
{
//
  FILE *F;
  Eng = new TIniFile(fEng);
//...
?
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
20.10.2011, 18:22  [ТС]
Да теперь вижу...
Я весь форум перерыл все темы и варианты связанные с ини, и ни шиша, в итоге гдето в интернете нашел пример где в ини записывалось с переменной и обратно читалось в переменную, и тогда меня осенила мысль объявить переменную тот или иной языковой ини, покрутил повертел подумал покурил потом опять подумал потом поел глотнул винца потом поцеловал жену покурилпнул кота сел за комп и написал с нуля то что я уже внедрил в свой прект№1

Я думаю твой пример я не понял потамучто там все в куче, и мне было тяжело оттуда чтото выудить, из твоих сообщений я понял только одно структуру ини файла, и это мне здорого помогло!

Бульк еще одна бутылочка в твою коробку
1
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 19:27
упистили мой вопрос =/
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// ---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <IniFiles.hpp>
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
UnicodeString lng;
TIniFile *ini = new TIniFile("lang.ini");
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
    RadioGroup1->Caption = ini->ReadString("En", "Group_name", "");
    RadioGroup1->Items->Strings[0] = ini->ReadString("En", "Option1", "");
    RadioGroup1->Items->Strings[1] = ini->ReadString("En", "Option2", "");
    RadioGroup1->Items->Strings[2] = ini->ReadString("En", "Option3", "");
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    switch (RadioGroup1->ItemIndex) {
    case 0:
        lng = "En";
        break;
    case 1:
        lng = "Ua";
        break;
    case 2:
        lng = "Ru";
        break;
    }
 
    RadioGroup1->Caption = ini->ReadString(lng, "Group_name", "");
    RadioGroup1->Items->Strings[0] = ini->ReadString(lng, "Option1", "");
    RadioGroup1->Items->Strings[1] = ini->ReadString(lng, "Option2", "");
    RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
 
}
//---------------------------------------------------------------------------
структура ini файла
[En]
Group_name=Language
Option1=English
Option2=Ukrainian
Option3=Russian

[Ua]
Group_name=Мова
Option1=Англійська
Option2=Українська
Option3=Російська

[Ru]
Group_name=Язык
Option1=Английский
Option2=Украинский
Option3=Русский
Но почему-то всегда юзает дефолтное значение , то есть или секцию не находит или ключ. Почему?
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 19:33
можно и так, без отдельного языкового файла для каждого языка, но тогда указывайте, какую секцию читать:
C++
1
ini->ReadSection
, поскольку Билдер сам, видимо, не может угадать, что вы имеете ввиду.
1
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 19:35
хмм, зачем тогда
ReadString(lng, "Option3", "");
что есть секция?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 19:46
Цитата Сообщение от Flyer Посмотреть сообщение
1. зачем тогда
ReadString(lng, "Option3", "");
2. что есть секция?
1. понятия не имею, зачем оно вам
2. см. вышее
3.
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 19:50
Я имел ввиду, что первый параметр это и есть секция с которой читать. То есть lng принимает значения En, Ru, Ua -> имена секций

А ридсекшн заносит всю секцию в стринглист, что есть немного не то
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 19:56
TIniFile
Работа с реестром и INI-файлами в Delphi

а как он должен понять, какую секцию читать?

переключайте как-нибудь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if... // например, язык системы - английский
  RadioGroup1->Caption = ini->ReadString("En", "Group_name", "");
  RadioGroup1->Items->Strings[0] = ini->ReadString("En", "Option1", "");
  RadioGroup1->Items->Strings[1] = ini->ReadString("En", "Option2", "");
  RadioGroup1->Items->Strings[2] = ini->ReadString("En", "Option3", "");
if... // например, язык системы - украинский
  RadioGroup1->Caption = ini->ReadString("Ua", "Group_name", "");
  RadioGroup1->Items->Strings[0] = ini->ReadString("Ua", "Option1", "");
  RadioGroup1->Items->Strings[1] = ini->ReadString("Ua", "Option2", "");
  RadioGroup1->Items->Strings[2] = ini->ReadString("Ua", "Option3", "");
if... // например, язык системы - русский
  RadioGroup1->Caption = ini->ReadString("Ru", "Group_name", "");
  RadioGroup1->Items->Strings[0] = ini->ReadString("Ru", "Option1", "");
  RadioGroup1->Items->Strings[1] = ini->ReadString("Ru", "Option2", "");
  RadioGroup1->Items->Strings[2] = ini->ReadString("Ru", "Option3", "");
и выше все же стоило посмотреть - там есть пример с иф.
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 20:10
Хмм, ну а чем мой вариант не подходит? Кейсом в зависимости от выбранного в групе подставляеться в переменную имя секции.
Ну может глянь мой проект, а?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 20:20
да, до кейса не дошел, а так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
switch (RadioGroup1->ItemIndex) {
  case 0:
    lng = "En";
    RadioGroup1->Caption = ini->ReadString(lng, "Group_name", "");
    RadioGroup1->Items->Strings[0] = ini->ReadString(lng, "Option1", "");
    RadioGroup1->Items->Strings[1] = ini->ReadString(lng, "Option2", "");
    RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
  break;
  case 1:
    lng = "Ua";
    RadioGroup1->Caption = ini->ReadString(lng, "Group_name", "");
    RadioGroup1->Items->Strings[0] = ini->ReadString(lng, "Option1", "");
    RadioGroup1->Items->Strings[1] = ini->ReadString(lng, "Option2", "");
    RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
  break;
  case 2:
    lng = "Ru";
    RadioGroup1->Caption = ini->ReadString(lng, "Group_name", "");
    RadioGroup1->Items->Strings[0] = ini->ReadString(lng, "Option1", "");
    RadioGroup1->Items->Strings[1] = ini->ReadString(lng, "Option2", "");
    RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
  break;
}
? и не
C++
1
RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
а
C++
1
RadioGroup1->Items->Strings[2] = ini->ReadString(lng, "Option3", "");
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 20:29
А зачем писать 3 раза одно и то же?
А насчет == конечно провтык, но это не причина проблемы
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
20.10.2011, 20:30
а как иначе ? ты все надеешься на экстрасенсорные способности билдера
чтобы было так, как ты хочешь, можно написать небольшую функцию, и передавать язык параметром:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
AnsiString SelectLang(AnsiString lng) {
}
  RadioGroup1->Caption = ini->ReadString(lng, "Group_name", "");
  RadioGroup1->Items->Strings[0] = ini->ReadString(lng, "Option1", "");
  RadioGroup1->Items->Strings[1] = ini->ReadString(lng, "Option2", "");
  RadioGroup1->Items->Strings[2] == ini->ReadString(lng, "Option3", "");
}
//...
switch (RadioGroup1->ItemIndex) {
  case 0:SelectLang("En");break;
  case 1:SelectLang("Ua");break;
  case 2:SelectLang("Ru");break;
}
0
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
20.10.2011, 20:51
Хм, почему не работает код на создании формы тогда? Там сразу указана секция
0
Прогер
 Аватар для Programmer.
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
20.10.2011, 21:14
Samrisbe,
Пример для МаинМену

Не по теме:

Прасти за опоздание :-[



C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <IniFiles.hpp>
//--------------------------------
UnicodeString path = ExtractFilePath(Application->ExeName)+"lang.lng";
 TIniFile *ini = new TIniFile(path);
//--------------------------------
void __fastcall TForm3::Georgian1Click(TObject *Sender)
{
UnicodeString lng = "Ru";
ini->WriteString(lng,"Language1",_TEXT("Русский"));
 MainMenu1->Items->Find("File")->Find("Language")->Find("Russian")->Caption=ini->ReadString(lng,"Language1","");
 
}
LK
сдох, винчестер умер, а Я тупой на диске не записал, Вот шас пишу заного...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2011, 21:14

DLL - контейнер текстовых файлов, как редактировать текст?
Есть DLL, в которую вложены текстовые файлы в качестве ресурсов. Кроме ресурсов в DLL нет ничего, т.е. это DLL-контейнер. Чтение текста...

Контейнер для файлов
Всем привет, у меня вопрос. Вот у меня есть файл формата допустим *.dat, как мне в этот файл засунуть файлы формата допустим *.jpg? ...

Как скомпились dll из нескольких файлов сразу?
Здраствуйте уважаемые знатоки. У меня есть несколько .cs, один .csproj и даже два файла справки .chm. Можно ли все это закомпилить в...

Восстановление dll файлов поврежденных вирусами "точка входа в процедуру _wcsupr_s не найдена в библиотеке dll
точка входа в процедуру _wcsupr_s не найдена в библиотеке dll ntdll.dll вирусы повредили файл библиотек после установки help dll...

Как получить имена Dll файлов из таблицы импорта
Добрый день. Нужно получить имена Dll файлов из таблицы импорта и при этом иметь возможность заблокировать запуск приложение....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru