Ошибка: Failed to parse the Currency Converter XML document.
$163 864.43


Ошибка: Failed to parse the Currency Converter XML document.
$19 435.63


Ошибка: Failed to parse the Currency Converter XML document.
$29 958.46


Delphi. Работа с реестром

Реестр — один из важнейших элементов windows. Там можно найти множество настроек windows и других программ. Сейчас программистов больше привлекает хранение опций своих программ в реестре нежели в различных ini файлах. Приемущество очевидно : ini файл можно случайно изменить, удалить, или повредить какими-либо некоректными действиями; С записями в реестре это сделать гораздо сложнее... Реестр открывает новые возможности в программировании, в управлении «чужими» программами и других действиях. К примеру в реестре можно прописать программы, которые будут загружаться при старте windows, но их не будет ни в :«Автозагрузке» ни в autoexec.bat..., а в реестре их довольно трудно найти даже опытному программисту. Так что — дерзайте. Я уверен, что знание ключевых моментов в этой области значительно облегчит Ваш труд...


Работа с реестром разделяется на несколько этапов.

1. Вы должны объявить подключение модуля registry в uses.

2. Необходимо создать переменную типа tregistry и инициализировать ее. 3. Собственно работа с реестром.

4. Уничтожение переменной.

uses

..., registry,...

  var

reg:tregistry; // Создание переменной reg


  begin

reg:=tregistry.create; // Инициализирование этой же переменной

//------------ Программа------------

reg.destroy;

  end;

Пункты 1, 2, 4 - ясны. Поэтому оставшаяся часть статьй будет посвящена именно 3-му пункту — работе с реестром. Самое первое дело, после выполнения второго пункта, это определение корневого ключа реестра. Он определяется с помощью свойства rootkey переменной reg.

Корневые ключи реестра:

hkey_classes_root (по умолчанию)

hkey_current_user

hkey_local_machine

hkey_users

hkey_current_config

hkey_dyn_data

Следующие свойства:

currentpath: string; Определяет путь к текущему ключу. currentkey: hkey; Определяет открытый в настоящее время ключ реестра.

  procedure closekey;

Закрывает открытый в данный момент ключ реестра и записывает в реестра все изменения (если таковые были), произведенные в данном ключе. Вызов closekey несколько раз или при отсутствии открытого ключа не вызывает ошибки.

  function createkey(const key: string): boolean;

