Глава 7. Хранение параметров приложения (работаем с реестром)Любому пользователю всегда приятно, что он находит свою программу именно в том углу экрана, где он ее вчера закрыл, именнно того размера, какой она была на момент закрытия, в той цветовой гамме, которую он установил, диалоги работы с файлами обращаются имеено в ту директорию, в которой был последний раз (или предлагают список последних обращений) и т.д. Значит, нужно запоминать то, что требуется при закрытии программы, где-то хранить и восстанавливать при старте. В Windows для этой цели служит реестр.
Параграф 1. Реестр Windows и возможности его использования в приложенияхРеестр появился, скорее всего, тогда, когда разработчики поняли, что ни один из ini файлов не справится с тем объемом информации, который требуется самой Windows (извлечение текстовой информации требует много времени). Своеобразной корзинкой для "всякого мусора" программ, как самой Windows, так и программ пользователя, был назначен реестр - база данных для хранения сведений о конфигурации компьютера, настроек операционной системы, конфигурации оборудования, данных об установленных программах и типах документов, создаваемых каждой программой, свойствах папок и значков программ, профилях пользователей и т.д. и т.п. То, что хранит ОС, оставим за рамками рассматриваемого нами материала. Найдем место, где разработчики Windows разрешили хранить свой "мусор" программистам. Именно тогда появился термин "засорять реестр". Соблазн использовать системную базу для всего и вся порой превышал всякие разумные границы, а это не только объем памяти, но и время на обращение, время на создание резервных копий и другие затраты ресурса. Кроме того, до XP размер реестра был ограничен. Итак, о месте. Реестр имеет иерархическую древовидную структуру, состоящую из разделов, подразделов и ключей или параметров (особенности хранения базы данных в файловой системе Windows выходит за рамки статьи). Нас интересует место в иерархии настроек, соответствующих пользователю, выполнившему вход в систему. Реестр Windows XP состоит из следующих основных разделов (Рис.1. - меню Пуск/Выполнить regedit):
Рис.1. Разделы реестра Отметим, что нас интересует только раздел HKEY_CURRENT_USER, являющийся ссылкой, линком на определенный подраздел HKEY_USERS. В подразделе Software (Рис.2.) хранится вся информация об установленных программах и их "мусорные ведра". Этот подраздел и предназначен для использования в интересах прикладных программ.
Рис.2. HKEY_CURRENT_USER подраздел Software Параграф 2. Использование реестра в C# для хранения параметров приложенийВ силу своего назначения (хранение настроек и параметров программ пользователей), все языки программирования имеют соответствующии функции для работы с данным разделом. Подробное описание их для C# не имеет большого смысла в силу прозрачности, поэтому, далее показан пример, в котором одна единственная пользовательская функция (iRegistry) выполняет все поставленные нами задачи. Для демонстрации создадим проект решения, показанный на Рис.3.
Рис.3. Демонстрационный проект решения В данном проекте, в отличии от ранее использованного нами, добавлен пункт меню - Tuning\FormColor, контрол ColorDialog и созданы для формы два обработчика событий Load и FormClosed. При до #region Registry - Работа с реестром //При viI=0 - установка и восстановление параметров //При viI=1 - сохранение параметров private int iRegistry(int viI, string sS, string sS1) { //Формируем имя нашего подраздела (здесь HKEY_CURRENT_USER\Software\Wladm\hello) sS = @"Software\" + sS + @"\" + sS1; Microsoft.Win32.RegistryKey clRegistryKey; if (viI == 0) { //Проверяем есть ли наш подраздел clRegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(sS); if(clRegistryKey == null) { //Раздела нет - создаем и открываем для чтения и добавления clRegistryKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(sS); } } else { //Открываем на запись в существующий clRegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(sS, true); } //К этому времени раздел должен быть if (clRegistryKey != null) { if (viI == 0) { //Есть ли параметры в разделе string[] sKeyNames = clRegistryKey.GetValueNames(); if(sKeyNames.Length != 0) { //Параметры есть //Получаем хранимые значения параметров foreach(string s in sKeyNames) { switch (s) { case "width": Width = (int)clRegistryKey.GetValue("width"); break; case "height": Height = (int)clRegistryKey.GetValue("height"); break; case "top": Top = (int)clRegistryKey.GetValue("top"); break; case "left": Left = (int)clRegistryKey.GetValue("left"); break; case "formcolorR": BackColor = System.Drawing.Color.FromArgb((int)clRegistryKey. GetValue("formcolorR"), (int)clRegistryKey.GetValue("formcolorG"), (int)clRegistryKey. GetValue("formcolorB")); break; } } clRegistryKey.Close(); return 0; }//if(sKeyNames.Length != 0) else { //Параметров нет // Записываем инициализирующие значения clRegistryKey.SetValue("width", Width); clRegistryKey.SetValue("height", Height); clRegistryKey.SetValue("top", Top); clRegistryKey.SetValue("left", Left); clRegistryKey.SetValue("formcolorR", (int)BackColor.R); clRegistryKey.SetValue("formcolorG", (int)BackColor.G); clRegistryKey.SetValue("formcolorB", (int)BackColor.B); clRegistryKey.Close(); return 0; } }//if(viI == 0) else { try { //Сохраняем текущие значения clRegistryKey.SetValue("width", Width); clRegistryKey.SetValue("height", Height); clRegistryKey.SetValue("top", Top); clRegistryKey.SetValue("left", Left); clRegistryKey.SetValue("formcolorR", (int)BackColor.R); clRegistryKey.SetValue("formcolorG", (int)BackColor.G); clRegistryKey.SetValue("formcolorB", (int)BackColor.B); clRegistryKey.Close(); } catch (Exception) { //Ошибка работы с реестром return 1; }//try catch return 0; }//if(viI == 0) else }//if (clRegistryKey != null) //Ошибка return 1; }//private int iRegistry() #endregion Эту функцию можно, практически без изменения, помещать в любой проект, добавляя в нее другие хранимые параметры (например, для директорий параметр с типом string, для отмеченных пунктов меню и списков с типом bool и т.п.). То, что хранится в реестре, см. выше на Рис.2. Использование функций показано в следующих кодах: private void Form1_Load(object sender, EventArgs e) { iRegistry(0,"wladm","hello"); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { iRegistry(1,"wladm","hello"); } private void formColorToolStripMenuItem_Click(object sender, EventArgs e) { if(colorDialog1.ShowDialog() == DialogResult.OK) { BackColor = colorDialog1.Color; } } Молчанов Владислав 12.11.2006г. Еcли Вы пришли с поискового сервера - посетите мою главную страничкуНа главной странице Вы найдете программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты). |