Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798

При запуске программы нужно сменить языковые настройки для Form2

19.11.2011, 16:57. Показов 1838. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вопрос. Почему вызов любой функции Russian, Bulgaria, English считывания настроек локализации языка(любого из трёх в моей программе) в FormCreate для Form2 выдаёт такую ошибку

[IMG]http://s015.***********/i333/1111/a8/d7835566302f.png[/IMG]

А когда я выбираю смену языка через MainMenu - Язык, тогда всё ок.

[IMG]http://s017.***********/i406/1111/60/595270f911c3.png[/IMG]

Цель такая, при запуске программы, чтобы она считывала значение Language в файле Setting.ini если 1 то происходит инициализация всех полей требующих перевода, в том числе и на форме Form2. Что я не так делаю и как нужно сделать правильно?

Исходный код
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
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   if(FileExists(ExtractFilePath(Application->ExeName)+"Settings.ini")){
      IniSetting = new TIniFile(ExtractFilePath(Application->ExeName)+"Settings.ini");
      if(IniSetting->ReadInteger("Settings", "Language", 0) == 1) Russian();
      else if(IniSetting->ReadInteger("Settings", "Language", 0) == 2) Bulgarian();
      else if(IniSetting->ReadInteger("Settings", "Language", 0) == 3) English();
     }
}
...
...
...
// Считывание из ini русского языка------------------------------------------
void __fastcall TForm1::Russian()
{
   Language->Caption = IniSetting->ReadString("Rus", "MenuLanguage", 0);
   Settings->Caption = IniSetting->ReadString("Rus", "MenuSettings", 0);
   SaveSetting->Caption = IniSetting->ReadString("Rus", "MenuSaveSettings", 0);
   DefaultSetting->Caption = IniSetting->ReadString("Rus", "MenuDefaultSettins", 0);
   About->Caption = IniSetting->ReadString("Rus", "MenuAbout", 0);
   Button1->Caption = IniSetting->ReadString("Rus", "Button1", 0);
   Button2->Caption = IniSetting->ReadString("Rus", "Button2", 0);
   Form2->Caption = IniSetting->ReadString("Rus", "MenuAbout", 0);
   Form2->Label1->Caption = IniSetting->ReadString("Rus", "Label1", 0);
   Form2->Label3->Caption = IniSetting->ReadString("Rus", "Label2", 0);
   Form2->Label6->Caption = IniSetting->ReadString("Rus", "Label2", 0);
   Form2->Label8->Caption = IniSetting->ReadString("Rus", "Label3", 0);
   Form2->Label11->Caption = IniSetting->ReadString("Rus", "Label4", 0);
   Form2->Label14->Caption = IniSetting->ReadString("Rus", "Label5", 0);
   Form2->Label10->Caption = IniSetting->ReadString("Rus", "Label6", 0);
   Form2->Label13->Caption = IniSetting->ReadString("Rus", "Label7", 0);
   Form2->Label18->Caption = IniSetting->ReadString("Rus", "Label8", 0);
   Form2->Label19->Caption = IniSetting->ReadString("Rus", "Label9", 0);
}
...
...
...
// MainMenu Language - Русский------------------------------------------------
void __fastcall TForm1::RussiaClick(TObject *Sender)
{
   Russian();
}
...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2011, 16:57
Ответы с готовыми решениями:

Открытие Form2 при запуске программы первой
При запуске программы нужно,чтобы сначала открылась Form2,которую можно закрыть кнопкой. А после открылась Form1 с рабочей частью.

Как сделать, чтобы при запуске программы сначала показывалась Form2
Всем привет! Думаю Вам не затруднит ответить на такой вопрос... Имеются 2 формы (Form1 и Form2) , у обоих разный интерфейс и т.д... ...

Как сделать чтобы при запуске программы form2 отображалась 5 секунд?
Как сделать чтобы при запуске программы form2 отображалась 5 секунд потом закрывалась и уже для работы как обычно отображалась form1? В...

7
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
19.11.2011, 17:59
Цитата Сообщение от Maestro Посмотреть сообщение
C++
1
2
3
if(IniSetting->ReadInteger("Settings", "Language", 0) == 1) Russian();
 else if(IniSetting->ReadInteger("Settings", "Language", 0) == 2) Bulgarian();
 else if(IniSetting->ReadInteger("Settings", "Language", 0) == 3) English();
