Чтобы ее инициализировать, нужно присвоить переменной результат вызова метода create объекта TReglniFile:
По умолчанию при инициализации вы получаете доступ к разделу реестра HKEY_CURRENT_USER. Методу create нужно передать только один параметр — имя подраздела, который будет сразу открыт в разделе HKEY_CURRENT_USER.
Итак, после выполнения этого кода мы получили доступ к разделу HKEY_CURRENT_USER\Software. А что если вы хотите открыть еще подраздел и получить доступ к HKEY_CURRENT_USER\Software\Microsoft? Для открытия подразделов у объекта TReginiFile есть метод орепкеу. Вот так можно открыть подраздел Microsoft:
У метода орепкеу два параметра:
- имя подраздела, который надо открыть;
- надо ли создавать подраздел, если он не существует.
Если в качестве второго параметра передать false, и подраздел не будет существовать, то произойдет ошибка и ничего не откроется, т. е. вы останетесь на том же уровне реестра, где и были. Ну а если передать значение true и раздел не будет существовать, то функция автоматически создаст его.
Теперь разберемся с чтением и записью. Для чтения есть несколько методов:
- ReadBool — прочитать булево значение (true или false);
- Readinteger — прочитать целое число;
- ReadString — прочитать строку.
Все они очень похожи и имеют одинаковое количество параметров. Единственная разница — в типе третьего параметра. Давайте подробно рассмотрим ReadString, а остальные будем использовать по аналогии с этим методом.
У методов чтения три параметра:
- имя подраздела, из которого мы хотим прочитать. Допустим, что мы открыли раздел Microsoft и находимся сейчас в реестре по адресу HKEY_ CURRENT_USER\Software\Microsoft. Если мы захотим прочитать строку из подраздела HKEY_CURRENT_USER\Software\Microsoft\MySoftware, то в качестве первого параметра вы должны написать: MySoftware;
- имя параметра;
- значение, которое будет использоваться по умолчанию, если такой параметр не существует. Для метода Readstring это должна быть строка или переменная типа "строка".
В этом примере из подраздела MySof tware читается параметр Path. Если такой параметр не существует, то будет возвращено значение по умолчанию - "C:\ ". Результат чтения записывается в переменную str.
Точно так же происходит и запись, только в качестве третьего параметра надо указать не значение по умолчанию, а значение, которое надо записать. Для записи используются три метода:
- wtiteBool — записать булево значение (true или false);
- wtiteinteger — записать целое число;
- wtitestring — записать строку.
Простейший пример записи выглядит так:
В этом примере мы записываем в подраздел MySoftware параметр Path. Значение, которое будет записано, равно третьему параметру — с: \windows.
После всех операций с реестром его нужно закрыть с помощью метода Free:
Для примера напишем программу, которая будет сохранять свои параметры при выходе и восстанавливать позицию и размер на экране при запуске. Создайте простейшую форму с одной только кнопкой Закрыть. Теперь создайте обработчик события onshow, в котором нужно восстанавливать параметры программы, которые были после последнего закрытия программы. Чтобы не перезагружать этот обработчик, давайте просто напишем вызов метода LoadProgParam. Этого метода пока не существует, но мы его скоро напишем
procedure TForm1.FormShow(Sender: TObject); begin
LoadProgParam; end;
Теперь создайте обработчик события onciose. Здесь будут сохраняться параметры окна. Здесь мы не будем загромождать программу и просто вызовем метод SaveProgParam.
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SaveProgParam ;
end;
Если сейчас попытаться скомпилировать программу, то будет получено три ошибки. Компилятор Delphi "ругается" на то, что не может найти процедуры LoadProgParam и SaveProgParam. Давай создадим их. Для этого поднимитесь в начало модуля и найдите раздел описания закрытых процедур private. Опишите здесь эти две процедуры без всяких параметров:
private { Private declarations }
procedure LoadProgParam;
procedure SaveProgParam;
Теперь нажмите сочетание клавиш <Ctrl>+<Shift>+<C>, и Delphi создаст заготовки под эти процедуры:
procedure TForm1.LoadProgParam;
begin
end;
procedure TForm1.SaveProgParam;
begin
end;
Добавим свой код в эти шаблоны. Для этого напишите в процедуре SaveProgParam содержимое листинга 10.19.
procedure TForm1. SaveProgParam;
var
FIniFile: TReglniFile;
begin
FIniFile := TReglniFile.Create('Software'); // Инициализирую реестр
FIniFile.OpenKey('VR',true); // Открываю раздел
FIniFile.OpenKey('VR-Online',true); // Открываю еще один раздел
if WindowState=wsNormal then
begin
FIniFile.Writelnteger ('Option', 'Width', Width) ;
FIniFile.Writelnteger('Option', 'Heigth', Height);
FIniFile.Writelnteger('Option', 'Left', Left);
FIniFile.Writelnteger('Option', 'Top', Top);
end;
FIniFile.Writelnteger('Option', 'WinState', Integer(WindowState));
FIniFile.Free; //Освобождаю реестр
end;
После инициализации реестра и подготовки разделов делаем проверку, в каком состоянии находится окно. Если windowstate равно wsNormai, то сохраняем параметры окна. Если нет, то этого делать не надо. Если у вас стоит разрешение экрана 800x600, то при максимизированном окне значение его ширины будет 802, а высоты 602. Эти значения больше реального разрешения, и если вы установите их при загрузке, то изменять размеры окна мышью будет неудобно.
После этого сохраняем состояние окна— windowstate. Так как оно имеет тип TWindowState, ТО приходится приводить ЭТОТ ТИП К Integer с помощью записи integer (windowstate). Благо типы совместимы и с приведением типов не возникает проблем.
Процедура LoadProgParam работает таким же образом, и ее содержимое вы можете увидеть в листинге 10.20.
procedure TFormi.LoadProgParam; var
FIniFile: TReglniFile; begin
FIniFile := TReglniFile.Create('Software');
FIniFile.OpenKey('VR',true);
FIniFile.OpenKey('VR-Online',true);
Width:=FIniFile.Readlnteger('Option', 'Width', 600);
Height:=FIniFile.Readlnteger('Option', 'Heigth', 400);
Left:=FIniFile.Readlnteger('Option', 'Left', 10) ;
Top:=FIniFile.Readlnteger('Option', 'Top', 10);
WindowState:=TWindowState(FIniFile.Readlnteger('Option', 'WinState' , 2));
FIniFile.Free; end;
Рассмотрим еще несколько методов, которые могут быть полезны при работе с реестром.
DeleteValue — удалить значение из реестра. Например, если вам нужно удалить значение с именем width, то вы можете написать код:
RootKey— это свойство объекта TReglniFile, которое указывает на головной раздел, который сейчас используется. Как мы уже знаем, по умолчанию используется раздел HKEY__CURRENT_USER. Чтобы изменить это значение, нужно просто присвоить другое. Например, в листинге 10.21 приведен код, который записывает значение в раздел HKEY_LOCAL_MACHINE.
FIniFile.Free; //Освобождаю реестр end;
После инициализации реестра и подготовки разделов делаем проверку, в каком состоянии находится окно. Если windowstate равно wsNormal, то сохраняем параметры окна. Если нет, то этого делать не надо. Если у вас стоит разрешение экрана 800x600, то при максимизированном окне значение его ширины будет 802, а высоты 602. Эти значения больше реального разрешения, и если вы установите их при загрузке, то изменять размеры окна мышью будет неудобно.
После этого сохраняем состояние окна— windowstate. Так как оно имеет тип TWindowState, ТО приходится приводить ЭТОТ ТИП К Integer с помощью записи integer (windowstate). Благо типы совместимы и с приведением типов не возникает проблем.
Процедура LoadProgParam работает таким же образом, и ее содержимое вы можете увидеть в листинге 10.20.
procedure TFormi.LoadProgParam; var
FIniFile: TReglniFile; begin
FIniFile := TReglniFile.Create('Software');
FIniFile.OpenKey('VR',true);
FIniFile.OpenKey('VR-Online',true);
Width:=FIniFile.Readlnteger('Option', 'Width', 600);
Height:=FIniFile.Readlnteger('Option', 'Heigth', 400);
Left:=FIniFile.Readlnteger('Option', 'Left', 10) ;
Top:=FIniFile.Readlnteger('Option', 'Top', 10);
WindowState:=TWindowState(FIniFile.Readlnteger('Option', 'WinState' , 2));
FIniFile.Free; end;
var
Regini:TReglniFile;
begin
Regini:=TRegIniFile.Create(1 Software');
Regini.RootKey:=HKEY_LOCAL_MACHINE;
Regini.OpenKey('VR-online', true);
Regini.WriteString('Razd', 'Param', Editl.Text);
Regini.Free; end;
Объект TReglniFile универсален и может работать не только с реестром, но и с INI-файлами. Так как такие файлы морально устарели и их не желательно использовать, то здесь не будем рассматривать примеры работы с ними. Хотя код будет тот же самый, только конструктору create нужно указать имя INI-файла, а лучше указать еще и путь.
При рассмотрении реестра был упомянут объект TRegistry. Это объект, который предназначен для работы только с реестром. Как мы уже знаем, объект TReglniFile всегда записывает в реестр только строки, даже если пишется число с помощью метода writeinteger. Это связано с тем, что этот объект позволяет работать с реестром как с BMI-файлом. А так как файл может содержать только строки, то и объект работает со строками.
Реестр, в отличие от INI-файлов, — это база данных. Поэтому она позволяет хранить не только строки, но и числа, и данные, и логические операторы. Если вы хотите, чтобы данные сохранялись и читались в виде типов, отличных от строк, то необходимо работать через объект TRegistry. Он также объявлен в модуле registry, поэтому вы должны подключать этот модуль в раздел uses.
Работа с TRegistry практически такая же, как и с TReglniFile. Посмотрите на листинг 10.22, и вы увидите много общего.
var
Reg:TRegistry; begin
Reg:=TRegIniFile.Create; //Инициализация
Reg.RootKey:=HKEY_LOCAL_MACHINE;//Выбираю корень реестра
//По умолчанию это HKEY_CURRENT_USER
Reg.OpenKey('SYSTEM', true); //Открываю раздел SYSTEM
Reg.QpenKey('CurrentControlSet', true);//Открываю раздел CurrentControlSet
Reg.OpenKey('Control', true);
Reg.OpenKey('Session Manager', true);
Reg. OpenKey (' Memory Management' , true) ;
//Записываю параметр ClearPageFileAt£$iutdown Reg.Writelnteger('ClearPageFileAtShutdown', 112);
//Читаю параметр Hidden Reglni.Readlnteger('Hidden')
Reg.CloseKey;//Закрываю ключ Reg.Free; //Освобождаю объект end;
Это связано с тем, что этот объект позволяет работать с реестром как с BMI-файлом. А так как файл может содержать только строки, то и объект работает со строками.
Реестр, в отличие от INI-файлов, — это база данных. Поэтому она позволяет хранить не только строки, но и числа, и данные, и логические операторы. Если вы хотите, чтобы данные сохранялись и читались в виде типов, отличных от строк, то необходимо работать через объект TRegistry. Он также объявлен в модуле registry, поэтому вы должны подключать этот модуль в раздел uses.
Работа с TRegistry практически такая же, как и с TReglniFile. Посмотрите на листинг 10.22, и вы увидите много общего.
В этом примере чтение и запись будут происходить с числами, а не со строками с последующим преобразованием в число.
Обратите внимание, что после создания объекта нужно выбрать раздел, с которым вы будете работать. В объекте TReglniFile мы использовали значение по умолчанию. При записи у метода writelnteger только два параметра:
- имя параметра, который мы хотим записать;
- значение параметра.
Здесь отсутствует раздел, потому что запись будет происходить в текущий раздел. При использовании объекта TReglniFile в качестве первого параметра метода был указан раздел (это было связано со спецификой INI-файлов), в который нужно записать параметр-значение, а здесь раздел отсутствует.