© 2002 Сергей Секела
Господин Цыганенко и его команда потрудились на славу: их продукт Fast Report полюбили все (или практически все) программисты необъятной exUSSR и не только ;). Все в нем супер, но есть одна неувязочка – редактор шаблонов отчетов там сделан очень хорошо, НО он идет только в модулях, и не запустив среду программирования (в моем случае Delphi), или не поставив в программе поддержку редактирования шаблонов. А теперь такой пример: Вы находитесь в какой-то папке, в которой есть шаблон, чтобы его запустить вы или копируете полное имя файла (можна сделать через Total (до не давнего времени Windows) Commander), или идете в каталог где находится программа, в которой встроен модуль генератора отчетов и потом в нем после открытия диалога "Открыть" шастаете по иерархии папок, пока найдете нужный Вам шаблон. Вот Вам и автоматизация, как говорит мой шеф: "Полная автоматизация – нажал кнопку и спина мокрая"– ИМХО так быть недолжно, ибо мы делаем так, чтобы нам было проще.
Как Вы наверно поняли, будем писать программу, которая сама себя свяжет с расширением ".frf" и будет даже реагировать на параметры в командной строке (связать, отменить связывание, показать параметры, показать пустой редактор отчетов, загрузить шаблон и показать его в редакторе).
Итак начнем:
На форму ставим все доступные компоненты FastReport’а. (чтобы потом небыло неувязок, типа: О а я не могу поставить штрих-код).

Не пугайтесь, что на форме Label’ы наезжают один на другой, просто они становятся видимыми относительно того какой параметр был в командной строке.
Ставим иконку программы из редактора FastReport’a (ну чтоб было видно, что программа только для него родимого).
Будем отлавливать такие параметры, с командной строки:
| Параметр | Действия |
| /i | Привязать программу к типам файлов ".frf" |
| /u | Снять привязку к типам файлов ".frf" |
| /p | Показать окно "Параметры" |
| <имя файла .FRF> | Открыть файл FRF |
|   | Открыть пустой редактор шаблонов |
Для того чтобы связать программу с типом frf выполняем такую процедуру:
//--8< ------------------------ //Inst
procedure tform1.inst;
var reg:TRegistry; // работаем с реестром
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT; // Именно здесь инфа
// о расширениях файлов
Reg.OpenKey('.frf',True); // Открываем ".frf", если не существует,
// значит создаем его
Reg.WriteString('','frffile');
Reg.CloseKey;
Reg.OpenKey('frffile',True);
Reg.WriteString('','Шаблон отчета FastReport'); //описание
Reg.OpenKey('DefaultIcon',True); //ставим иконку из EXE файла
Reg.WriteString('',ParamStr(0)+',0'); // записываем
Reg.CloseKey; // закрываем
Reg.OpenKey('frffile\shell\open\command',True); // открываем
Reg.WriteString('',ParamStr(0)+' %1'); // Записываем
//формат запуска
Reg.Free;
application.terminate; // выходим ;)
end;
//--8< ------------------------
Для того, чтобы отменить привязку, нужно просто удалить ключ ‘.frf’, в HKEY_CLASSES_ROOT. Так как мы работаем с реестром, значит не забываем подключить в секции Uses модуль Registry.
Теперь посмотрим как устроено отлавливание параметров командной строки, ставим в OnCreate формы такие строчки:
//--8< ------------------------ //FormCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
application.Title:='Редактор отчетов FastReport';
If paramcount=0 then
begin
frreport1.DesignReport;
application.Terminate;
end
Else
if (paramstr(1)='/p') or (paramstr(1)='/P')or
(paramstr(1)='-p') or (paramstr(1)='-P') Then
ShowReg
else
if (paramstr(1)='/i') or (paramstr(1)='/I')or
(paramstr(1)='-i') or (paramstr(1)='-I') Then
inst
else
if (paramstr(1)='/u') or (paramstr(1)='/U')or
(paramstr(1)='-u') or (paramstr(1)='-U') Then
uninst
else
Showrep;
end;
//--8< ------------------------
Как вы уже наверное догадались функция paramstr(index) возвращает i-тый параметр (параметры в командной строке отделяются один от другого пробелом). Здесь мы отловили все наши ключи командной строки. Когда не встречается ни один из этих ключей, запускается процедура Showrep, которая запустит редактор отчетов и загрузит соответствующий шаблон. Все вроде нормально, но кто-то может сказать примерно следующее: "А если файл будет в каталоге с именем "Program files" то тогде же это будет ДВА параметра???!!!",- Да там будет два параметра, но мы их склеим в одну строчку ;).
//--8< ------------------------ //ShowRep
procedure tform1.showrep;
var
fn:string;
i:byte;
begin
if paramcount>0 then
begin
Label1.Visible:=true;
label2.Visible:=true;
for i:=1 to paramcount do
fn:=fn+' '+paramstr(i); // Если файл находится в каталоге,
// в котором есть пробелы,
delete(fn,1,1); // то у нас будет несколько параметров
// - тут мы все параметры
frreport1.LoadFromFile(fn); // обьеденяем в одну строчку
//(и добавляем пробелы в нужных местах)
end;
frreport1.DesignReport;
application.Terminate;
end;
//--8< ------------------------
Итак, у нас получилась программа, которая реагирует ключи, указаные в командной строке, и выполняет даже полезные функции (Благодаря тому же господину Цыганенко и его команде). Теперь можна в каталог программы сделать такие командные файлы (старые добрые "*.bat" файлы, которые живут со времен DOS’а), чтобы не мучатся с ключами:
На основе отлавливания ключей в командной строке, можно сделать много вариантов инсталляции в любой программе, тот вариант, который был использован здесь – это только один из вариантов и он простейший (я его выбирал специально, чтобы все было все понятно).
Вот собственно и все. Пример конечно прилагается, НО учтите, что в нем включены ВСЕ модули Фастрепорта (даже поддержка Interbase через FIBPlus) – Если у вас установлены не все компоненты ФастРепорта, тогда при запуске проекта на все вопросы жмете на "Cancel", и удаляете ссылки на все модули, по которых вылетит ошибка "Модуль не найден".
Copyright© 2002 Сергей Секела Специально для Delphi Plus