стандартных. Он является псевдонимом для ветви 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. Последнее введенное

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату