Практическое занятие № 6

Тема: Работа с INI-файлами и реестром

Цель работы: на практике отработать принципы записи и чтения данных из INI файлов в программах на C#

 

Ход работы

 

Задание 1. Сохранения параметров в INI файлах

Создайте форму вида:

 

 

 

 Указания:  Для формы задайте свойства: StartPosition=CenterScreen, Text = INI.

На форму нанесите3 поля TextBox и в свойстве Text удалите весь текст.

Слева от полей разместите 3 компонента Label и в свойстве Text введите тексты надписей.

Для создания группы переключателей нанесите компонент GroupBox и в свойстве Text введите название группы. В группе разместите 2 компонента RadioButton и в свойстве Text введите надписи возле переключателей. Для выбора первого переключателя по умолчанию задайте для него свойство Checked = True.

Для создания флажка нанесите на форму компонент CheckBox и в свойстве Text введите название флажка. Для включения флажка по умолчанию задайте для него свойство Checked = True.

Нанесите на форму 3 кнопки Button и в свойстве Text введите надписи на кнопках.

 

Для кнопки задания цвета фона формы нам понадобится компонент ColorDialog, который надо нанести на форму (компонент невидимый, поэтому он будет помещен внизу окна под формой). Для кнопки напишите код:

 

void button1_Click(object sender, EventArgs e)

{

    //диалогу задаем текущий цвет формы

    colorDialog1.Color=BackColor;

    //если в диалоге пользователь выбрал цвет

    if (colorDialog1.ShowDialog()==DialogResult.OK)

        //меняем цвет фона формы на выбранный

        BackColor=colorDialog1.Color;

}

 

Для кнопки очистки формы напишем код:

 

void button3_Click(object sender, EventArgs e)

{

    //очищаем поля

    textBox1.Text=textBox2.Text=textBox3.Text="";

    //ставим курсор в первое поле

    textBox1.Focus();

}

 

Для кнопки расчета напишем код:

 

void button2_Click(object sender, EventArgs e)

{

    //описываем переменные

    double a,b,c;

    //конвертируем содержимое полей в числа

    a = Convert.ToDouble(textBox1.Text);

    b = Convert.ToDouble(textBox2.Text);

    //если выбран первый переключатель

    if (radioButton1.Checked)

        //рассчитываем сумму

        c = a+b;

    //иначе, если выбран второй переключатель

    else

        //рассчитываем разность

        c = a-b;

    //отображаем результат в третьем поле

    textBox3.Text = Convert.ToString(c);

}

 

 При закрытии формы надо сохранять в INI файл размер и положения формы, а также  состояние всех компонентов на форме.

 

 Указания:  по умолчанию C# не имеет  встроенной стандартной поддержки работы с INI файлами. Для решения этой проблемы будем использовать внешний файл, в котором описан класс INIFile.

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

Данный класс имеет два метода: метод записи в файл и метод чтения из файла. Но эти методы могут писать и читать только данные в текстовом формате, поэтому надо будет в коде конвертировать все значения в текст.

 

Для сохранения параметров в событии FormClosing формы напишем код:

 

void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

    //создаем переменную для работы с INI файлом

    //файл находится в папке с программой и имеет имя settings.ini

    //если файл существует, то он открывается, если нет - создается

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

 

    //записываем размер и положение формы в текстовом формате

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

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

    ini.IniWriteValue("Form","X",Left.ToString());

    ini.IniWriteValue("Form","Y",Top.ToString());

 

    //записываем цвет фона формы в текстовом формате

    //метод ToArgb() конвертирует название цвета в число

    //метод ToString() конвертирует полученное число в текст

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

 

    //записываем содержимое текстовых полей на форме

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

    ini.IniWriteValue("Components","textBox2",textBox2.Text);

    ini.IniWriteValue("Components","textBox3",textBox3.Text);

 

    //записываем состояние переключателей и флажков как текст

    //метода ToString() в свойстве Checked нет

    //поэтому конвертируем значение в текст через класс Convert

    ini.IniWriteValue("Components","radioButton1",Convert.ToString(radioButton1.Checked));

    ini.IniWriteValue("Components","radioButton2",Convert.ToString(radioButton2.Checked));

    ini.IniWriteValue("Components","checkBox",Convert.ToString(checkBox1.Checked));

}

 

При запуске программы нужно восстанавливать на форме все сохраненные параметры.

 

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

В событии Load формы напишите код:

 

void Form1_Load(object sender, EventArgs e)

