Работа с системным реестром в Delphi

Чтобы ее инициализи­ровать, нужно присвоить переменной результат вызова метода create объекта TReglniFile:

Regini:=TRegIniFile.Create('Software');

По умолчанию при инициализации вы получаете доступ к разделу реестра HKEY_CURRENT_USER. Методу create нужно передать только один параметр — имя подраздела, который будет сразу открыт в разделе HKEY_CURRENT_USER.

СОВЕТ. ОбъектTReglniFileдостаточно прост и удобен. Для простого сохранения каких-то параметров программы этого объекта будет вполне достаточно.

Итак, после выполнения этого кода мы получили доступ к разделу HKEY_CURRENT_USER\Software. А что если вы хотите открыть еще подраздел и получить доступ к HKEY_CURRENT_USER\Software\Microsoft? Для открытия подразделов у объекта TReginiFile есть метод орепкеу. Вот так можно открыть подраздел Microsoft:

Reglni.QpenKey('Microsoft', true);

У метода орепкеу два параметра:

  • имя подраздела, который надо открыть;
  • надо ли создавать подраздел, если он не существует.

Если в качестве второго параметра передать false, и подраздел не будет суще­ствовать, то произойдет ошибка и ничего не откроется, т. е. вы останетесь на том же уровне реестра, где и были. Ну а если передать значение true и раздел не будет существовать, то функция автоматически создаст его.

Теперь разберемся с чтением и записью. Для чтения есть несколько методов:

  • ReadBool — прочитать булево значение (true или false);
  • Readinteger — прочитать целое число;
  • ReadString — прочитать строку.

Все они очень похожи и имеют одинаковое количество параметров. Единствен­ная разница — в типе третьего параметра. Давайте подробно рассмотрим ReadString, а остальные будем использовать по аналогии с этим методом.

У методов чтения три параметра:

  • имя подраздела, из которого мы хотим прочитать. Допустим, что мы открыли раздел Microsoft и находимся сейчас в реестре по адресу HKEY_ CURRENT_USER\Software\Microsoft. Если мы захотим прочитать строку из подраздела HKEY_CURRENT_USER\Software\Microsoft\MySoftware, то в каче­стве первого параметра вы должны написать: MySoftware;
  • имя параметра;
  • значение, которое будет использоваться по умолчанию, если такой параметр не суще­ствует. Для метода Readstring это должна быть строка или переменная типа "строка".

ВНИМАНИЕ. Сразу необходимо предупредить, что даже если вы будете читать или записывать в реестр число с помощью методов Writelnteger или Readlnteger, объект TReglniFile все равно будет сохранять и читать эти числа как строки. Только после чтения будет преобразование в число. TReglniFile хранит все данные в рее­стре только как строки. Если вы хотите сохранять числа в реестре как обычные числа, то нужно воспользоваться объектом TRegistry. Он является предком для TReglniFile и обладает всеми рассматриваемыми здесь методами.

Str:=RegIni.ReadString('MySoftware', 'Path' , 'с:\');

В этом примере из подраздела MySof tware читается параметр Path. Если такой параметр не существует, то будет возвращено значение по умолчанию - "C:\ ". Ре­зультат чтения записывается в переменную str.

 

Точно так же происходит и запись, только в качестве третьего параметра надо указать не значение по умолчанию, а значение, которое надо записать. Для записи используются три метода:

  • wtiteBool — записать булево значение (true или false);
  • wtiteinteger — записать целое число;
  • wtitestring — записать строку.

Простейший пример записи выглядит так:

Regini.WriteString('MySoftware1, 'Path', 'с:\Windows');

В этом примере мы записываем в подраздел MySoftware параметр Path. Значе­ние, которое будет записано, равно третьему параметру — с: \windows.

После всех операций с реестром его нужно закрыть с помощью метода Free:

Regini.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, то вы можете написать код:

Regini.DeieteValue('Param1)

RootKey— это свойство объекта TReglniFile, которое указывает на головной раздел, который сейчас используется. Как мы уже знаем, по умолчанию исполь­зуется раздел HKEY__CURRENT_USER. Чтобы изменить это значение, нужно просто присвоить другое. Например, в листинге 10.21 приведен код, который записывает значение в раздел HKEY_LOCAL_MACHINE.

WindowState:=TWindowState(FIniFile.Readlnteger('Option', 'WinState', Integer(WindowState)); 

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-файлов), в который нужно записать параметр-значение, а здесь раздел отсутствует.

dle

Помоги проекту! Расскажи друзьям об этом сайте: