Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение настроек с помощью TIni 
:(
    Опции темы
flintstone
Дата 2.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Как сохранять настройки в Ini файл и читать их я знаю. Проблема в другом:
На Form2 навешаны CheckBox'ы. При нажатии на кнопку Ok, если включены определённые CheckBox'ы, идёт выполнение функции и запись настроек в Ini. Затем я выхожу из программы, и запускаю её заново. Загружается Form1. В функции FormCreate есть 
Form2->CheckBox1->Checked = IniSettings->ReadBool("Settings","Autorun", false);
Form2->ButtonApplyClick(Sender);
Вроде бы CheckBox1 на форме Form2 должен быть с галочкой или без (как показано в настройках), а нет, выскакивает ошибка при загрузке программы с выделением строки
Form2->CheckBox1->Checked = IniSettings->ReadBool("Settings","Autorun", false);
PM MAIL   Вверх
Ivan.
Дата 2.12.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Ну во-первых в событии FormCreate Form1 Form2 скорее всего еще не созданна 
Во-вторых есть компанентка (точнее целый пакет компанент) storage library, каторая автоматически все это делает сама. кликается по компаненте, открывается список со всемы компанентами, лежащими рядом, и ихними пропертями. ставих галочку на нужном проперти и он автоматически загружается и выгружается. не требуется ни одной строчки кода.
Storage Library

Это сообщение отредактировал(а) Ivan. - 2.12.2007, 20:24


--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
flintstone
Дата 2.12.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Компонент Storage Library, как я понял, подходит только к Delphi, и притом он платный.
Но есть ли всё-таки решить проблему с помощью создания главной формы?

PM MAIL   Вверх
artsb
Дата 2.12.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Может попробовать сохранить значения во временные переменные(которые потом удалить), а потом в OnCreate для Form2 присвоить значения из переменных?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ksili
Дата 3.12.2007, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(flintstone @  2.12.2007,  21:47 Найти цитируемый пост)
Form2->CheckBox1->Checked = IniSettings->ReadBool("Settings","Autorun", false);
Form2->ButtonApplyClick(Sender);

Почему это всё не запихнуть в OnCreate второй формы?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
artsb
Дата 3.12.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



ksili возможно некоторые настройки нужно применить к Form1.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ksili
Дата 3.12.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Что значит "применить к Form1"? 

Form1->.... можно написать и из второй формы


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
artsb
Дата 3.12.2007, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Ну т.е. до того как будет создана Form2, к Form1 нужно применить какие-либо настройки (может графические или ещё какие, например доступность кнопки, размер или положение формы).


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
ksili
Дата 3.12.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Она что там полчаса создается? Создалась - а потом уже и применить можно. Или вообще изменить порядок создания форм, сначала Form2, а потом Form1
Файл проекта project1.cpp:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->CreateForm(__classid(TForm2), &Form2);
         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}
//---------------------------------------------------------------------------

Ну или в настройках проекта изменить последовательность

Это сообщение отредактировал(а) ksili - 3.12.2007, 10:22


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Vyacheslav
Дата 3.12.2007, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



А почему, код отоносящийся к настройке Form2, не выполнять там где этому коду самое место? А именно: тело конструктора TForm2.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
flintstone
Дата 3.12.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



artsb был прав. Настройки сначало надо применить к Form1. Например цвет фона, поверх всех окон и др., следуя из Form2. Если вначале попытаться создавать Form2, а затем Form1, то полетят настройки относящиеся к Form1 (т.к. она должна создаваться первой).
PM MAIL   Вверх
Fazil6
Дата 3.12.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(flintstone @  3.12.2007,  11:16 Найти цитируемый пост)
artsb был прав. Настройки сначало надо применить к Form1. Например цвет фона, поверх всех окон и др., следуя из Form2. Если вначале попытаться создавать Form2, а затем Form1, то полетят настройки относящиеся к Form1 (т.к. она должна создаваться первой).

те настройки, которые относятся к первой форме делай в ее конструкторе, а те которые к 2-й в ее конструкторе.
PM MAIL   Вверх
artsb
Дата 3.12.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



ksili правильно пишет.
Можно же сначала создать Form2 и в OnCreate считать настройки из файла, ну и по отмечать галочки напрмер или ещё что, но форму не отображать. Потом при создании Form1 считать настройки из Form2 и отобразить Form1.
Я правильно тебя понял ksili?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
flintstone
Дата 3.12.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Скажите, если я вставлю
Код

         Application->CreateForm(__classid(TForm2), &Form2);
         Application->CreateForm(__classid(TForm1), &Form1);

То сначала у меня будет создаваться Form2, как не создавая дополнительных меню, мне автоматически создавать Form1, а Form2 закрывать.
PM MAIL   Вверх
Fazil6
Дата 3.12.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(flintstone @  3.12.2007,  12:29 Найти цитируемый пост)
То сначала у меня будет создаваться Form2, как не создавая дополнительных меню, мне автоматически создавать Form1, а Form2 закрывать.

