Merlіn
dead wizard
Ответ: Помощь по Delphi
Выкладываю две статьи, воизбежание будущих вопросов полностью, про два способа работы в Delphi c реестром, первый с исп. WinAPI, второй с исп. модуля Registry, а там сам решай.
Выкладываю две статьи, воизбежание будущих вопросов полностью, про два способа работы в Delphi c реестром, первый с исп. WinAPI, второй с исп. модуля Registry, а там сам решай.
Во второй статье вірезан пример (занимает много места).Доступ к реестру средствами API
Создать подраздел в реестре:
RegCreateKey (Key:HKey; SubKey: PChar; var Result: HKey): Longint;
Key - указывает на "корневой" раздел реестра, в Delphi1 доступен только один - HKEY_CLASSES_ROOT, а в Delphi3 - все.
SubKey - имя раздела - строится по принципу пути к файлу в DOS (пример subkey1\subkey2\ ...). Если такой раздел уже существует, то он открывается.
В любом случае при успешном вызове Result содержит Handle на раздел.
Об успешности вызова судят по возвращаемому значению, если ERROR_SUCCESS, то успешно, если иное - ошибка.
Открыть подраздел:
RegOpenKey(Key: HKey; SubKey: PChar; var Result: HKey): Longint;
Раздел Key
Подраздел SubKey
Возвращает Handle на подраздел в переменной Result. Если раздела с таким именем нет, то он не создается.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
Закрывает раздел:
RegCloseKey(Key: HKey): Longint;
Закрывает раздел, на который ссылается Key.
Возврат - код ошибки или ERROR_SUCCESS, если успешно.
Удалить подраздел:
RegDeleteKey(Key: HKey; SubKey: PChar): Longint;
Удалить подраздел Key\SubKey.
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
Получить имена всех подразделов раздела Key:
RegEnumKey(Key:HKey; index: Longint; Buffer: PChar; cb: Longint): Longint;
Key - Handle на открытый или созданный раздел
Buffer - указатель на буфер
cb - размер буфера
index - индекс, должен быть равен 0 при первом вызове RegEnumKey. Типичное использование - в цикле While, где index увеличивается до тех пор, пока очередной вызов RegEnumKey не завершится ошибкой
Возвращает текстовую строку, связанную с ключом Key\SubKey:
RegQueryValue(Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint): Longint;
Ключ\подключ Key\SubKey.
Value - буфер для строки
cb - размер, на входе - размер буфера, на выходе - длина возвращаемой строки.
Возврат - код ошибки.
Задать новое значение ключу Key\SubKey:
RegSetValue(Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar; cb: Longint): Longint;
Ключ\подключ Key\SubKey.
ValType - тип задаваемой переменной,
Value - буфер для переменной
cb - размер буфера. В Windows 3.1 допустимо только Value=REG_SZ.
Возврат - код ошибки или ERROR_SUCCESS, если нет ошибок.
Удаляет значение lpValueName находящееся в ключе hKey:
RegDeleteValue(HKEY hKey, LPCTSTR lpValueName);
hKey - ключ. hKey должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey.
lpValueName - значение, находящееся в ключе hKey.
Возвращает ERROR_SUCCESS если успешно.
Выдает список значений у ключа hKey:
LONG RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
hKey - ключ.
dwIndex - этот параметр должен быть 0 при первом вызове, а далее по анологии с RegEnumKey (т.е. можно использовать в цикле),
lpValueName - буфер для названия значения
lpcbValueName - размер lpValueName
lpReserved должно быть всегда 0
lpType - буфер для названия типа (int)
lpData - буфер для данных
lpcbData-размер для lpData
Примечание:
При каждой новом вызове функции после предыдущего нужно заново переназначить lpcbValueName.
lpcbValueName = sizeof(lpValueName)
Примеры:
{ Создаем список всех подразделов указанного раздела }
procedure TForm1.Button1Click(Sender: TObject);
var
MyKey: HKey; { Handle для работы с разделом }
Buffer: array[0 .. 1000] of char; { Буфер }
Err, { Код ошибки }
index: longint; { Индекс подраздела }
begin
Err := RegOpenKey(HKEY_CLASSES_ROOT, 'DelphiUnit', MyKey); { Открыли раздел }
if Err <> ERROR_SUCCESS then
begin
MessageDlg('Нет такого раздела !!', mtError, [mbOk], 0);
exit;
end;
index := 0;
{Определили имя первого подраздела }
Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer));
while err = ERROR_SUCCESS do { Цикл, пока есть подразделы }
begin
memo1.lines.add(StrPas(Buffer)); { Добавим имя подраздела в список }
inc(index); { Увеличим номер подраздела }
Err := RegEnumKey(MyKey, index, Buffer, Sizeof(Buffer)); { Запрос }
end;
RegCloseKey(MyKey); { Закрыли подраздел }
end;
Использование реестра
Реестр - это центральное хранилище информации о параметрах системы и установленных программах. В версиях Windows до Windows 95 программисты сохраняли параметры программ либо в INI-файлах WIN.INI и SYSTEM.INI, либо в дополнительных INI-файлах. Хотя использование INI-файлов поддерживается и в Win32, Microsoft настоятельно рекомендует для хранения необходимых в работе программы параметров пользоваться реестром. Реестр представляет собой иерархическую базу данных, cостоящую из секций, подсекций и элементов. Каждая секция имеет свое назначение. Хранить данные о пользовательских программах Microsoft рекомендует в секции HKEY_CURRENT_USER и подсекции Software. В этой подсекции вы создаете подсекцию, идентифицирующую вашу программу или фирму, и уже внутри нее располагаете данные.
Модуль Registry
Для упрощения работы с регистратором в состав Delphi (начиная с версии 2.0) входит модуль REGISTRY, содержащий реализацию трех классов, - TRegistry, TRegistryIniFile и TRegIniFile.
Внимание! Чтобы использовать свойства и методы классов TRegistry, TRegistryIniFile и TRegIniFile, необходимо включить в список uses модуль Registry.
TRegIniFile
Собственно говоря, задача класса TRegIniFile - упростить перенос 16-битных программ в среду Windows 95. Методы этого класса эквивалентны методам класса TIniFile в 16-битной версии Delphi. Класс TRegIniFile позволяет обращаться к секции HKEY_CURRENT_USER, считывать и записывать строки (методы ReadString и WriteString), целочисленные значения (методы ReadInteger и WriteInteger), логические значения (методы ReadBool и WriteBool), секции (методы ReadSection, ReadSections и ReadSectionValues), удалять секции (метод EraseSection) и элементы (метод DeleteKey). Рассмотрим на примерах, как используются функции этого класса.
Microsoft рекомендует записывать данные, относящиеся к вашей программе, в подсекции секции HKEY_CURRENT_USER_Software. Предположим (не особенно фантазируя на эту тему), что ваша программа называется RegDemo, и данные для нее располагаются в секции Software\RegDemo. Ниже мы покажем, как поместить в регистратор строчные, целочисленные и логические данные, а затем считать их, - этих операций будет достаточно для того, чтобы сохранить в регистраторе параметры нашей программы, а затем считать их.
Прежде чем записать данные в определенную секцию, ее необходимо создать. Это происходит при вызове конструктора объекта TRegIniFile. В качестве параметра вы указываете название секции, и если таковой не существует, она создается:
RegFile := TRegIniFile.Create(SubKey);
После того как файл регистратора открыт (и создана определенная секция), мы можем записать данные. Поддерживаются три типа данных: целочисленные, логические и строчные данные. Для записи этих данных существуют методы WriteInteger, WriteBool и WriteString. В качестве параметров указываются:
- название подсекции;
- название элемента;
- записываемые данные.
Так, чтобы записать значение элемента MyIntVal в подсекции IntKey, следует выполнить код
RegFile.WriteInteger(IntKey, 'Int_Val', 32000);
а для того чтобы прочесть значение, необходимо вызвать метод ReadInteger (в качестве параметров указываются название подсекции, название элемента и значение по умолчанию):
RegFile.ReadInteger(IntKey, 'Int_Val', 0));
Для чтения логических и строчных данных используются соответственно методы ReadBool и ReadStr, а для их записи – методы WriteBool и WriteString.
{Вырезанный пример}
Класс TRegistry
Прежде чем рассмотреть пример использования свойств и методов класса TRegistry, давайте кратко перечислим их.
В следующей таблице перечислены свойства класса TRegistry.
CurrentKey
Позволяет узнать текущую подсекцию, в которой проводятся операции по чтению и записи. Для изменения подсекции следует использовать методы OpenKey и OpenKeyReadOnly
CurrentPath
Позволяет узнать полное название текущей подсекции
LazyWrite
Задает способ обновления информации в реестре – непосредственно или после вызова метода CloseKey.
RootKey
Задает корневую секцию в реестре. По умолчанию установлено значение HKEY_CURRENT_USER
В следующей таблице перечислены методы класса TRegistry.
CloseKey
Записывает внесенные изменения и закрывает текущую подсекцию
Create
Создает экземпляр класса TRegistry и задает значение корневой секции - HKEY_CURRENT_USER
CreateKey
Создает подсекцию
DeleteKey
Удаляет подсекцию
DeleteValue
Удаляет значение элемента
Destroy
Уничтожает ранее созданный экземпляр класса TRegistry
GetDataInfo
Возвращает тип данных для указанного элемента
GetDataSize
Возвращает размер данных для указанного элемента
GetDataType
Возвращает тип данных для указанного элемента
GetKeyInfo
Возвращает информацию о текущем элементе
GetKeyNames
Возвращает имена подсекций для указанной секции
GetValueNames
Возвращает названия элементов для указанной подсекции
HasSubKeys
Позволяет узнать, имеются ли подсекции для указанной секции
KeyExists
Позволяет узнать, существует ли элемент
LoadKey
Создает новую подсекцию и загружает в нее информацию из указанного файла
MoveKey
Перемещает указанную подсекцию и все вложенные подсекции в заданное место
OpenKey
Открывает подсекцию
OpenKeyReadOnly
Открывает подсекцию только для чтения
ReadBinaryData
Считывает данные в бинарном формате
ReadBool
Считывает данные в булевом формате
ReadCurrency
Считывает данные в формате валюты
ReadDate
Считывает данные в формате даты
ReadDateTime
Считывает данные в формате “дата/время”
ReadFloat
Считывает данные в формате с плавающей точкой
ReadInteger
Считывает данные в целочисленном формате
ReadString
Считывает данные в строчном формате
ReadTime
Считывает данные в формате времени
RegistryConnect
Устанавливает соединение с реестром на другом компьютере
RenameValue
Переименовывает элемент
ReplaceKey
Замещает значение элемента значениями из файла
RestoreKey
Восстанавливает значение элемента из файла
SaveKey
Сохраняет значение элемента в файле
UnLoadKey
Удаляет подсекцию, загруженную методом LoadKey
ValueExists
Позволяет узнать, существует ли значение у элемента
WriteBinaryData
Записывает данные в бинарном формате
WriteBool
Записывает данные в булевом формате
WriteCurrency
Записывает данные в формате валюты
WriteDate
Записывает данные в формате даты
WriteDateTime
Записывает данные в формате “дата/время”
WriteExpandString
Записывает данные в формате "расширенно" строки
WriteFloat
Записывает данные в формате с плавающей точкой
WriteInteger
Записывает данные в целочисленном формате
WriteString
Записывает данные в строчном формате
WriteTime
Записывает данные в формате времени
После того как мы кратко познакомились со свойствами и методами класса TRegistry, давайте рассмотрим несколько примеров их использования.
Инициализация
Перед использованием свойств и методов класса TRegistry, необходимо создать экземпляр этого класса. Например:
var
R: TRegistry;
...R := TRegistry.Create;
Задание корневой секции
Если вы собираетесь работать с секцией, отличной от HKEY_CURRENT_USER (это значение задается по умолчанию), то после инициализации вы должны изменить значение свойства RootKey. Возможны следующие значения:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
Например:
with R do
begin
RootKey := HKEY_LOCAL_MACHINE;
//
// Продолжаем работу с реестром
//
end;