Создает ключ key (где key — путь с разделителями «», например softwaretest. Имя корневого ключа в пути не указывается !! Он задается через property rootkey. Возвращает true при успешном создании

  function deletekey(const key: string): boolean;

Удалить ключ key (аналогично createkey, только с точностью до наоборот)

  function delete value(const name: string): boolean;

Удалить параметр с именем name текущего ключа. Очевидно, что предварительно необходимо открыть этот ключ

  function getdatainfo(const valuename: string; var value: tregdatainfo): boolean;

Получить информацию о параметре valuename текущего ключа — его тип и размер. При написании программ применяется редко, т.к. программист и сам знает, какого типа его параметры. А вот при написании разного рода утилит для просмотра и редактирования реестра он просто незаменим.

Типы:

tregdatatype = (rdunknown, rdstring, rdexpandstring, rdinteger, rdbinary);

tregdatainfo = record

regdata: tregdatatype; // Тип ключа

datasize: integer; // Размер данных end;

Данная функция возвращает комплексную информацию о параметре, для получения данных о размере или типе можно применять getdatasize и getdatatype

  function getdatasize(const valuename: string): integer;

Получить размер параметра valuename текущего ключа в байтах. Если — при ошибке. Для строкового параметра размер учитывает в размере и один байт для #0, завершающего строку .

  function getdatatype(const valuename: string): tregdatatype;

Получить тип текущего ключа.

  procedure getkeynames(strings: tstrings);

Заполняет указанный strings списком под ключей текущего ключа. Применяется для построения программ просмотра реестра или в том случае, когда количество подключей неизвестно. Например, одна из моих программ создает в одном из ключей несколько подключей с одинаковой структурой, но их количество заранее неизвестно (настройки пользователей).

  procedure get valuenames(strings: tstrings);

Заполняет указанный strings списком параметров текущего ключа.

  function hassubkeys: boolean;

Возвращает true, если текущий ключ имеет подключи и false в противном случае

  function keyexists(const key: string): boolean;

Возвращает true, если ключ key существует. Полезная функция, рекомендуется применять ее перед открытием ключей.

  function loadkey(const key, filename: string): boolean;

Создает ключ key и загружает в него данные из файла с именем filename. Полезно при написании инсталляторов. Возвращает true при успешном выполнении.

  procedure movekey(const oldname, newname: string;

delete: boolean); Копировать или переименовать ключ. В любом случае копирует все из ключа oldname в newname (со всеми подключами). После копирования анализируется delete, и если он true, то ключ oldname уничтожается со всем содержимым. Лично у меня не было потребности в применении данной функции — она не требуется программ и предначначена для построения редакторов реестра

  function openkey(const key: string; cancreate: boolean): boolean;

Очень важная функция — с нее начинается работа с ключом. key — имя открываемого ключа. Если ключ с указанным именем не найден и cancreate=true, то производится попытка создать ключ с указанным именем. Возвращает признак успешности открытия ключа, его обязательно следует анализировать.

  function openkeyreadonly(const key: string): boolean;

Тоже, что и openkey, но открытие идет в режиме «только чтение» Внимание !!!!!! Все функции типа read** при вызове генерируют исключение, если параметр не найден. Это исключение следует отлавливать при помощи try except или проверять наличие параметра при помощи valueexists перед его чтением.

  function readbinarydata(const name: string; var buffer; bufsize: integer): integer;

Читает значение параметра с именем name текущего (открытого) ключа в buffer размером bufsize.

  function readbool(const name: string): boolean;

Считать значение параметра с именем name типа boolean function

readdate(const name: string): tdatetime;

Считать значение параметра с именем name типа дата

  function readdatetime(const name: string): tdatetime;

Считать значение параметра с именем name типа дата-время

  function readtime(const name: string): tdatetime;

Считать значение параметра с именем name типа время

  function readfloat(const name: string): double;

Считать значение параметра с именем name типа double

  function readinteger(const name: string): integer;

Считать значение параметра с именем name типа integer

  function readstring(const name: string): string;

Считать значение параметра с именем name типа string

  function registryconnect(const uncname: string): boolean; Подключить сетевой реестр машины uncname (формат: сетевое имя машины). Перед вызовом этой функции программа должна установить rootkey в значение hkey_users или hkey_local_machine. При успешном соединении и открытии удаленного реестра его rootkey ставится в заданное перед вызовам значение свойства rootkey и возвращается true.

  procedure rename value(const oldname, newname: string);

Переименовать параметр текущего ключа с именем oldname в newname.

  function replacekey(const key, filename, backupfilename: string): boolean;

Заменить место хранения ключа. Обычно ключи хранятся в базовом файле реестра, нот вызовом данной функции можно задать в качестве места хранения ключа отдельный файл с именем filename (его следует предварительно создать при помощи savekey). При каждой перезагрузке компьютера ключ key будет загружаться значениями, считываемыми из файла этого файла filename,т.е. по сути мы имеет дело с ульем (hive) в терминологии windows nt. Определение: Улей — часть реестра (его ячейка). Улей является дискретным набором ключей, подключей и параметров, который находится вверху иерархии реестра. Улей поддерживается одиночным файлом. backupfilename — имя резервной копии, которая создается перед перезаписью данных ключа key. Если кого интересуют подробности, то следует почитать книгу по реестру windows nt, главы типа «Ульи и файлы» и «Целостность и восстановление улья в реестре». При разработке практических приложений я не разу не применял этот вызов.

  function restorekey(const key, filename: string): boolean;

Открывает указанный ключ и перезаписывает его данные и подключи данными из файла filename.

  function savekey(const key, filename: string): boolean;

Сохраняет все параметры указанного ключа и всех его подключей в файле filename. Может применяться совместно с loadkey и restorekey для создания и восстановления ключей реестра.

  function unloadkey(const key: string): boolean;

Удалить улей key из реестра.

  function valueexists(const name: string): boolean;

Проверить, существует ли в текущем ключе параметр с именем name. Весьма полезная функция, т.к. чтение несуществующего параметра приводит к исключительной ситуации

  procedure writebinarydata(const name: string; var buffer; bufsize: integer);

Записать в параметр с именем name данные из буфера buffer размером bufsize. Если параметр существовал, то он будет перезаписан. Если параметр не существовал, то он будет создан. Это справедливо и для всех последующих процедур записи параметров

Остальные процедуры записи — writebool, writecurrency,writedate,writedatetime, writeexpandstring, writefloat, writeinteger, writestring, writetime имеют по два параметра — (имя ключа, значение ключа).

Ну вот, класс описали, теперь приведем парочку примеров.

Пример — запись.

  var reg : tregistry;

  begin

reg := tregistry.create;

reg.rootkey:=hkey_local_machine; reg.openkey(«softwaretest»,true);

reg.writebool(«test1»,true);

reg.writeinteger(«test2»,12);

reg.closekey;

reg.destroy;

  end;

Данный пример создает (если его не было) или открывает ключ реестра hkey_local_machinesoftwaretest и записывает в него два параметра типа boolean и integer

 

Интересное

Какие типы данных...
Я не буду описывать подробно все изобилие типов mysql. Я уверен, что это лишнее.Дело в том, что в mysql-е числовые и текстовые группы типов очень многочисленны.Отличаются типы в этих группах...
Подробнее...
Как узнать информацию о...
Вы, возможно, видели нестандартные дельфийские компоненты, позволяющие сделать лог системы. Сейчас мы самостоятельно реализуем что-нибудь не хуже.Прежде всего, где хранится эта самая системная...
Подробнее...
Что выбрать: Vista x86 или...
Многие пользователи задают и себе и нам вопрос, какую редакцию Windows Vista выбрать: 32-битную или 64-битную? Что ж, попытаемся ответить на данный вопрос и определить плюсы и минусы каждого...
Подробнее...
Основы позиционирования блоков
Блоки — прямоугольные области, используемые в CSS для формирования и отображения документов. Это упрощенно, очень сильно упрощенно, но для начала вполне может и хватить.С появлением нового...
Подробнее...
PHP кодировка писем
У меня часто спрашивают, как отсылать письма с помощью php в правильной кодировке: после отправки письма с русскими буквами, на почту людям приходит абракадабра.А все дело в том, что для почты у...
Подробнее...
chmod - изменение режима...
Все чаще обнаруживается, что некоторые начинающие сайтостроители, увлеченные скриптованием (на perl/cgi, php и т.д.) не знают, что такое chmod и как его использовать. В этом кратком руководстве вы...
Подробнее...
Установка IIS на Windows...
Internet Information Services (IIS) 6.0 – полнофункциональный веб-сервер, обеспечивающий основу для систем семейства Windows Server 2003, а также существующих веб-приложений и веб-служб XML. В IIS...
Подробнее...
Не выбрасывайте вещи в...
Случалось ли у вас такое, что открывая платяной шкаф, вы с ужасом понимали, что новые вещи положить уже некуда? Знакомая ситуация, не правда ли?Находясь в подобной ситуации, я как-то раз решила...
Подробнее...
Работа с Cookies на PHP
Откуда возник термин «cookie» никто достоверно не знает, хотя считается, что во времена зарождения Unix-систем где-то использовалось словосочетание Magic Cookies. Имелись в виду...
Подробнее...
Графический счётчик на PHP
Данный пример демонстрирует работу простого графического счетчика. По функциональности он совершенно идентичен текстовому счетчику.Для работы этого счетчика необходимо создать графическое...
Подробнее...