Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/180: Рейтинг темы: голосов - 180, средняя оценка - 4.51
 Аватар для BARS1991
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332

Сохранение настроек программы в *ini файл.

29.12.2009, 20:53. Показов 34376. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сохранить параметры программы в файл *ini ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2009, 20:53
Ответы с готовыми решениями:

Сохранение настроек в INI
Здравствуйте ! Почитал эту тему https://www.cyberforum.ru/cpp-builder/thread757450.html . Все хорошо , но не понял, как мне сделать...

Сохранение настроек в Ini из ComboBox.
Разобрался с ini файлом, вот только возник вопрос, как сохранить настройки из COmboBox void __fastcall TForm4::FormCreate(TObject...

Сохранение положения компонента на форме (Сохранение параметра в Ini-файл)
Не знаю верно ли назвал тему. Доброго вечера тебе, всяк сюда входящий. Подскажите пожалуйста с вопросом: Имеется Form1, на нем...

27
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
29.12.2009, 20:59
Лучший ответ Сообщение было отмечено как решение

Решение

нашёл на одном форуме
Сохраняем настройки в INI-файлах
Большинство программистов сталкиваются с проблемой сохранения настроек своей программы, но сегодня мы решим эту проблему. Мы научимся работать с ini файлами. Еще одним способом сохранять настройки является реестр, но его лучше не изменять, да и работать с ним немного сложнее. Итак, ini-файл имеет простую и понятную структуру :
[Секция1]
Идентификатор1 = Значение1
Идентификатор2 = Значение2
[Секция2]
Идентификатор1 = Значение1
Для использования ini-файлов, в C++Builder предусмотрен модуль IniFiles , его мы и подключаем:
#include IniFiles.hpp
Далее, нужно создать обьект класса TIniFile, назовем его Ini.
После
TForm1 *Form1;
пишем:
TIniFile *Ini = new TIniFile("c:/options.ini");
значения сохраняет на диске С: в файл options.ini .

После этого, на форму кинем две кнопки (TButton) и два Эдита (TEdit). Мы будем сохранять текст Эдитов в ini-файл, а потом загружать его.
Пишем обработчик события нажатия кнопки Button1. Она будет сохранять текст Эдитов в наш options.ini


void __fastcall TForm1::Button1Click(TObject *Sender)
{{
Ini->WriteString("Edits","Edit1",Edit1->Text);
Ini->WriteString("Edits","Edit2",Edit2->Text);
}
Так, как мы работаем с текстом, мы использовали метод класса WriteString,
если нам нужно было бы работать с числами, мы бы написали WriteInteger .

Где параметры для этой функции:
"Edits" - имя секции;
"Edit1" - указатель на объект;
"Edit1->Text" - строка, которую мы сохраняем (текст эдита).

Далее, рассмотрим пример загрузки параметров с ini , пишем обработчик события для второй кнопки:


void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = Ini->ReadString("Edits","Edit1","Def");
Edit2->Text = Ini->ReadString("Edits","Edit2","Def");
}
Здесь используем функцию чтения :ReadString , где:
"Edits" - секция из которая нам надо ;
"Edit1" - объект для которого загружаем строку;
"Def" - эта строка заполняет Эдит, если значение ini не найдено;

Этот маленький пример показывает как можно лекго загружать и сохранять параметры Вашей программы в INI-файлы.
10
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
29.12.2009, 23:43
А как пользоваться WriteInteger и ReadInteger?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
29.12.2009, 23:52
А как пользоваться WriteInteger и ReadInteger?
Читаем содержимое

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
         AnsiString Patch;
         Patch = ExtractFilePath(ParamStr(0)); // получаем путь к каталогу программы
         TIniFile *Ini = new TIniFile(Patch+"options.ini");
         DBGrid1->Columns->Items[0]->Width = Ini->ReadInteger("DBGrid","Items[0]",DBGrid1->Columns->Items[0]->Width);
         DBGrid1->Columns->Items[1]->Width = Ini->ReadInteger("DBGrid","Items[1]",DBGrid1->Columns->Items[1]->Width);
         DBGrid1->Columns->Items[2]->Width = Ini->ReadInteger("DBGrid","Items[2]",DBGrid1->Columns->Items[2]->Width);
         DBGrid1->Columns->Items[3]->Width = Ini->ReadInteger("DBGrid","Items[3]",DBGrid1->Columns->Items[3]->Width);
         DBGrid1->Columns->Items[4]->Width = Ini->ReadInteger("DBGrid","Items[4]",DBGrid1->Columns->Items[4]->Width);
         DBGrid1->Columns->Items[5]->Width = Ini->ReadInteger("DBGrid","Items[5]",DBGrid1->Columns->Items[5]->Width);
         DBGrid1->Columns->Items[6]->Width = Ini->ReadInteger("DBGrid","Items[6]",DBGrid1->Columns->Items[6]->Width);
         DBGrid1->Columns->Items[7]->Width = Ini->ReadInteger("DBGrid","Items[7]",DBGrid1->Columns->Items[7]->Width);
         DBGrid1->Columns->Items[8]->Width = Ini->ReadInteger("DBGrid","Items[8]",DBGrid1->Columns->Items[8]->Width);
         DBGrid1->Columns->Items[9]->Width = Ini->ReadInteger("DBGrid","Items[9]",DBGrid1->Columns->Items[9]->Width);
         DBGrid1->Columns->Items[10]->Width = Ini->ReadInteger("DBGrid","Items[10]",DBGrid1->Columns->Items[10]->Width);
         DBGrid1->Columns->Items[11]->Width = Ini->ReadInteger("DBGrid","Items[11]",DBGrid1->Columns->Items[11]->Width);
         DBGrid1->Columns->Items[12]->Width = Ini->ReadInteger("DBGrid","Items[12]",DBGrid1->Columns->Items[12]->Width);
         DBGrid1->Columns->Items[13]->Width = Ini->ReadInteger("DBGrid","Items[13]",DBGrid1->Columns->Items[13]->Width);
Записываем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AnsiString Patch;
 Patch = ExtractFilePath(ParamStr(0)); // получаем путь к каталогу программы
 TIniFile *Ini = new TIniFile(Patch+"options.ini");
         Ini->WriteInteger("DBGrid","Items[0]",DBGrid1->Columns->Items[0]->Width);
         Ini->WriteInteger("DBGrid","Items[1]",DBGrid1->Columns->Items[1]->Width);
         Ini->WriteInteger("DBGrid","Items[2]",DBGrid1->Columns->Items[2]->Width);
         Ini->WriteInteger("DBGrid","Items[3]",DBGrid1->Columns->Items[3]->Width);
         Ini->WriteInteger("DBGrid","Items[4]",DBGrid1->Columns->Items[4]->Width);
         Ini->WriteInteger("DBGrid","Items[5]",DBGrid1->Columns->Items[5]->Width);
         Ini->WriteInteger("DBGrid","Items[6]",DBGrid1->Columns->Items[6]->Width);
         Ini->WriteInteger("DBGrid","Items[7]",DBGrid1->Columns->Items[7]->Width);
         Ini->WriteInteger("DBGrid","Items[8]",DBGrid1->Columns->Items[8]->Width);
         Ini->WriteInteger("DBGrid","Items[9]",DBGrid1->Columns->Items[9]->Width);
         Ini->WriteInteger("DBGrid","Items[10]",DBGrid1->Columns->Items[10]->Width);
         Ini->WriteInteger("DBGrid","Items[11]",DBGrid1->Columns->Items[11]->Width);
         Ini->WriteInteger("DBGrid","Items[12]",DBGrid1->Columns->Items[12]->Width);
         Ini->WriteInteger("DBGrid","Items[13]",DBGrid1->Columns->Items[13]->Width);
ReadBool надо описывать?
1
Маэстро
Вирусоборец
 Аватар для Maestro
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
30.12.2009, 00:40
BARS1991, Посмотрите в мою тему - INI Файл и Стиль Шрифта - как сохранить в INI стиль шрифта. Там правда про шрифт, но принцип сохранился, разве что переменные поменять на свои и нужные значения сохранять.
3
 Аватар для BARS1991
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332
30.12.2009, 09:02  [ТС]
Спасибо
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
14.02.2011, 23:48
Добрый день!
Вот так написал команду, после запуска программы команда из второй строки меняет свойство Caption в ButtonCancel на текст свойства Hint, если поменять строки кода местами тогда наоборот Hint в Caption.
И еще, не разумлю чем заменить WriteString для записи в ini файл свойство Button-Enabled .

1. Ini->WriteString("Buttons","ButtonCancel",Bu ttonCancel->Hint);
2. Ini->WriteString("Buttons","ButtonCancel",Bu ttonCancel->Caption);
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.02.2011, 00:46
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Samrisbe Посмотреть сообщение
И еще, не разумлю чем заменить WriteString для записи в ini файл свойство Button-Enabled .
Смотрим : Button->Enabled = true; - а true у нас имеет тип BOOL , смотрим, что нам предлагал уважаемый Sasha для типа BOOL ? Значит, WriteBool, ReadBool . Все просто, если чуток подумать .
Работа с файлами INI

Автор: Ghost Rider
http://www.codenet.ru/progr/de... -files.php

Использование *.INI - файлов очень удобно и экономично. В данных файлах вы можете хранить настройки вашей программы (именно для этого они и существуют). Тем самым вы не будете захламлять системный реестр. Использовать *.INI - файлы можно и в других случаях, т.к. синтаксис очень прост и удобен в использовании.

Использование *.INI в Delphi (LK - подправил для C++ Builder)

Для работы с *.INI - файлами в Delphi вам необходимо подключить модуль IniFiles
C++
1
#include <IniFiles.hpp>
и создать объект TIniFile, затем с ним работать. После завершения работы объект необходимо удалить методом Free.

Основные методы:

# new - создает экземпляр объекта TIniFile в качестве параметра указывается путь и имя файла (если путь не указан, то файл создается в стандартной директории Windows (можно использовать GetDir для создания файла в папке с программой))

* delete - удаляет объект TIniFile ( delete имя_вашего_файла_ини; )
* FileName - возвращает имя файла, с которым связан объект TIniFile
* DeleteKey - удаляет ключ в разделе
* EraseSection - удаляет раздел
* ReadInteger - считывает из файла целочисленные данные
* ReadString - считывает из файла строковые данные
* ReadBool - считывает из файла логические (true, false) данные
* WriteBool - записывает в файл логические данные
* WriteString - записывает в файл строковые данные
* WriteInteger - записывает в файл целочисленные данные
* ReadSection - извлекает имена идентификаторов в указанном разделе INI - файла
* ReadSections - извлекает все имена разделов
* ReadSectionValues - извлекает из заданного раздела все ключи
* ReadBinaryStream - считывает поток из файла
* WriteBinaryStream - записывает поток в файл

Для более детального изучения можно обратиться к исходному коду модуля IniFile (однако приведенных выше методов вполне хватает для работы).
Вот несколько дополнительных функций, которые помогут вам в решении некоторых проблем связанных с использованием INI - файлов:
WriteProfileString и WritePrivateProfileString - сбрасывают изменения в INI - файле на диск, что позволяет немедленно записать все изменения в вашем файле настроек. Функции находятся в модуле Windows.pas (импортированы из kernel32.dll).
А вот еще небольшая вещь: сообщение WM_WININICHANGE позволяет отслеживать изменения происходящие в файле Win.ini.

Возможно вам потребуется обрабатывать исключительные ситуации, возникающие при работе с INI - файлами. В этом вам поможет класс EIniFileException (Exception).
Также в модуле IniFiles описаны два дополнительных класса (в помощь TMemIniFile - файлы в памяти (увеличивается быстродействие, но при неправильной работе можно вызвать сбой)) - это TStringHash и THashedStringList.

Скачать пример к статье (ZIP; 1.7Кб)
http://www.codenet.ru/progr/de... -files.zip
7
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
16.02.2011, 09:22
Цитата Сообщение от LK Посмотреть сообщение
Смотрим : Button->Enabled = true; - а true у нас имеет тип BOOL , смотрим, что нам предлагал уважаемый Sasha для типа BOOL ? Значит, WriteBool, ReadBool . Все просто, если чуток подумать .
Добрый день. А для Form->Color WriteBool не подходит?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
16.02.2011, 09:31
Цитата Сообщение от Samrisbe Посмотреть сообщение
Добрый день. А для Form->Color WriteBool не подходит?
Чтобы тебе сохранить цвет в файле нужно использовать WriteInteger

C++
1
Ini->WriteInteger("ColorBoxes","ColorBox1",ColorBox1->Selected);
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
16.02.2011, 10:38
Я торможу.
где у меня ошибка?

1. Ini->WriteInteger("Forms","Form",Form->Color);записываем


2. Form->Color = Ini->ReadInteger("Forms","Form","Def"); читаем
0
 Аватар для n00b!!!
11 / 11 / 1
Регистрация: 27.12.2010
Сообщений: 39
16.02.2011, 15:54
когда читаем ,то
C++
1
ini->ReadInteger("Forms","Form",0);
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
16.02.2011, 17:05
C++
1
 Form->Color = Ini->ReadInteger("Forms","Form",Form->Color); //читаем
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
16.02.2011, 18:26
Теперь вот такую ошибку выбает, и после пуска показывает только черный цвет.

Project.cpp(97): W8018 Assigning int to TColor
0
 Аватар для n00b!!!
11 / 11 / 1
Регистрация: 27.12.2010
Сообщений: 39
16.02.2011, 19:07
не зна,свой пример проверял,работает.
в методе чтения ReadInteger первые два параметра - строки,а третий типа int. так должно быть
1
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
16.02.2011, 20:02
Всем спасибо! все работает.

Добавлено через 6 минут
Цитата Сообщение от Samrisbe Посмотреть сообщение
Добрый день!
Вот так написал команду, после запуска программы команда из второй строки меняет свойство Caption в ButtonCancel на текст свойства Hint, если поменять строки кода местами тогда наоборот Hint в Caption.

1. Ini->WriteString("Buttons","ButtonCancel",Bu ttonCancel->Hint);
2. Ini->WriteString("Buttons","ButtonCancel",Bu ttonCancel->Caption);
А с этим вопросом не поможете?
0
 Аватар для n00b!!!
11 / 11 / 1
Регистрация: 27.12.2010
Сообщений: 39
16.02.2011, 20:13
Цитата Сообщение от Samrisbe Посмотреть сообщение
А с этим вопросом не поможете?
я вопроса не понял,уже устал к вечеру))попробуй как -нибедь объснить ,что требуется?)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
16.02.2011, 20:32
Да ты меняй не в ини, а в программе, а в ини записывай результат.

Добавлено через 3 минуты
и лучше писать в ини (строковые) переменные, а не значения :
C++
1
2
str1 = ButtonCancel->Hint;
Ini->WriteString("Buttons","ButtonCancel",str1);
- тогда не будешь зависеть от этого самого ини - "а что там в моем этом самом ини записано ?" - а будешь полностью владеть ситуацией.

Добавлено через 12 минут
Ну и вот представь, программа на n-языках (иностранных), так что - делать n-файлов настройки, если там имеются строковые значения? а так значания хранишь в отдельных языковых файлах, а в файл настроек сохраняешь только переменную.
2
24 / 2 / 1
Регистрация: 01.03.2011
Сообщений: 109
03.03.2011, 16:35
НАРОД, ПОМОГИТЕ ПОЖАЛУЙСТА! Как тоже самое сделать не через ini а через xml файл!!!! 3 день ни чего найти не могу!!!!
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
03.03.2011, 17:17
Лучший ответ Сообщение было отмечено как решение

Решение

плохо искал - инфы навалом, только искать надо не "как сохранить настройки", а "как работать с XML"
http://www.functionx.com/cppbu... sson01.htm
http://www.functionx.com/cppbu... sson02.htm
http://www.functionx.com/cppbu... sson03.htm
http://wiki.lazarus.freepascal.org/XML_Tutorial/ru
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2011, 17:17
Помогаю со студенческими работами здесь

Сохранение настроек в ini-файл
Пару дней обучаюсь Delphi , сегодня попробовал написать программу которая сохраняет настройки в конфиг.ини, при закрытии у меня все...

INI - Загрузка и сохранение настроек
Добрый день. Подскажите пожалуйста. Существует ли какой либо класс в C++ в Visual Studio для &quot;INI - Загрузка и сохранение...

Сохранение настроек в .ini - дозапись файла
Всем привет! Понимаю, что тема уже избитая, но у меня возник вопрос. Прога по нажатию кнопки &quot;сохранить&quot; пишет параметры в .ini...

Сохранение настроек в .ini в папке Windows\System32
Доброго времени суток. Сделал свой ScreenSaver. Настройки должны сохраняться в ini-файле в папке вместе с программой. Проблема в том, что...

Пример сохранения настроек программы (ini)
Пожалуйста пришлите или подробно опишите пример сохранения настроек программы(пути к картинкам или visible...) Спасибо=)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru