Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Урок 8 - Работа с реестром

Ведущий раздела KOL и MCK: Анатолий aka XVeL
Автор: Борис Моренко
WEB-сайт: http://kol.mastak.ru

Полную версию библиотеки KOL и MCK можно скачать здесь.

Сейчас уже стало стандартом, что настройки программы, важные (да и не очень) параметры храняться в реестре Windows. По этой причине и в KOL существует поддержка работы с реестром. Нельзя сказать, что эти инструменты такие же мощные, как и TRegister в VCL, но необходимый минимум найдется.

Работа с регистром в KOL построена с помощью функций. Их список я привожу в таблице с кратким описанием (хотя человек знакомый с TRegister поймет их и так).

Функция Выполняемое действие
Функции для работы с ключами

RegKeyOpenCreate

Создание ключа и его открытие

function RegKeyOpenCreate( Key: HKey; const SubKey: String ): HKey;

RegKeyOpenRead

Открытие ключа для чтения

function RegKeyOpenRead( Key: HKey; const SubKey: String ): HKey;

RegKeyOpenWrite

Открытие ключа для записи

function RegKeyOpenWrite( Key: HKey; const SubKey: String ): HKey;

RegKeyClose

Закрытие ключа регистра ранее открытого с помощью RegKeyOpenRead или RegKeyOpenWrite

procedure RegKeyClose( Key: HKey );

RegKeyDelete

Удаление ключа регистра

function RegKeyDelete( Key: HKey; const SubKey: String ): Boolean;

RegKeyExists

Возвращение true, если "подключ" (SubKey) существует в данном ключе (Key)

function RegKeyExists( Key: HKey; const SubKey: String ): Boolean;

RegKeyGetSubKeys

Возвращение в List список всех "подключей"(ниже лежащих ключей) для ключа Key

function RegKeyGetSubKeys( const Key: HKEY; List: PStrList ): Boolean;

Функции для работы с переменными

RegKeyDeleteValue

Удаление из ключа Key переменной с именем Value.

function RegKeyDeleteValue( Key: HKey; const Value: String ): Boolean;

RegKeyValExists

Возвращение TRUE, если параметр ValueName существует в ключе Key.

function RegKeyValExists( Key: HKey; const ValueName: String ): Boolean;

RegKeyValueSize

Возвращает размер переменной(ValueName). Для переменных типа строка (string) возвращаемое значение равно длине строки + 1 (нулевой символ)

function RegKeyValueSize( Key: HKey; const ValueName: String ): Integer;

RegKeyGetValueNames

Возвращает список всех имен переменных находящихся в ключе Key

function RegKeyGetValueNames( const Key: HKEY; List: PStrList ): Boolean;

RegKeyGetValueTyp

Возвращает тип переменной под именем ValueName. Возвращаемое значение может быть следующие :
REG_BINARY , REG_DWORD, REG_DWORD_LITTLE_ENDIAN,
REG_DWORD_BIG_ENDIAN, REG_EXPAND_SZ, REG_LINK , REG_MULTI_SZ,
REG_NONE, REG_RESOURCE_LIST, REG_SZ

function RegKeyGetValueTyp( const Key: HKEY; const ValueName: String ): DWORD;

Функции для работы с переменными DWORD

RegKeyGetDw

Чтение из ключа данных типа DWORD. Если чтение не успешно, то возвращение 0

function RegKeyGetDw( Key: HKey; const ValueName: String ): DWORD;

RegKeySetDw

Запись в ключ данных типа DWORD.

function RegKeySetDw( Key: HKey; const ValueName: String; Value: DWORD ): Boolean;

Функции для работы с переменными STRING

RegKeyGetStr

Чтение из ключа данных типа String. Если чтение не успешно, то возвращение пустой строки

function RegKeyGetStr( Key: HKey; const ValueName: String ): String;

RegKeyGetStrEx

Чтение из ключа данных типа String. Если чтение не успешно, то возвращение пустой строки. Расширенный по саоим возможносям вариант RegKeyGetStr.

function RegKeyGetStrEx( Key: HKey; const ValueName: String ): String;

RegKeySetStr

Запись в ключ данных типа String.

function RegKeySetStr( Key: HKey; const ValueName: String; const Value: String ): Boolean;

Функции для работы с переменными BINARY

RegKeyGetBinary

Чтение из ключа данных типа binary. Происходит запись данных из реестра в буфер Buffer размером Count. На выходе у функции количество прочитанных байт.

