unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    chkSort: TCheckBox;
    Button1: TButton;
    Button2: TButton;
    GroupBox1: TGroupBox;
    lstShops: TListBox;
    txtName: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure LoadFilter();
    procedure SaveFilter();
    procedure SelectShop(strShopName: String);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
const
  //Базовый ключ для хранения параметров программы в реестре
  strBasekey = 'Software\Delphi. Трюки и эффекты\Настройки программы';

{$R *.dfm}

//Процедура выделяет магазин с заданным названием (если он есть в списке)
procedure TForm1.SelectShop(strShopName: String);
var
  i: Integer;
begin
  for i := 0 to lstShops.Count-1 do
    if lstShops.Items[i] = strShopName then
    begin
      lstShops.Selected[i] := True;
      Exit;
    end;
end;

//Загрузка настроек формы из реестра
procedure TForm1.LoadFilter();
var
  reg: TRegistry;  //По умолчанию: RootKey = HKEY_CURRENT_USER
  strShops: String;
  shopStart, shopEnd: Integer;
begin
  reg := TRegistry.Create();
  try
    //Открываем ключ, в котором сохранены параметры формы
    reg.OpenKey(strBaseKey + '\Form1', False);
    //Загрузка сохраненных ранее параметров
    //1. Размер и положение формы
    Width := reg.ReadInteger('Width');
    Height := reg.ReadInteger('Height');
    Top := reg.ReadInteger('Top');
    Left := reg.ReadInteger('Left');
    //2. Последнее введенное наименование
    txtName.Text := reg.ReadString('txtName.Text');
    //3. Выбранные в прошлый раз магазины
    strShops := reg.ReadString('lstShops.Selection');
    shopStart := 1;
    for shopEnd := 0 to Length(strShops) do
      if strShops[shopEnd] = ',' then
      begin
        //Получение имена магазина и выделение его в списке
        SelectShop(Copy(strShops, shopStart, shopEnd - shopStart));
        shopStart := shopEnd + 1;
      end;
    //4. Применение сортировки
    chkSort.Checked := reg.ReadBool('chkSort.Checked');
  except
    on ERegistryException do
      //Игнорируем ошибки (просто не
      //будут зачитаны данные из реестра,
      //например, при первом запуске программы)
    ;
  end;
  reg.CloseKey();
  reg.Free();
end;

//Запись настроек формы в реестр
procedure TForm1.SaveFilter();
var
  reg: TRegistry;  //По умолчанию: RootKey = HKEY_CURRENT_USER
  strShops: String;
  i: Integer;
begin
  reg := TRegistry.Create();
  try
    //Открываем или создаем ключ, в котором будут
    //сохранены параметры формы
    reg.OpenKey(strBaseKey + '\Form1', True);
    //Сохранение параметров
    //1. Размер и положение формы
    reg.WriteInteger('Width', Width);
    reg.WriteInteger('Height', Height);
    reg.WriteInteger('Top', Top);
    reg.WriteInteger('Left', Left);
    //2. Последнее введенное наименование
    reg.WriteString('txtName.Text', txtName.Text);
    //3. Выбранные в прошлый раз магазины
    strShops := '';
    for i := 0 to lstShops.Count-1 do
      if lstShops.Selected[i] then
        strShops := strShops + lstShops.Items[i] + ',';
    reg.WriteString('lstShops.Selection', strShops);
    //4. Применение сортировки
    reg.WriteBool('chkSort.Checked', chkSort.Checked);

  except
    on ERegistryException do
      MessageBox(Handle, 'Ошибка при сохранении фильтра',
                 'Поиск товара', MB_ICONEXCLAMATION)
    ;
  end;
  reg.CloseKey();
  reg.Free();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadFilter();
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SaveFilter();
  Close();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close();
end;

end.