ИМХО, тут лучше получать значение языка в переменную (и если больше 3 языков будет обрабатывать через switch).
Цитата Сообщение от Maestro Посмотреть сообщение
Что я не так делаю и как нужно сделать правильно?
Изначательно вы загружаете информацию о языке при создании главной формы. А теперь откройте "Project*.cpp" и посмотрите на порядок создания форм. Главная форма всегда создается первой по умолчанию. В итоге получается, что формы еще не существует, а вы в нее значения пытаетесь лепить.
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
19.11.2011, 18:19  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
ИМХО, тут лучше получать значение языка в переменную (и если больше 3 языков будет обрабатывать через switch).
Спасибо за совет, так и сделаю.
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Изначательно вы загружаете информацию о языке при создании главной формы. А теперь откройте "Project*.cpp" и посмотрите на порядок создания форм. Главная форма всегда создается первой по умолчанию. В итоге получается, что формы еще не существует, а вы в нее значения пытаетесь лепить.
А как нужно сделать правильно чтобы происходила инициализация языковых настроек обеих форм?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
19.11.2011, 18:36
Вариантов масса, хотите сами создавайте Form2, хотите в OnCreate Form2 используйте TIniFile и грузите там используйте extern функции, можно до Project.cpp докопаться - тут уже как душе угодно.
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
19.11.2011, 19:45  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
хотите сами создавайте Form2
Вы имеете ввиду вот так?
C++
1
Form2 = new TForm2(this);
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Form2 = new TForm2(this); // Создали новую форму
 
   if(FileExists(ExtractFilePath(Application->ExeName)+"Settings.ini")){
      IniSetting = new TIniFile(ExtractFilePath(Application->ExeName)+"Settings.ini");
      if(IniSetting->ReadInteger("Settings", "Language", 0) == 1) Russian();
      else if(IniSetting->ReadInteger("Settings", "Language", 0) == 2) Bulgarian();
      else if(IniSetting->ReadInteger("Settings", "Language", 0) == 3) English();
     }
}
P.S. Я сейчас не с билдером чтобы проверить, чуть-чуть позже смогу проверить.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
19.11.2011, 20:01
Цитата Сообщение от Maestro Посмотреть сообщение
C++
1
Form2 = new TForm2(this);
Не, не, не, тем более от this. (если речь не о MDI идет).
Как это делается четко видно Project.cpp.
C++
1
2
3
4
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->Run();
0
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
20.11.2011, 02:50  [ТС]
С этим разобрался, чуть позже напишу ответ.

Добавлено через 5 часов 22 минуты
Как и обещал, пишу своё решение.

Ввёл переменную LangID для запоминания статуса языка, т.к. инициализация будет происходить не только во время запуска программы, но и не посредственно во время работы, можно предположить, что пользователь через MainMenu сменит язык, чем вызовёт соответствующую функцию. После чего будет выполнено присвоение одного из числе 1-русский, 2-болгарский, 3-английский переменной LangID. Ну и при вызове второй формы SelectClick в выборе switch будет определено, для какого языка считывать настройки второй формы, после чего будет произведён открытие Form2. Всё.