поменяв порядок создания форм ты сделаешь Form2 главной формой приложения. Не надо ничего менять в созданиях форм. Просто не надо пихать инициализацию настроек формы 2 в создание формы 1.
PM MAIL   Вверх
ksili
Дата 3.12.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Form2 вообще можно создать сначала невидимой, если уж так надо.

А вообще насколько я понял настройка одной формы не зависит о другой, а просто настройка зависит от содержимого ini-файла, а читается он в одной из форм. Надо читать его в первой создаваемой форме. А к настройке каждой формы применять при каждой (или при первой) её визуализации - событие OnShow


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
flintstone
Дата 3.12.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Это-то понятно Fazil6, что главной формой будет теперь Form2. Но у меня на Form2 висит только менюшка с настройками, а всё остальное на Form1. Если я буду создавать сначала Form2, то я никак не смогу вернуться в Form1 без дополнительной менюшки, а нужно чтобы показывалась Form1.

Это сообщение отредактировал(а) flintstone - 3.12.2007, 13:03
PM MAIL   Вверх
Fazil6
Дата 3.12.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 11
Всего: 60



Цитата(ksili @  3.12.2007,  12:41 Найти цитируемый пост)
 а просто настройка зависит от содержимого ini-файла, а читается он в одной из форм

что мешает читать ее в каждой из форм и извлекать то, что нужно этой форме?
PM MAIL   Вверх
flintstone
Дата 3.12.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Мешает то, что в главной форме надо загружать параметры, которые показаны на Form2.
PM MAIL   Вверх
Sharkfire
Дата 3.12.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 236
Регистрация: 30.11.2006
Где: Одесса

Репутация: 2
Всего: 2



Я решаю проблему так.... 
Я создал класс TOptions и в нём описал все нужные мне переменные,
и сделал метод Save & Load.
Описал переменную TOptions * Options в хедере главной формы.

И получил к ней досутп из втрой формы.
Вот последовательность вызова:

В конструкторе главной формы вызваю конструктор класа, вызываю метод Лоад,
в конструкторе дочерней формы, анализирую переменные класса (Form1->Options->...)

PM MAIL ICQ   Вверх
flintstone
Дата 3.12.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Попробую Sharkfire. Мне тут тоже подсказали, создать сначала какие-либо глобальные переменные, а потом к ним обратиться через Form2. Чем-то похоже на твой вариант.
PM MAIL   Вверх
flintstone
Дата 3.12.2007, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 18.10.2007

Репутация: нет
Всего: нет



Вот ещё один способ, может кому пригодится
Код

void __fastcall TForm1::FormShow(TObject *Sender)
{
  TIniFile *IniSettings = new TIniFile(ExtractFilePath(Application->ExeName)+"Settings.ini");
 if(IniSettings->ReadBool("Settings","Autorun", false)==true)
 {
  frSetting->CheckBox1->Checked=true;
  frSetting->ButtonApplyClick(Sender);
 }
 else
 {
  frSetting->CheckBox1->Checked=false;
  frSetting->ButtonApplyClick(Sender);
 }
  delete IniSettings;
}


Только это для каждого CheckBox'а надо писать новый if.
PM MAIL   Вверх
ksili
Дата 4.12.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(flintstone @  3.12.2007,  18:07 Найти цитируемый пост)
в главной форме надо загружать параметры, которые показаны на Form2

Исчо раз говорю, эти параметры только показаны на Form2, а существуют они и вне её! в ini-файле


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Ivan.
Дата 4.12.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



Можно выполнять инициализацию дополнительных параметров не в OnCreate, а OnShow. к тому моменту уже все создано. Можно в таймере или в Idle проверять Showing, после чего инициализировать.
Цитата(flintstone @  2.12.2007,  21:48 Найти цитируемый пост)
Компонент Storage Library, как я понял, подходит только к Delphi, и притом он платный.

У меня есть старая версия Storage, ни какой лицензии с меня не требовала и работает уже несколько лет без проблем.
Она подходит и к С++ (Builder 6)



--------------------
Я могу ВСЁ, вопрос - сколько времени у меня это займет!
PM MAIL ICQ   Вверх
Vyacheslav
Дата 5.12.2007, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Сколько шуму из ничего. Неужели нельзя просто использовать приницип: любая форма самодостаточна и может сама прочитать свои настройки. Соответственно код по чтению настроек и инициализации настроек разместить в конструкторах.
И еще раз для всех, использующих OnCreate: использование OnCreate - это дельфинизм. OnCreate введен в только потому, что в Delphi отсутствует такое понятие, как конструктор. В С++Builder  предпочтительнее использовать для этих целей тело конструктора, о чем в хелпе недвусмысленно указано разработчиками Borland

Добавлено через 4 минуты и 20 секунд
Цитата(flintstone @  3.12.2007,  14:07 Найти цитируемый пост)
Мешает то, что в главной форме надо загружать параметры, которые показаны на Form2. 

А зачем загружать в главной форме то, что используется  Form2 ?
Ну а если даже частично Form2 и Form1 использует  одни и теже параметры, то что это меняет. Почему их нельзя загрузить дважды?




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.