Шрифт:
Интервал:
Закладка:
Теперь о деле: есть форма для фильтрации запроса к базе данных, она показанна на рис. 7.7.
Рис. 7.7. Форма фильтра для поиска товара
Содержимое формы не суть важно, а важно то, что при нажатии кнопки ОК положение, размер формы, а также данные, введенные пользователем, будут сохранены в реестре при помощи процедуры SaveFilter (листинг 7.14).
...Листинг 7.14.
Сохранение параметров формы в реестре
procedure TForm1.OKClick(Sender: TObject);
begin
SaveFilter();
//Выполняем требуемые действия…
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;
В рассматриваемом примере константа strBaseKey, определяющая положение раздела для сохранения настроек, задана следующим образом:
...const
strBasekey = 'SoftwareDelphi. Трюки и эффектыНастройки программы
Открыв Редактор реестра, можно удостовериться в правильном сохранении требуемых нам параметров (рис. 7.8).
Рис. 7.8. Параметры формы, записанные в реестр
Считывание параметров формы можно производить, например, при ее создании. Тогда в обработчике события Create достаточно поместить вызов процедуры LoadFilter (листинг 7.15).
...Листинг 7.15.
Загрузка параметров формы из реестра
procedure TForm1.FormCreate(Sender: TObject);
begin
LoadFilter();
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.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;
Некоторая сложность алгоритма загрузки списка выбранных магазинов обусловлена желанием добиться того, чтобы при изменении списка не выделялись ранее не выбранные магазины (иначе можно было бы просто сохранять индексы).
...Примечание
Чтобы при первом запуске процедуры LoadFilter не появлялись сообщения об исключениях (при работе в отладчике Delphi), снимите флажок Stop on Delphi Exceptions на вкладке Language Exceptions диалогового окна Debugger Options (меню Tools → Debugger Options).
Автозапуск программ
Так уж повелось, что, рассматривая работу с реестром, редко удается удержаться от рассказа, как можно организовать автоматический запуск приложений, минуя пресловутое меню Автозагрузка. Коснемся этой темы и мы: рассмотрим наиболее простые способы автоматического запуска не сервисных (!) программ.
Итак, в ветвях реестра HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE находятся разделы SoftwareMicrosoftWindowsCurrentVersionRunи Software Microsof tWindowsCurrentVersionRunOnce. В первом (Run) сохраняются пути приложений, запускаемых при каждой загрузке Windows. В разделе же RunOnce обычно регистрируются приложения типа инсталляторов, которые запускаются при первой с момента регистрации перезагрузке Windows, но до запуска программы Проводник. При запуске приложения, зарегистрированного в ключе RunOnce, соответствующая запись из этого раздела автоматически удаляется.
От выбора ветви реестра (HKEY_LOCAL_MACHINE ИЛИ HKEY_CURRENT_USER) зависит, в сеансе всех ли пользователей будет запускаться приложение.
Рассмотрим создание простейшей программы, способной определить, запускается ли она автоматически, а если запускается, то каким образом. Программа также будет уметь создавать и удалять параметры в нужных разделах реестра для задания нужного режима запуска.
Пусть на форме приложения расположены три переключателя (рис. 7.9). Процедура, приведенная в листинге 7.16, устанавливает состояния переключателей в зависимости от того, в каком разделе ветви HKEY_LOCAL_MACHINE расположен параметр с именем, совпадающим с именем программы (это условность, котора я нужна для работы нашего примера).
Рис. 7.9. Форма после определения варианта режима запуска приложения
...Листинг 7.16.
Определение режима запуска приложения
procedure TForm1.GetRunMode();
var
reg: TRegistry;
begin
reg := TRegistry.Create();
reg.RootKey := HKEY_LOCAL_MACHINE;
//Определение, как запускается программа (по наличию значений
//в соответствующих разделах)
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersionRun',
False)
then
begin
if reg.ValueExists(Application.Title) then
begin
//Программа есть в разделе Run —
//запускается при каждой загрузке Windows
optAutoRun.Checked := True;
reg.CloseKey();
Exit;
end;
reg.CloseKey();
end;
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersion
RunOnce', False)
then
begin
if reg.ValueExists(Application.Title) then
begin
//Программа есть в разделе RunOnce —
//запускается один раз при старте Windows
optRunOnce.Checked := True;
reg.CloseKey();
Exit;
end;
reg.CloseKey();
end;
//Автозапуск программы (рассматриваемым способом) не включен
optRunNone.Checked := True;
reg.Free();
end;
Параметры запуска изменяются (в рассматриваемом приложении) при нажатии кнопки Применить (листинг 7.17).
...Листинг 7.17. Применение режима запуска
procedure TForm1.cmbApplyClick(Sender: TObject);
var
reg: TRegistry;
begin
reg := TRegistry.Create();
reg.RootKey := HKEY_LOCAL_MACHINE;
//Отмена прошлого режима
//..удаление параметра из раздела Run
if not optAutoRun.Checked then
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersion
Run', False)
then
begin
reg.DeleteValue( Application.Title );
reg.CloseKey();
end;
//..удаление параметра из раздела RunOnce
if not optRunOnce.Checked then
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersion
RunOnce',False)
then
begin
reg.DeleteValue( Application.Title );
reg.CloseKey();
end;
//Установка нового режима (создание параметра в соотвествующем
//разделе)
if optAutoRun.Checked then
//..добавление параметра в раздел Run
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersion
Run', True)
then
begin
reg.WriteString( Application.Title, Application.ExeName);
reg.CloseKey();
end;
if optRunOnce.Checked then
//..добавление параметра в раздел RunOnce
if reg.OpenKey('SoftwareMicrosoftWindowsCurrentVersion
RunOnce',True)
then
begin
reg.WriteString( Application.Title, Application.ExeName);
reg.CloseKey();
end;
//Для верности обновим показания на форме по данным из реестра
GetRunMode();
reg.Free();
end;
При желании вы можете изменить ветвь реестра на HKEY_CURRENT_USER, если приложение (которое вы будете делать) запускалось только для определенных пользователей.
Запуск приложения из командной строки
Сразу оговоримся, что из командной стр оки (например, из окна Запуск программы, открываемого командой Пуск → Выполнить) можно запустить любое приложение: достаточно только ввести его полный или относительный (относительно рабочей папки) путь. Однако, возможно, вы замечали, что некоторые приложения можно запускать, просто вводя в командной строке имя приложения, например msaccess или winword. Займемся обеспечением возможности запуска приложения таким ускоренным способом.
Чтобы зарегистрировать приложение для быстрого запуска, можно поместить его путь в ветвь реестра SOFTWAREMicrosoftWindowsCurrentVersionApp Paths корневого раздела HKEY_CURRENT_USER ИЛИ HKEY_LOCAL_MACHINE. Путь ЕХЕ-файла приложения должен быть записан в параметр (По умолчанию) подраздела, имеющего такое же имя, как и ЕХЕ-файл приложения (включая расширение).
Пример процедуры, регистрирующей приложение для быстрого запуска, приведен в листинге 7.18.
...Листинг 7.18.
Регистрация приложения для запуска из командной строки
procedure RegisterQuickStart();
var
reg: TRegistry;
- Excel. Легкий старт - Дмитрий Донцов - Программы
- Фотоприколы с помощью Photoshop - Юрий Гурский - Программы
- 3ds Max 2008 - Владимир Верстак - Программы
- ArchiCAD. Начали! - Андрей Орлов - Программы
- Word 2007. Легкий старт - Дмитрий Донцов - Программы
- Домашняя бухгалтерия и личные финансы на компьютере - Алексей Гладкий - Программы
- 1С:Предприятие. Зарплата и кадры. Секреты работы - Дмитрий Рязанцев - Программы
- Microsoft Access 2007 - Александр Днепров - Программы
- Самые полезные программы: утилиты - Виталий Леонтьев - Программы
- Работа в Интернете - Дмитрий Макарский - Программы