Решение
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// Считывание из ini русского языка------------------------------------------
void __fastcall TForm1::Russian()
{
   LangID = 1;
   ...
   ...
   // И так далее считывание значений для Form1
}
// Считывание из ini болгарского языка---------------------------------------
void __fastcall TForm1::Bulgarian()
{
   LangID = 2;
   ...
   ...
   // И так далее считывание значений для Form1
}
// Считывание из ini английского языка---------------------------------------
void __fastcall TForm1::English()
{
   LangID = 3;
   ...
   ...
   // И так далее считывание значений для Form1
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   if(FileExists(ExtractFilePath(Application->ExeName)+"Settings.ini")){
      IniSetting = new TIniFile(ExtractFilePath(Application->ExeName)+"Settings.ini");
      switch(IniSetting->ReadInteger("Settings", "Language", 0)){
         case 1:
         Russian();
         break;
         case 2:
         Bulgarian();
         break;
         case 3:
         English();
         break;
         default:
         break;
        }
     }
//   if(PRIMARYLANGID(GetUserDefaultLangID()) == LANG_RUSSIAN) // Русский язык
//   else if(PRIMARYLANGID(GetUserDefaultLangID()) == LANG_BULGARIAN) // Болгарский
//   else if(PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH) // Английский
//   else // Английский
}
//-----------------------------------------------------------------------------
...
...
...
// Вторая форма---------------------------------------------------------------
void __fastcall TForm1::SelectClick(TObject *Sender)
{
   switch(LangID){
          case 1:{
         Form2->Caption = IniSetting->ReadString("Rus", "MenuAbout", 0);
         Form2->Label1->Caption = IniSetting->ReadString("Rus", "Label1", 0);
         Form2->Label3->Caption = IniSetting->ReadString("Rus", "Label2", 0);
         Form2->Label6->Caption = IniSetting->ReadString("Rus", "Label2", 0);
         Form2->Label8->Caption = IniSetting->ReadString("Rus", "Label3", 0);
         Form2->Label11->Caption = IniSetting->ReadString("Rus", "Label4", 0);
         Form2->Label14->Caption = IniSetting->ReadString("Rus", "Label5", 0);
         Form2->Label10->Caption = IniSetting->ReadString("Rus", "Label6", 0);
         Form2->Label13->Caption = IniSetting->ReadString("Rus", "Label7", 0);
         Form2->Label18->Caption = IniSetting->ReadString("Rus", "Label8", 0);
         Form2->Label19->Caption = IniSetting->ReadString("Rus", "Label9", 0);
        }
         break;
      case 2:{
         Form2->Caption = IniSetting->ReadString("Bulgaria", "MenuAbout", 0);
         Form2->Label1->Caption = IniSetting->ReadString("Bulgaria", "Label1", 0);
         Form2->Label3->Caption = IniSetting->ReadString("Bulgaria", "Label2", 0);
         Form2->Label6->Caption = IniSetting->ReadString("Bulgaria", "Label2", 0);
         Form2->Label8->Caption = IniSetting->ReadString("Bulgaria", "Label3", 0);
         Form2->Label11->Caption = IniSetting->ReadString("Bulgaria", "Label4", 0);
         Form2->Label14->Caption = IniSetting->ReadString("Bulgaria", "Label5", 0);
         Form2->Label10->Caption = IniSetting->ReadString("Bulgaria", "Label6", 0);
         Form2->Label13->Caption = IniSetting->ReadString("Bulgaria", "Label7", 0);
         Form2->Label18->Caption = IniSetting->ReadString("Bulgaria", "Label8", 0);
         Form2->Label19->Caption = IniSetting->ReadString("Bulgaria", "Label9", 0);
        }
         break;
      case 3:{
         Form2->Caption = IniSetting->ReadString("Eng", "MenuAbout", 0);
         Form2->Label1->Caption = IniSetting->ReadString("Eng", "Label1", 0);
         Form2->Label3->Caption = IniSetting->ReadString("Eng", "Label2", 0);
         Form2->Label6->Caption = IniSetting->ReadString("Eng", "Label2", 0);
         Form2->Label8->Caption = IniSetting->ReadString("Eng", "Label3", 0);
         Form2->Label11->Caption = IniSetting->ReadString("Eng", "Label4", 0);
         Form2->Label14->Caption = IniSetting->ReadString("Eng", "Label5", 0);
         Form2->Label10->Caption = IniSetting->ReadString("Eng", "Label6", 0);
         Form2->Label13->Caption = IniSetting->ReadString("Eng", "Label7", 0);
         Form2->Label18->Caption = IniSetting->ReadString("Eng", "Label8", 0);
         Form2->Label19->Caption = IniSetting->ReadString("Eng", "Label9", 0);
        }
         break;
      default:
      break;
     }
   Form2->ShowModal();
}


А с этим я не знаком, если есть желание показать, как нужно, буду признателен.
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->Run();
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.11.2011, 07:54
Просто вы можете прописать создание форм через Application вместо объявлений в Project.cpp или прописать функцию загрузку языка в Project.cpp. Есть еще один вариант. Загрузка текста на определенном языке происходит в каждой форме отдельно в OnCreate. Я делаю именно так, но без реализации возможности смены языка в процессе работы с программой. Такая реализация возможна с перезагрузкой приложения. ИМХО это более-менее рациональный способ, но каждый выбирает сам.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2011, 07:54
Помогаю со студенческими работами здесь

Как сделать так чтобы при запуске программы первой открывалась Form2, а не Form1
Как сделать так чтобы при запуске программы первой открывалась Form2, а не Form1

Нужно всего лишь вставить эмблему при запуске, сменить название в главном меню да вставить текст в эбаут
Уважаемые! Пишет вам человек гуманитарного склада ума, которому нужна помощь от склада ума не гуманитарного! Дело в том, что у меня...

Языковые настройки приложения
как лучше всего реализовать систему языковых настроек в приложении? т.е. чтобы в программе можно было менять язык интерфейса? понятно что в...

Языковые настройки. Добавление украинской раскладки
Всем привет! Друзья, есть такая вот проблемка. Пользуюсь на рабочем компьютере 2мя языковыми раскладками - русской и английской....

Скрыть при запуске главную Form1 и открыть Form2
Приветствую. Суть описана в заголовке) Требуется, чтобы после запуска exe открывалась сразу 2я форма, а уже потом после выполнения...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru