Лекция № 7

Тема: "Программная настройка и сохранение параметров программ"

 

План

1. Работа с INI файлами

2. Работа с реестром Windows

 

 1. Работа с INI файлами

Одним из условий популярности программного обеспечения на рынке является возможность адаптации интерфейса и режимов работы приложения под потребности конкретного пользователя. Часто в программе создается раздел меню Сервис с командой Параметры или Опции, с помощью которой можно настроить работу ПО. Такие настройки должны храниться и автоматически использоваться при всех последующих запусках программы.

Существует несколько способов сохранения настроек программ. Одним из них является использования файлов .INI. Microsoft не рекомендует работать с файлами .INI, а использовать только реестр. Впрочем, несмотря на это, приложения часто используют такие файлы. Да и разработки от самой компании Microsoft не обходятся без этих файлов.

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

 

ключ=значение

 

 

Доступ к .INI файлам

В языке C# нет встроенной поддержки работы с INI файлами. Тем не менее можно подключить к проекту внешний файл класса и использовать его методы для сохранения или восстановления параметров приложения с использованием INI файла.

Вам необходимо будет выполнить следующие действия:

- скачайте файл класса для работы с INI файлами. При работе в проектом в окне "Обозреватель решений" вызовите контекстное меню проекта, выберите команду "Добавить – Существующий элемент". В диалоге укажите файл INIFile.cs. В результате в папку с проектом будет автоматически скопирован указанный файл класса, а в дереве проекта появится имя добавленного файла.

- создайте экземпляр класса для работы с INI файлом с помощью команды:

 

INIFile имя_переменной = new INIFile("имя_INI_файла");

 

Например, в переменной ini создадим экземпляр класса INIFile и свяжем его с файлом settings.ini, расположенным в папке с нашей программой:

 

INIFile ini = new INIFile(Application.StartupPath+"\\settings.ini");

 

- выполните чтение из INI файла или запись в INI файл с помощью специальных методов класса INIFile (см. ниже);

 

Запись данных в INI файл

Для записи значений ключей существует специальный метод вида::

 

имя_переменной.IniWriteValue("имя_раздела","имя_ключа",значение);

 

Если соответствующий раздел или ключ отсутствуют в файле, они автоматически создаются.

Записываемое значение должно иметь строковый формат, поэтому все значения, тип который отличается от строкового должны при записи конвертироваться в строку. Проще всего это сделать с помощью метода ToString(). Особое внимание нужно уделять записи значений цвета, для выполнения которой цвет вначале переводиться в свое числовое представление, а потом конвертируется в текст.

Например, приведем примеры записи в INI файл значений разных типов.

 

//создаем экземпляр класса для работы с INI файлами и

//связываем его с файлом на диске (в папке с программой)

INIFile ini = new INIFile(Application.StartupPath+"\\settings.ini");

 

//записываем содержимое текстового поля (строковый формат)

ini.IniWriteValue("Form","textBox1",textBox1.Text);

 

//записываем ширину формы (числовой формат)

ini.IniWriteValue("Form","Width",Width.ToString());

 

//записываем состояние флажка checkBox1 (логический формат true/false)

ini.IniWriteValue("Form","checkBox1",checkBox1.Checked.ToString());

 

//записываем состояние переключателя radioButton1 (логический формат true/false)

ini.IniWriteValue("Form","radioButton1",radioButton1.Checked.ToString());

 

//записываем цвет фона формы (цвет конвертируем в число, а затем в текст)

ini.IniWriteValue("Form","BackColor",BackColor.ToArgb().ToString());

 

//записываем цвет фона поля textBox1 (цвет конвертируем в число, а затем в текст)

ini.IniWriteValue("Form","textBox1Color",textBox1.BackColor.ToArgb().ToString());

 

Чтение данных из .INI файла

Для чтения значений ключей существует специальный метод вида::

 

имя_переменной.IniReadValue("имя_раздела","имя_ключа",значение_по_умолчанию);

 

Если соответствующий раздел или ключ отсутствуют в файле, то вместо значения из файла считывается значение по умолчанию.

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

Например, приведем примеры чтения из INI файла значений разных типов.

 

//создаем экземпляр класса для работы с INI файлами и

//связываем его с файлом на диске (в папке с программой)

INIFile ini = new INIFile(Application.StartupPath+"\\settings.ini");

 

//текстовому полю textBox1 присваиваем ранее записанное значение(строковый формат)

textBox1.Text=ini.IniReadValue("Form","textBox1",textBox1.Text);

 

//ширине формы присваиваем ранее записанное значение (числовой формат)

Width=Convert.ToInt32(ini.IniReadValue("Form","Width",Width.ToString()));

 

//состоянию флажка checkBox1 присваиваем ранее записанное значение (логический формат true/false)

checkBox1.Checked=Convert.ToBoolean(ini.IniReadValue("Form","checkBox1",checkBox1.Checked.ToString()));

 

//состоянию переключателя radioButton1 присваиваем ранее записанное значение (логический формат true/false)

radioButton1.Checked=Convert.ToBoolean(ini.IniReadValue("Form","radioButton1",radioButton1.Checked.ToString()));

 

//цвету фона формы присваиваем ранее записанное значение (значение конвертируем в число, а затем в цвет)

BackColor=Color.FromArgb(Convert.ToInt32(ini.IniReadValue("Form","BackColor",BackColor.ToArgb().ToString())));

 

//цвету фона поля textBox1 присваиваем ранее записанное значение (значение конвертируем в число, а затем в цвет)

textBox1.BackColor=Color.FromArgb(Convert.ToInt32(ini.IniReadValue("Form","textBox1Color",textBox1.BackColor.ToArgb().ToString())));

 

2. Работа с реестром Windows

Раньше, в Windows 3.x информация о конфигурации и настройке приложения хранились в .INI файлах. Но для того, чтобы упорядочить процессы установки и удаления программ, начиная с Windows 95 Microsoft требует, чтобы вся информация о конфигурации системы хранилась в системном реестре. Реестр (Registry) – это база данных для хранения информации о системной конфигурации аппаратуры, о Windows и о приложениях Windows. Почти все, что в Windows 3.x находилось в файлах .INI, перенесенно в реестр. Реестр имеет иерархическую структуру, которая, содержит много уровней разделов, веток и параметров. Информация хранится в виде иерархического дерева, каждый узел которого называется разделом. Раздел может содержать ветки и значения параметров.

Реестр делит все свои данные на две категории: те, что характеризуют компьютер, и те, что характеризуют пользователя. Характеристики компьютера содержат в себе все, связанное с техническими средствами, а также с установленными приложениями и их конфигурацией. Характеристики пользователя содержат в себе установки по умолчанию для экрана, пользовательские конфигурации, информацию об выбранных пользователем принтерах, установках сети и т.п.

Все ветки относятся к пяти основным разделам реестра. Три из них определяют характеристики компьютера:

 

HKEY_CLASSES_ROOT

Информация об OLE, Drag&Drop, клавишах быстрого доступа и пользовательском интерфейсе Windows

HKEY_LОСAL_MАСHINE

Информация о компьютере, включая конфигурацию установленной аппаратуры и программного обеспечения

HKEY_CURRENT_CONFIG

Информация о текущем оборудовании

 

Два раздела верхнего уровня определяют характеристики пользователя:

 

HKEY_CURRENT_USER

Информация о пользователе, зарегистрированном в текущий момент

HKEY_USERS

Информация о пользователях, включая установки экрана и приложений

 

Реестр хранится в файле SYSTEM.DAT в каталоге Windows. Просмотр и редактирования реестра Windows осуществляется редактором реестра Regedit.exe. Будьте предельно внимательны при работе с реестром. Иначе ваши эксперименты могут закончится плачевно, вплоть до необходимости переустанавливать Windows.

 

Доступ к ррестру

В языке C# есть встроенный класс Registry для поддержки работы с реестром, для работы с которым необходимо подключить пространство имен:

 

using Microsoft.Win32;

 

Вам необходимо будет выполнить следующие действия:

- описать  переменную для работы с реестром

   

RegistryKey имя_переменной;

 

Например, опишем переменную с именем reg:

 

RegistryKey reg;

   

- в нужном разделе реестра создаем или открываем ветку для работы с помощью метода:

 

имя_переменной = Registry.имя_раздела.CreateSubKey("имя_ветки");

 

Если в качестве имени ветки указать несуществующий элемент, то он будет создан, в противном случае - открыт. При указании имени ветки, как и при задании путей к файлам и папкам символ обратного слеша экранируется двойным символом "\\".

Например, в разделе CURRENT_USER открываем ветку Software\Myprogram\Form и присваиваем ссылку на нее описанной ранее переменной reg.

 

reg = Registry.CurrentUser.CreateSubKey("Software\\Myprogram\\Forms");

 

- выполните чтение из реестра или запись в реестр с помощью специальных методов  (см. ниже);

 

- после выполнения всех нужных операций закройте ветку реестра с помощью метода:

 

имя_переменной.Close();

 

В нашем случае:

 

reg.Close();

Запись данных в реестр

Для записи значений в реестр существует специальный метод вида::

 

имя_переменной.SetValue("имя_ключа",значение);

 