function RegKeyGetBinary( Key: HKey; const ValueName: String; var Buffer; Count: Integer ): Integer;

RegKeySetBinary

Запись в ключ данных типа Binary.

function RegKeySetBinary( Key: HKey; const ValueName: String; const Buffer; Count: Integer ): Boolean;

Функции для работы с датой

RegKeyGetDateTime

Чтение из переменной с именем ValueName дыты. В реестре эти данные хранятся в бинарном виде.

function RegKeyGetDateTime( Key: HKey; const ValueName: String ): TDateTime;

RegKeySetDateTime

Запись даты в реестр.

function RegKeySetDateTime( Key: HKey; const ValueName: String; DateTime: TDateTime ): Boolean;

Для начала работы с каким-либо ключом регистра, вы должны открыть его с помощью функций RegKeyOpenRead, RegKeyOpenWrite или RegKeyOpenCreate. В первом параметре должен передаватся HKey какого нибудь ранее открытого ключа или одна из следующих констант:
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS
Второй параметр:SubKey - имя ключа расположенного ниже Key.

После того как вы открыли ключ, вы можете записывать и читать данные. Ну и логическое завершение всего процесса - это команда RegKeyClose, т.е. закрытие ключа, если он вам больше не нужен.

Пример чтения и записи в реестра:
program Primer_1; 
 
uses 
  windows, 
  messages, 
  kol; 
 
{$R *.RES} 
const 
 KeyWin = 'SOFTWARE\Microsoft\Windows\CurrentVersion'; 
 
var 
 Form, 
 edOption, 
 buOption, 
 List, 
 panTop:pControl; 
 Key:HKey; 
 
/////////////////////////////////////////////////////////// 
Procedure ClickOnList( Dummy : Pointer; Sender : PControl ); 
begin 
 // чтение из реестра 
 Key := RegKeyOpenRead(HKEY_LOCAL_MACHINE,KeyWin); 
 edOption.Text := RegKeyGetStr(Key,List.Items[List.CurIndex]); 
 RegKeyClose(Key); 
end; 
/////////////////////////////////////////////////////////// 
Procedure ClickOnButton( Dummy : Pointer; Sender : PControl ); 
begin 
 // запись в реестра
 if edOption.Text='' then exit; 
 Key := RegKeyOpenWrite(HKEY_LOCAL_MACHINE,KeyWin); 
 RegKeySetStr(Key,List.Items[List.CurIndex],edOption.Text); 
 RegKeyClose(Key); 
end; 
/////////////////////////////////////////////////////////// 
 
begin 
 Form := NewForm(Applet,'Пример работы с реестром').SetSize(400,200); 
 
 // можно было обойтись и Form.CanResize := false 
 Form.Style := WS_BORDER or WS_SYSMENU or WS_VISIBLE; 
 
 Form.Font.FontName := 'MS Sans Serif'; 
 Form.Font.FontHeight := 8; 
 
 panTop := NewPanel(Form,esRaised).SetAlign(caTop); 
 edOption := NewEditbox(panTop,[]); 
 buOption := NewButton (panTop,'Применить').PlaceRight; 
 buOption.OnClick := TOnEvent( MakeMethod( nil, @ClickOnButton ) ); 
 
 List := NewListbox(Form,[]).SetAlign(caClient); 
 List.Add('ProductId'); 
 List.Add('ProductName'); 
 List.Add('RegisteredOrganization'); 
 List.Add('RegisteredOwner'); 
 List.Add('Version'); 
 List.Add('VersionNumber'); 
 List.OnClick := TOnEvent( MakeMethod( nil, @ClickOnList ) ); 
  
 // ----- Наводим красоту жонглируя с размерами.-------- 
 //  Можно и не вникать :) 
 edOption.Width := panTop.Width - buOption.Width-10; 
 buOption.Left := edOption.Width+ 4 ; 
 panTop.Height := edOption.Height+10; 
 //----------------------------------------------------- 
 
 Run(Form); 
end. 
Исходный текст : 1,92 Кб ; размер программы: 30Кб (без сжатия и замены System)
После компиляции вы увидите примерно следующие:

Если вы читали мои предыдущие монологи про KOL, вам должно быть в основном все понятно. Не говорил я только про свойства Font.FontName и Font.FontHeight, но тут можно вполне догадатся, что мы меняем параметры шрифта.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay