Работа с реестром в Delphi Автор статьи - NetCoder В данной статье я расскажу, как работать с реестром в системе программирования Delphi. Для начала давайте разберемся, для чего программисту нужен системный реестр. Первое и самое главное – сохранение настроек приложения. Если в вашей программе довольно большое количество опций, то необходимо их сохранять, чтобы пользователю не приходилось при каждом запуске программы их заново устанавливать. Действительно, в реестре можно сохранять настройки, но это не очень эффективно. Сейчас я объясню почему. Системный реестр один, и он имеет дурную привычку удаляться, например, при смене Windows с 9x на 2000/XP. Я рекомендую сохранять настройки в INI файлах, но это совсем другой разговор. Далее, из реестра можно получать сведения о системе. Некоторые данные – например серийный номер материнки или процессора самостоятельно получить весьма сложно (без ассемблера тут не обойтись), а система при установке все это делает сама и записывает данные в системный реестр. Поэтому весьма удобно не получать сведения самому, а просто извлечь их из системного реестра. Ну и третье – регистрация своей программы в системе. Ну, это для тех маньяков, которые самостоятельно пишут инсталляторы. Для работы с реестром в Delphi предусмотрен класс TRegistry, который объявлен в модуле Registry.pas. Чтобы получить к нему доступ, надо добавить в раздел uses модуль Registry. В принципе, сама работа основывается на двух методах: функции ReadXXX и процедуре writeXXX. Вот небольшой пример: Function GetProcessorName: String; Var R: TRegistry; Begin R:=TRegistry.Create; //Инициализируем класс. R.RootKey:=HKEY_LOCAL_MACHINE; //Присваиваем базовый ключ R.OpenKeyReadOnly(‘HARDWARE\DESCRIPTION\System\CentralProcessor\0’); //Открываем ключ только для чтения Result:=R.ReadString('ProcessorNameString'); //Считываем в результат строковый параметр. R.Free; //Выгружаем класс End; Выше была описана небольшая функция, возвращающая процессор, установленный в системе. У меня она вернула следующее: AMD Athlon™ Processor. Как видите, всего несколькими строками мы получили весьма важный параметр. И все благодаря реестру. Теперь давайте разберемся с приведенным кодом. В разделе var я объявил переменную R типа TRegistry. Далее первой строкой я её инийиализирую. В этом классе описаны два перегруженных конструктора. Второй конструктор позволяет задать уровень доступа к реестру, хотя по умолчанию он равен KEY_ALL_ACCESS, что означает доступ ко всем ключам. Следующей строкой я присваиваю ей одно из главных значений – корневой ключ, с которым мы будем работать. В данном примере вы можете указать тот ключ, который вы хотите, например, HKEY_CURRENT_USER или HKEY_CLASSES_ROOT. Параметр RootKey НЕ строковый, а числовой. То, что я указал всего лишь константа. ВНИМАНИЕ! Если вы присвоили корневому ключу параметр HKEY_LOCAL_MACHINE и пытаетесь считать/записать параметр из HKEY_CLASSES_ROOT, то возникнет ошибка. Следующей строкой я открываю ключ только для чтения. Существует также процедура OpenKey и описана она следующем образом: Procedure OpenKey(const Key: String; cancreate: Boolean); Она открываем ключ, заданный первым параметром. Если ключ не найден и второй парамерт установлен в true, то ключ будет создан. Ну и следующей строкой я считываю в результат функции значение строкового параметра ProcessorNameString, в котором и хранится имя центрального процессора. Класс TRegistry позволяет сохранять и считывать данные в следующих форматах: String, Integer, Boolean, Currency, Float, Binary Data, Time, DateTime. Процедуры записи объявлены следующим образом, например, процедура записи строки: Procedure WriteString(const Name: String; const Value: String); Где первый параметр – имя, под которым записываем, а второй – что именно записываем. Тут может быть какая-нибудь переменная строкового типа или её значение, например – ‘My property’. Аналогично и с другими процедурами записи. Только вместо String будет другой тип. Теперь о функциях чтения. Она объявлена следующим образом: Function ReadString(const Name: String): String; Она возвращает строку, хранимую под именем, заданную параметром. Все довольно просто. Для полноты я дам пример сохранения настроек приложения. Создайте новый проект в Delphi. Киньте на форму компоненты TEdit, TCheckBox, TTrackBar. Имена у них по умолчанию будут следующие: Edit1, Checkbox1, TrackBar1. Не меняйте их. Добавьте в раздел uses модуль Registry. Теперь подумаем. Сохранение настроек должно происходить момент выхода из приложения. Поэтому мы будем обрабатывать событие OnCloseQuery главной формы (именно главной). Напишите обработчик события OnCloseQuery следующим образом: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var R: TRegistry; begin R:=TRegistry.Create; R.RootKey:=HKEY_CURRENT_USER; R.OpenKey('SOFTWARE\MyApplication\Settings',true); R.WriteString('Edit1',Edit1.Text); R.WriteBool('Checkbox1',CheckBox1.Checked); R.WriteInteger('TrackBar1',TrackBar1.Position); R.Free; end; С двумя первыми строками вы разберетесь сами. Третей строкой я создаю ключ SOFTWARE\MyApplication\Settings, а если он уже существует, то открываю заново. Здесь вы можете написать любой другой ключ. Четвертой строкой я записываю под именем Edit1 свойство Text, компонента Edit1. Следующей строкой я записываю параметр булевого типа, хранящегося в свойстве Checked, компонента Checkbox1. И следующей строкой я записываю в реестр значение Position, компонента TrackBar1. Загрузка настроек должна происходить в момент создания именно той формы, на которой находятся эти настройки. И мы будем обрабатывать событие OnCreate. procedure TForm1.FormCreate(Sender: TObject); var R: TRegistry; begin R:=TRegistry.Create; R.RootKey:=HKEY_CURRENT_USER; R.OpenKeyReadOnly('SOFTWARE\MyApplication\Settings'); Edit1.Text:=R.ReadString('Edit1'); CheckBox1.Checked:=R.ReadBool('Checkbox1'); TrackBar1.Position:=R.ReadInteger('TrackBar1'); R.Free; end; В этом коде я считываю обратно в компоненты, то что я записал ранее в реестр. Вот и все. Откомпилируйте проект и измените текст в компоненте Edit1, положение ползунка компонента TrackBar1 или флажка компонента Checkbox1. Потом выключите приложение и запустите его заново. И вы увидите, что значения свойств остались именно такие, какими они были до закрытия. Вы можете открыть regedit и полюбоваться свой работой. Именно так и происходит работа с реестром в системе Delphi, кроме того в модуле Registry описан еще один класс – TRegIni, позволяющий работатьс реестром точно также как с INI файлами. Для более подробной информации почитайте встроенную справку. В следующей статье я намерен познакомить вас с работой с INI файлами, но уже не в Delphi, а в другой системе программирования – C++ Builder.