Если соответствующее значение отсутствует в реестре, оно автоматически создается.

В отличие от INI файла значение записывается в своем исходном формеате и никаких предварительных конвертаций выполнять не требуется.  Исключением является запись значений цвета, для выполнения которой цвет вначале переводиться в свое числовое представление.

Например, приведем примеры записи в реестр значений разных типов.

 

//описываем переменную для работы с веткой реестра

RegistryKey reg;

 

//в разделе CURRENT_USER создаем/открываем ветку Software\Myprogram\Form

reg = Registry.CurrentUser.CreateSubKey("Software\\Myprogram\\Forms");

 

//записываем содержимое текстового поля (строковый формат)

reg.SetValue("textBox1",textBox1.Text);

 

//записываем ширину формы (числовой формат)

reg.SetValue("Width",Width);

 

//записываем состояние флажка checkBox1 (логический формат true/false)

reg.SetValue("checkBox1",checkBox1.Checked);

 

//записываем состояние переключателя radioButton1 (логический формат true/false)

reg.SetValue("radioButton1",radioButton1.Checked);

 

//записываем цвет фона формы (цвет конвертируем в число)

reg.SetValue("BackColor",BackColor.ToArgb());

 

//записываем цвет фона поля textBox1 (цвет конвертируем в число)

reg.SetValue("textBox1Color",textBox1.BackColor.ToArgb());

 

//после выполнения всех нужных операций закрываем ветку реестра

reg.Close();

 

Чтение данных из реестра

Для чтения значений ключей существует специальный метод вида::

 

имя_переменной.GetValue("имя_ключа");

 

Обратите внимание, что считываемое значение обязательно должно конвертироваться к нужному типу . Проще всего это сделать с помощью класса Convert. Особое внимание нужно уделять чтению значений цвета, при котором считываемое значение сначала конвертируется в число, а затем с помощью специального метода в цвет.

Если соответствующий ключ отсутствуют в реестре, то программа будет выдавать сообщение об ошибке, поэтому каждую операцию чтения нужно начинать с проверки наличия нужного ключа в реестре. Для этого метод чтения оформляют в виде:

 

//если ключ в реестре существует

if (имя_переменной.GetValue("имя_ключа")!=null)   

    читаем из реестра

 

Например, приведем примеры чтения из реестра значений разных типов.

 

//описываем переменную для работы с веткой реестра

RegistryKey reg;

 

//в разделе CURRENT_USER создаем/открываем ветку Software\Myprogram\Form

reg = Registry.CurrentUser.CreateSubKey("Software\\Myprogram\\Forms");

 

//если ключ в реестре существует

if (reg.GetValue("textBox1")!=null)   

    //текстовому полю textBox1 присваиваем ранее записанное значение(строковый формат)

    textBox1.Text=reg.GetValue("textBox1").ToString();

 

//если ключ в реестре существует

if (reg.GetValue("Width")!=null)   

    //ширине формы присваиваем ранее записанное значение (числовой формат)

    Width=Convert.ToInt32(reg.GetValue("Width"));

 

//если ключ в реестре существует

if (reg.GetValue("checkBox1")!=null) 

    //состоянию флажка checkBox1 присваиваем ранее записанное значение (логический формат true/false)

    checkBox1.Checked=Convert.ToBoolean(reg.GetValue("checkBox1"));

 

//если ключ в реестре существует

if (reg.GetValue("radioButton1")!=null) 

    //состоянию переключателя radioButton1 присваиваем ранее записанное значение (логический формат true/false)

    radioButton1.Checked=Convert.ToBoolean(reg.GetValue("radioButton1"));

 

//если ключ в реестре существует

if (reg.GetValue("BackColor")!=null) 

    //цвету фона формы присваиваем ранее записанное значение (значение конвертируем в число, а затем в цвет)

    BackColor=Color.FromArgb(Convert.ToInt32(reg.GetValue("BackColor")));

 

//если ключ в реестре существует

if (reg.GetValue("textBox1Color")!=null) 

//цвету фона поля textBox1 присваиваем ранее записанное значение (значение конвертируем в число, а затем в цвет)

textBox1.BackColor=Color.FromArgb(Convert.ToInt32(reg.GetValue("textBox1Color")));

 

//после выполнения всех нужных операций закрываем ветку реестра

reg.Close();

 

Вопросы для самоконтроля

 

1. Дайте характеристику INI файлу.

2. Опишите метод и особенности записи данных в INI файл.

3. Опишите метод и особенности чтения данных из INI файла.

4. Дайте характеристику реестру Windows.

5. Опишите метод и особенности записи данных в реестр.

6. Опишите метод и особенности чтения данных из реестра.