FastReport: Запускаем редактор по двойному клику на файле шаблона

© 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