стандартных. Он является псевдонимом для ветви HKEY_LOCAL_MACHINESYSTEMCurrentControlSet Hardware ProfilesX Current.
• HKEY_CLASSES_ROOT – в системах Windows 95/98/NT 4.0 и более ранних этот раздел является псевдонимом для ветви HKEY_LOCAL_MACHINESOFTWAREClasses. В Windows 2000/ХР содержимое этого раздела составляется из содержимого разделов HKEY_LOCAL_MACHINE SOFTWAREClasses и HKEY_CURRENT_USERSoftwareClasses.
Доступ к разделам реестра происходит по дескрипторам. Дескриптор раздела можно получить при его создании или открытии, указав дескриптор одной из рассмотренных выше корневых ветвей, а также путь требуемого раздела. Для хранения дескрипторов корневых ветвей реестра определены одноименные константы.
Средства работы с реестром
Для работы с реестром предусмотрена целая группа API-функций. Однако зачем изобретать велосипед, испытывая на себе «удобство» работы с этими функциями? Ведь Borland предоставила нам в распоряжение замечательный по своей простоте класс TRegistry. Использованию этого класса как раз и посвящено несколько следующих абзацев.
Итак, класс TRegistry находится в модуле Registry. Если кому-то все же станет интересно использование API для работы с реестром, то можете заглянуть в этот модуль и там посмотреть, как реализованы методы класса TRegistry.
Примечание
Помимо TRegistry, в модуле Registry можно найти такие классы, KaKTReglniFile и TRegistrylniFile, позволяющие работать с реестром, как будто бы это INI-файл. В ряде случаев использование этих классов вместо TRegistry позволит сократить размер программы, да и значительно ее упростить.
В табл. 7.1 приведены свойства класса TRegistry.
Таблица 7.1. Свойства класса TRegistry
Список констант, которые могут объединяться операцией or для формирования значения свойства Access:
• KEY_QUERY_VALUE – получение значений параметров раздела;
• KEY_ENUMERATE_SUB_KEYS – возможность составления списка подразделов;
• KEY_SET_VALUE – создания параметров в разделе, задание их значений;
• KEY_CREATE_SUB_KEY – создание подразделов;
• KEY_CREATE_LINK – создание символических ссылок (здесь не рассматривается);
• KEY_NOTIFY – право на уведомление об изменении раздела и его подразделов (здесь не рассматривается);
• KEY_READ – комбинация значений KEY_QUERY_VALUE, KEY_ENUMERATE_ SUB_KEYS И KEY_NOTIFY;
• KEY_WRITE – комбинация3Ha4eHtriiKEY_SET_VALUE HKEY_CREATE_SUB_KEY;
• KEY_ALL_ACCESS – комбинация значений KEY_READ, KEY_WRITEH KEY_ CREATEJLINK.
Приводить список всех методов класса TRegistry в книге нерационально, да и незачем. Благо, названия методов говорят сами за себя, к тому же Delphi поставляется с неплохой справочной системой. Здесь же мы остановимся на рассмотрении некоторых особенностей работы с методами класса TRegistry.
Итак, работая с разделами реестра, важно (в общем случае) соблюдать следующую последовательность.
1. Установить значение свойства RootKey, если корневой раздел отличен от HKEY_CURENT_USER. Установить значение свойства Access, если не нужен полный доступ.
2. Открыть методом ОрегКеу или создать методом CreateKey раздел реестра. Если использовать OperKeyReadOnly, то задавать значение свойства Access, как сказано в пункте 1, не имеет смысла.
3. Произвести нужные операции с элементами раздела.
4. Не забыть закрыть раздел, по крайней мере, если вы собираетесь использовать один и тот же объект TRegistry для последовательной работы с несколькими разделами (метод ОрепКеу не закрывает ранее открытый раздел).
Теперь несколько слов о проверке успешности работы методов класса TRegistry. Итак, большинство методов этого класса, осуществляющих доступ к разделам реестра, реализованы как функции, возвращающие True в случае успеха и False при возникновении ошибки. Вероятно, по каким-то чрезвычайно сложным соображениям разработчики класса TRegistry реализовали-таки функцию (!) CreateKey генерирующей исключение ERegistryException в случае неудачи, а не возвращающей значение True или False.
Для чтения/записи параметров разного типа в классе TRegistry предусмотрены пары Read– и Write-методов. Использовать их крайне просто, в чем вы убедитесь далее. Главное, при использовании этих методов не забывать определить тип значений параметров, если он заранее вам точно не известен, например с помощью функции GetDataType. Следует также помнить, что методы работы с параметрами генерируют исключение ERegistryException при возникновении ошибок.
И напоследок о параметре (По умолчанию) – он может присутствовать в каждом разделе. Для обращения к этому параметру используйте пустую строку в качестве имени раздела. Только нужно учитывать, что, в отличие от более ранних версий Windows, в Windows 2000/ХР этот параметр автоматически не создается.
Хранение настроек программы в реестре
Первый простой пример демонстрирует, как можно использовать реестр для сохранения небольшого объема данных между запусками приложения.
Пусть нужно, чтобы формы приложения запоминали свое расположение, размер, введенные и выбранные в элементах управления данные. В таком случае необходимость в сотый раз перетаскивать часто открываемую форму на удобное место не будет раздражать пользователя. Если же форма требует постоянного ввода похожих данных, то восстановление выбранных и введенных в прошлый раз значений будет только плюсом.
Теперь о деле: есть форма для фильтрации запроса к базе данных, она показанна на рис. 7.7.
Рис. 7.7. Форма фильтра для поиска товара
Содержимое формы не суть важно, а важно то, что при нажатии кнопки ОК положение, размер формы, а также данные, введенные пользователем, будут сохранены в реестре при помощи процедуры SaveFilter (листинг 7.14).
Листинг 7.14.
Сохранение параметров формы в реестре
procedure TForm1.OKClick(Sender: TObject);
begin
SaveFilter();
//Выполняем требуемые действия…
end;
//Процедура сохраняет параметры в реестр
procedure TForm1.SaveFilter ();
var
reg: TRegistry; //По умолчанию: RootKey = HKEY_CURRENT_USER
strShops: String;
i: Integer;
begin
reg := TRegistry.Create();
try
//Открываем или создаем раздел, в котором будут
//сохранены параметры формы
reg.OpenKey (strBaseKey + 'Form1', True);
//Сохранение параметров
//1. Размер и положение формы
reg.WriteInteger('Width', Width);
reg.WriteInteger('Height', Height);
reg.WriteInteger('Top', Top);
reg.WriteInteger('Left', Left);
//2. Последнее введенное наименование
reg.WriteString('txtName.Text', txtName.Text);
//3. Выбранные магазины
strShops := '
for i := 0 to lstShops.Count–1 do
if lstShops.Selected[i] then
strShops := strShops + lstShops.Items[i] + ',
reg.WriteString('lstShops.Selection', strShops);
//4. Применение сортировки
reg.WriteBool('chkSort.Checked', chkSort.Checked);
except
on ERegistryException do
MessageBox(Handle, 'Ошибка при сохранении фильтра',
'Поиск товара', MB_ICONEXCLAMATION)
;
end;
reg.CloseKey();
reg.Free ();
end;
В рассматриваемом примере константа strBaseKey, определяющая положение раздела для сохранения настроек, задана следующим образом:
const
strBasekey = 'SoftwareDelphi. Трюки и эффектыНастройки программы
Открыв Редактор реестра, можно удостовериться в правильном сохранении требуемых нам параметров (рис. 7.8).
Рис. 7.8. Параметры формы, записанные в реестр
Считывание параметров формы можно производить, например, при ее создании. Тогда в обработчике события Create достаточно поместить вызов процедуры LoadFilter (листинг 7.15).
Листинг 7.15.
Загрузка параметров формы из реестра
procedure TForm1.FormCreate (Sender: TObject);
begin
LoadFilter();
end;
//Процедура загружает параметры из реестра
procedure TForm1.LoadFilter();
var
reg: TRegistry; //По умолчанию: RootKey = HKEY_CURRENT_USER
strShops: String;
shopStart, shopEnd: Integer;
begin
reg := TRegistry.Create();
try
//Открываем раздел, в котором сохранены параметры формы
reg.OpenKey(strBaseKey + 'Form1', False);
//Загрузка сохраненных ранее параметров
//1. Размер и положение формы
Width := reg.ReadInteger ('Width');
Height := reg.ReadInteger('Height');
Top := reg.ReadInteger('Top ');
Left := reg.ReadInteger('Left');
//2. Последнее введенное