Delphi

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Delphi] [Контакты]

INI-файлы и системный реестр


Несмотря на то что вы можете хранить настройки приложения любым удобным для вас способом, разработчики обычно используют INI-файлы или системный реестр (Registry) для хранения и извлечения настроек приложений.

Класс TIniFile

Класс TIniFile позволяет хранить настройки приложения в INI-файле. INI-файл представляет собой не что иное, как текстовый файл, имеющий специфическую структуру. Информация в INI-файле сгруппирована по разделам (строкам, заключенным в квадратные скобки), а сами данные хранятся в этих разделах в виде пар ключ=значение.

Ниже показан пример INI-файла:

[Application]
Top=124
Left=142
Width=740
Height=520
Maximized=0
RollUp=0
LastFolder=C:\
[DefaultDisplay]
CompressionQuality=75
BackgroundColor=0
[UndoSettings]
MaxUndoSize=200

Чтобы использовать класс TIniFile в приложении, вы должны добавить модуль IniFiles в список uses.

Конструктор класса TIniFile несколько отличается от конструкторов, используемых нами до настоящего момента. Конструктор TIniFile принимает строку, содержащую путь и имя INI-файла:

constructor TIniFile.Create(const Имя_Файла: string);

Методы, которые позволяют хранить данные в INI-файле. начинаются со слова Write: WriteInteger, WriteString, WriteBool и так далее. Эти методы принимают три параметра: имена раздела и ключа, а также значение, которое необходимо сохранить в INI-файле.

procedure WriteString(const Section, Ident, Value: String);

Методы, позволяющие считывать данные из INI-файла, начинаются со слова Read: ReadInteger, ReadString, ReadBool и так далее. Эти функции также принимают три параметра. Первые два параметра идентичны предыдущим функциям, а последний параметр служит для определения значения по умолчанию, которое будет использоваться, если раздел, ключ или значение не существуют:

function ReadString(const Section, Ident, Default: String): String;

В листинге ниже показано, как сохранять и извлекать настройки из INI-файла

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FIniPath: string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  MAIN_SECTION = 'MainForm';

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Ini: TIniFile;
begin
  { Сохранение INI-файла в каталоге приложения }
  FIniPath := ChangeFileExt(Application.ExeName, '.ini');

  { Чтение сохраненных данных }
  Ini := TIniFile.Create(FIniPath);
  try
    Left := Ini.ReadInteger(MAIN_SECTION, 'Left', 100);
    Top := Ini.ReadInteger(MAIN_SECTION, 'Top', 100);
    Color := Ini.ReadInteger(MAIN_SECTION, 'Color', clWhite);
    Caption := Ini.ReadString(MAIN_SECTION, 'Caption', 'TInifile');
  finally
    Ini.Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(FIniPath);
  try
    Ini.WriteInteger(MAIN_SECTION, 'Left', Left);
    Ini.WriteInteger(MAIN_SECTION, 'Top', Top);
    Ini.WriteInteger(MAIN_SECTION, 'Color', Color);
    Ini.WriteString(MAIN_SECTION, 'Caption', Caption);
  finally
    Ini.Free;
  end;
end;

end.

Класс TRegistry

Реестр является главной базой данных системы, которая может хранить данные, имеющие отношение к операционной системе и приложениям. Реестр представляет собой огромное иерархическое дерево, хранящее данные в узлах (ключах). Каждый ключ в реестре может содержать подключи и значения.

Для доступа к реестру в Delphi используется либо класс TRegistry, либо класс TRegistryIniFile (оба класса объявлены в модуле Registry). Класс TRegistry обычно применяется для доступа к реестру, а с помощью класса TRegistryIniFile с реестром можно работать так, словно он является INI-файлом.

Чтобы прочитать или записать данные в реестр, вы должны открыть один из следующих предопределенных корневых ключей:

  •  HKEY_CLASSES_ROOT
  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE
  • HKEY_USERS
  • HKEY_CURRENT_CONFIG

По умолчанию классы TRegistry и TRegistryIniFile используют ключ HKEY_CURRENT_USER.

Класс TRegistryIniFile, подобно классу TIniFile, принимает параметр имени файла в конструкторе. Если для доступа к реестру выбран класс TRegistryIniFile, то вы должны будете передать имя ключа, а не имя файла. Следующий пример показывает, как записать строку в реестр с помощью класса TRegistryIniFile. Не забудьте добавить модуль Registry в список uses.

procedure TForm1.FormCreate(Sender: TObject);
var
  Reg: TRegistryIniFile;
begin
  Reg := TRegistryIniFile.Create('MyApplication');
  try
    Reg.WriteString('Config', 'MyColor', 'Red');
  finally
    Reg.Free;
  end;
end;

ф2-1

Код в листинге выше создает ключ MyApplication в ключе HKEY_CURRENT_USER, добавляет подключ Config к ключу MyApplication и записывает значение MyColor в подключ Config, как показано на рисунке выше.

Используя класс TRegistry для доступа к реестру, вы обычно должны выполнить следующие действия:

  1. Выбрать корневой ключ, если не хотите использовать ключ HKEY_CURRENT_USER.
  2. Открыть ключ, к которому вы хотите получить доступ.
  3. Прочитать данные в открытом ключе или записать их в него.
  4. Закрыть открытый ключ после завершения чтения или записи данных.

Выбрать другой корневой ключ совсем несложно. Вам необходимо всего лишь назначить один из упомянутых корневых ключей свойству RootKey класса TRegistry.

Для открытия ключа реестра служит метод ОреnКеу. Метод ОреnКеу принимает два параметра: строковый параметр, представляющий имя ключа, который вы хотите открыть, и булевский параметр, который позволяет создать ключ, если он не существует.

Чтобы создать ключ, если он не существует, передайте в качестве второго параметра значение True. Ниже показано объявление метода ОреnКеу:

function ОреnКеу(const Key: String; CanCreate: Boolean): Boolean;

Чтобы закрыть открытый ключ, вызовите метод CloseKey. Метод CloseKey не принимает никаких параметров.

В листинге ниже показано, как использовать класс TRegistry в примере текстового редактора Delphi для регистрации этого приложения как приложения, используемого по умолчанию для работы с текстовыми документами.

procedure TForm1.FormCreate(Sender: TObject);
var
  Reg: TRegistry;
begin
  if MessageDlg('Always use this application to open text documents?',
          mtConfirmation, mbYesNo, 0) = mrYes then
  begin
    Reg := TRegistry.Create;
    try
      { Регистрация приложения }
      Reg.OpenKey('Software\Classes\Applications\Project1.exe\shell\open\command', True);
      Reg.WriteString('', '"' + Application.ExeName + '" "%1"');
      Reg.CloseKey;

      { Сообщить Windows об использовании текстового редактора Delphi для
        загрузки текстовых документов }
      Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt', True);
      Reg.WriteString('Application', 'Project1.exe');
      Reg.CloseKey;
    finally
      Reg.Free;
    end;  // завершение конструкции try (Reg)
  end; // завершение условия if

  { Открытие файла, выбранного в обозревателе }
  FOpenedFile := Paramstr(1);
  if OpenedFile <> '' then
    Editor.Lines.LoadFromFile(ParamStr(1));
end;

Если вы хотите использовать этот код в реальном приложении, то должны будете изменить как минимум две вещи:

  1. Заменить имя файла Project1.exe более осмысленным именем.
  2. Переместить код регистрации из обработчика события OnCreate в особую опцию, которая позволит пользователю зарегистрировать приложение как приложение, используемое по умолчанию для определенного типа файлов.

Источник: Иван Хладни - Внутренний мир Borland Delphi 2006.