Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Итак, работая с разделами реестра, важно (в общем случае) соблюдать следующую последовательность.

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 = \'Software\Delphi. Трюки и эффекты\Настройки программы\

Открыв Редактор реестра, можно удостовериться в правильном сохранении требуемых нам параметров (рис. 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. Последнее введенное наименование

txtName.Text := reg.ReadString(\'txtName.Text\');

//3. Выбранные в прошлый раз магазины

strShops := reg.ReadString(\'lstShops.Selection\');

shopStart := 1;

for shopEnd := 0 to Length(strShops) do

if strShops[shopEnd] = \',\' then

begin

//Получение имени магазина и выделение его в списке

SelectShop(Copy(strShops, shopStart,

shopEnd – shopStart));

shopStart := shopEnd + 1;

end;

//4. Применение сортировки

chkSort.Checked := reg.ReadBool(\'chkSort.Checked\');

except

on ERegistryException do

//Игнорируем ошибки (просто не

//будут зачитаны данные из реестра,

//например, при первом запуске программы)

;

end;

reg.CloseKey;

reg.Free;

end;

//Процедура выделяет магазин с заданным названием

//(если он есть в списке)

procedure TForm1.SelectShop(strShopName: String);

var

i: Integer;

begin

for i := 0 to lstShops.Count–1 do

if lstShops.Items[i] = strShopName then

begin

lstShops.Selected[i] := True;

Exit;

end;

end;

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

...

Примечание

Чтобы при первом запуске процедуры LoadFilter не появлялись сообщения об исключениях (при работе в отладчике Delphi), снимите флажок Stop on Delphi Exceptions на вкладке Language Exceptions диалогового окна Debugger Options (меню Tools → Debugger Options).

Автозапуск программ

Так уж повелось, что, рассматривая работу с реестром, редко удается удержаться от рассказа, как можно организовать автоматический запуск приложений, минуя пресловутое меню Автозагрузка. Коснемся этой темы и мы: рассмотрим наиболее простые способы автоматического запуска не сервисных (!) программ.

Итак, в ветвях реестра HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE находятся разделы Software\Microsoft\Windows\CurrentVersion\Runи Software\ Microsof t\Windows\CurrentVersion\RunOnce. В первом (Run) сохраняются пути приложений, запускаемых при каждой загрузке Windows. В разделе же RunOnce обычно регистрируются приложения типа инсталляторов, которые запускаются при первой с момента регистрации перезагрузке Windows, но до запуска программы Проводник. При запуске приложения, зарегистрированного в ключе RunOnce, соответствующая запись из этого раздела автоматически удаляется.

От выбора ветви реестра (HKEY_LOCAL_MACHINE ИЛИ HKEY_CURRENT_USER) зависит, в сеансе всех ли пользователей будет запускаться приложение.

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

Пусть на форме приложения расположены три переключателя (рис. 7.9). Процедура, приведенная в листинге 7.16, устанавливает состояния переключателей в зависимости от того, в каком разделе ветви HKEY_LOCAL_MACHINE расположен параметр с именем, совпадающим с именем программы (это условность, котора я нужна для работы нашего примера).

Поделиться:
Популярные книги

Эпоха Опустошителя. Том X

Павлов Вел
10. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том X

Одержимый

Джеймс Питер
Top Thriller
Детективы:
триллеры
маньяки
8.67
рейтинг книги
Одержимый

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Вагант

Листратов Валерий
6. Ушедший Род
Фантастика:
боевая фантастика
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Вагант

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Подросток

Достоевский Федор Михайлович
Проза:
русская классическая проза
9.09
рейтинг книги
Подросток

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

На границе империй. Том 10. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 4

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Хозяин Теней 6

Петров Максим Николаевич
6. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Хозяин Теней 6

Убивать чтобы жить 4

Бор Жорж
4. УЧЖ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 4