{

    //создаем переменную для работы с INI файлом

    //файл находится в папке с программой и имеет имя settings.ini

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

 

    //считываем из файла размер и положения формы в текстовом формате

    // с помощью метода Convert.ToInt16() конвертируем значения в числа

    Width=Convert.ToInt16(ini.IniReadValue("Form","Width","300"));

    Height=Convert.ToInt16(ini.IniReadValue("Form","Height","190"));

    Left=Convert.ToInt16(ini.IniReadValue("Form","X","600"));

    Top=Convert.ToInt16(ini.IniReadValue("Form","Y","250"));

 

    //считываем значение цвета в текстовом формате

    // с помощью метода Convert.ToInt32() конвертируем в число

    // с помощью метода Color.FromArgb() из числа получаем название цвета

    BackColor=Color.FromArgb(Convert.ToInt32(ini.IniReadValue("Form","Color","-723724")));

 

    //считываем значение текстовых полей

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

    textBox2.Text=ini.IniReadValue("Components","textBox2","");

    textBox3.Text=ini.IniReadValue("Components","textBox3","");

 

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

    //с помощью метода Convert.ToBoolean() конвертируем значение в логическое значение

    radioButton1.Checked=Convert.ToBoolean(ini.IniReadValue("Components","radioButton1","True"));

    radioButton2.Checked=Convert.ToBoolean(ini.IniReadValue("Components","radioButton2","False"));

    checkBox1.Checked=Convert.ToBoolean(ini.IniReadValue("Components","checkBox","True"));

}

 

Добавьте форму-заставку, которая появляется, если на форме установлен флажок.

 

Указания: добавьте в проект новую форму.

Для формы задайте свойства: FormBorderStyle = None, StartPosition = CenterScreen, BackGroundImage - рисунок на форме, BackGroundImageLayout = Stretch.

 

Для отображения заставки перейдите в главный файл проекта Program.cs.

 

Перед командой Application.Run . . . добавьте команды:

 

//создаем переменную для работы с INI файлом

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

//считываем значение параметра checkBox

//если параметр = true (флажок включен)

if (ini.IniReadValue("Components","checkBox","True")=="True")

{

    //создаем форму-заставку в памяти

    Form2 form2 = new Form2();

    //отображаем форму

    form2.Show();

    //обновляем форму для корректного отображения изображения на ней   

    form2.Refresh();

    //делаем паузу в 2 секунды

    System.Threading.Thread.Sleep(2000);

    //удаляем форму из памяти

    form2.Dispose();

}

 

Задание 2. Сохранения параметров в реестре

 

Скопируйте папку с созданным проектом. Реализуйте в нем изменения, чтобы парметры сохранялись в реестр.

 

При закрытии формы надо сохранять в реестре Windows размер и положения формы, а также  состояние всех компонентов на форме.

 

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

 

using Microsoft.Win32;

 

Для сохранения параметров в событии FormClosing формы напишем новый код:

 

void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

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

    RegistryKey reg;

   

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

    //если ветки нет, она будет создана

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

   

    //записываем в реестр размер и положения формы

    reg.SetValue("Width",Width);

    reg.SetValue("Height",Height);

    reg.SetValue("X",Left);

    reg.SetValue("Y",Top);

   

    //записываем в реестр номер цвета фона формы

    //метод ToArgb() из названия цвета позволяет получить его номер

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

 

    //параметры компонентов на форме будем сохранять в новой ветке

    //открываем ветку Software\Myprogram\Components

    //если ветки нет, она будет создана

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

 

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

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

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

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

 

    //сохраняем состояние переключателей и флажка на форме

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

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

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

 

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

    reg.Close();

}

 

При запуске программы нужно восстанавливать на форме все сохраненные параметры.

 

Указания: в событии Load формы напишите новый код:

 

void Form1_Load(object sender, EventArgs e)

{

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

    RegistryKey reg;

 

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

    //если ветки нет, она будет создана

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

 

    //будем считывать данные из реестра и конвертировать их в нужный формат

     // перед чтением проверяем, есть ли в реестре нужный параметр

   

    //считываем размер и положение формы

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

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

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

        Height=Convert.ToInt16(reg.GetValue("Height"));

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

        Left=Convert.ToInt16(reg.GetValue("X"));

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

        Top=Convert.ToInt16(reg.GetValue("Y"));

 

    //считываем цвет фона формы

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

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

 

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

    //если ветки нет, она будет создана

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

 

    //считываем содержимое текстовых полей

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

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

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

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

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

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

 

    //считываем состояние переключателей и флажка на форме

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

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

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

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

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

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

 

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

    reg.Close();

}

 

Измените код для отображения формы-заставки.

 

Указания: для отображения заставки перейдите в главный файл проекта Program.cs.

Для работы с реестром в файл проекта подключите пространство имен:

 

using Microsoft.Win32;

 

Перед командой Application.Run . . . измените команды:

 

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

RegistryKey reg;

 

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

//если ветки нет, она будет создана

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

//считываем значение параметра checkBox

//если параметр = true (флажок включен)

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

    if (reg.GetValue("checkBox").ToString()=="True")

    {

        //создаем форму-заставку в памяти

        Form2 form2 = new Form2();

        //отображаем форму

        form2.Show();

        //обновляем форму для корректного отображения рисунка на ней   

        form2.Refresh();

        //делаем паузу в 2 секунды

        System.Threading.Thread.Sleep(2000);

        //удаляем форму из памяти

        form2.Dispose();

    }

 

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

 reg.Close();