Search
Write a publication
Pull to refresh

ini файлы в c# — давайте проще

Как заядлый (закоренелый) Дельфист, я не мог не попасть в так вот красивый просак, а именно в сохранение определённых настроек программы.
Методы формирования ini файлов отбросил, так как хотелось изящества и нативности, что по русски звучит так: надо проще и понятнее, что бы раз и навсегда сделать и забыть.
Ну и стоит, конечно, отметить, что к ООП я раньше вообще не имел никакого отношения.

И так задача: программа стартует — имеет одно окно (Form1) и одну кнопку (практически бесполезную).
Перемещаем окно по экрану и закрываем программу. Запускаем заново и она, после старта, занимает на экране позицию в которой она была в момент закрытия. Другими словами программа помнит место положение окна.

в Form1.cs добавляем две строки:

using System.IO; // это для работы с файлами
using System.Xml.Serialization; //это для сохранения классов — что и есть серилизация (стрёмное слово)



Нас интересую 3 события: окно загрузилось, окно закрывается и нажата бесполезная кнопка, вот их мы и будем обрабатывать.

Дальше я привожу всё тело программы, так проще комментировать:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        // вот этот самый класс, который мы будем сохранять
        public class iniSettings // имя выбрано просто для читаемости кода впоследствии
        { 
            public int X_pos; // это собственно для хранения X верхнего левого угла окна
            public int Y_pos; // ну а это, соответственно Y
        }


        // нажатие бесполезной кнопки на окне
        private void button1_Click(object sender, EventArgs e)
        {
            // перемещаем окно в позицию на экране X=5 и Y=5
            this.Location = new Point(5, 5);
        }


        // действие при закрытии окна
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

            // создаём копию класса iniSettings с именем iniSet
            iniSettings iniSet = new iniSettings();

            // записываем в переменные класса текущие координаты верхнего левого угла окна
            iniSet.X_pos = Location.X;
            iniSet.Y_pos = Location.Y;


            // выкидываем класс iniSet целиком в файл program.xml
            using (Stream writer = new FileStream("program.xml", FileMode.Create))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(iniSettings));
                serializer.Serialize(writer, iniSet);
            }
        }


        // при загрузке окошка программы
        private void Form1_Load(object sender, EventArgs e)
        {

            // загружаем данные из файла program.xml 
            using (Stream stream = new FileStream("program.xml", FileMode.Open))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(iniSettings));

                // в тут же созданную копию класса iniSettings под именем iniSet
                iniSettings iniSet = (iniSettings)serializer.Deserialize(stream);
              
                // и устанавливаем прочитанные координаты окну
                this.Location = new Point(iniSet.X_pos, iniSet.Y_pos);
             
            }
        }
    }
}


Послесловие.
Иногда очень со скрипом идёт ломка старых стереотипов — я 3 часа бился головой в клавиатуру, выписывая код сохранения в старый добрый ini файл и, увидев во что превращается простенькая задача, бросил это занятие. Да — XML не так красиво читаем как ini файл, но всё равно он правится как вручную, так и сторонними программами.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.