Content


I-1: Версия от 5.11.2003

 Конференция:  fido7.ru.delphi.reports

I-2: Введение

 FAQ  создан  с  помощью  программы  FAQ  Maker  ver.  1.1
 от  Анатолия  Подгорецкого
 
 Доступен  на  http:/www.podgoretsky.com  или  http://podgoretsky.pri.ee
 
 Альтернативный  источник  FAQ  центр  ,  более  быстрый  хостинг,    хранятся  всевозможные  FAQ,  не  только  из  иерархии  FIDO7.RU.DELPHI.*
 
 Первичный  источник  http://www.fastreport.ru/ru/faq.php

I-3: Копирайты

 Copyright  ©  1998-2003  by  Fast  Reports,  Inc.
 Публикуется  с  разрешения  Fast  Reports,  Inc.

I-4: Преамбула

 Данный  FAQ  стал  возможным  благодаря  любезному  разрешению  корпорации  Fast  Report
 Ни  какие  изменения  в  текст  FAQ  не  вносятся,  за  исключением  нумерации  вопросов.  По  технологическим  причинам  и  с  целью  преемственности  с  другими  FAQ  этой  серии.
 
 Любые  предложения  по  внесению  изменений  должны  посылаться  на  адрес  michael@fast-report.com
 
 NB!  темы  7-10  имеют  статус  неофициальных,  пока  не  включены  в  официальный  FAQ  (7.11.2003)

I-5: Доступность этого FAQ

 Этот  документ  регулярно  изменяется  в  результате  отслеживания  содержимого  базового  FAQ  на  сайте  производителя  продукта  http://www.fastreport.ru/ru/faq.php
 
 Распространение  и  использование  этого  документа  возможно  только  с  разрешения  Fast  Reports,  Inc,  в  случае  получения  такого  разрешения,  дополнительное  разрешение  не  требуется.
 
 Остерегайтесь  подделок.

I-6: Источники информации

 Основыным  источником  инфорамации  по  Fast  Report  является  сайт  корпорации,  насположеный  по  следующему  адресу:  http://www.fastreport.ru
 
 На  сайте  есть  FAQ,  форум,  документация  и  другая  связанная  с  продуктом  информации

Q-7: Слышал, что в FR можно сделать ссылки на другие страницы отчёта

 1.  Q:  Слышал,  что  в  FR  можно  сделать  ссылки  на  другие  страницы  отчёта  во  время  предварительного  просмотра.  Но  вот  КАК  их  сделать?
 
 A:  В  FastReport  2.51  появилась  возможность  использовать  ссылки  для  перехода  на  другие  страницы  во  время  предварительного  просмотра.  Переход  осуществляется  всегда  на  начало  страницы.  Для  создания  ссылки  имя  объекта  отчета  типа  TfrMemoView  должно  иметь  следующий  формат:  
 
 URL*.  Аббревиатура  URL  служит  исключительно  для  распознавания  того,  что  это  гиперссылка.
 
 Например:  URL10,  URL5,  URL_MAIN  и  т.д.
 
 В  свойстве  Tag  выбранного  объекта  TfrMemoView  с  именем  URL*  указывается  конструкция  вида  @pagenumber,  где  pagenumber  v  номер  страницы  для  перехода  во  время  клика  на  объект.  Например:  @1  v  переход  на  страницу  1,  @65  v  переход  на  страницу  65,  @[RESULTS]  v  переход  на  страницу  с  номером  из  переменной    RESULTS.
 
 Пример  создания  оглавления.
 
 В  скрипте  OnBeforePrint  бенда,  который  должен  быть  включен  в  оглавление,  присваиваем  значение  некой  переменной,  например  с  именем  RESULTS,  значение  PAGE#  (иными  словами  создаем  Lякорь¦  для  последующего  перехода).  В  оглавлении  создаем  MemoView  с  именем  URL1.  В  тексте  MemoView  пишем  название  пункта  перехода,  а  в  свойстве  Tag  помещаем
 значение  @[RESULTS].  
 
 Более  детальный  пример  можно  посмотреть,  скачав  и  установив  файл
 
 http://www.fastreport.ru/files/fr251demo.exe

Q-8: А настоящий URL - ссылки на страницы - можно?

 2.  Q:  А  настоящий  URL  -  ссылки  на  страницы  -  можно?
 
 A:  Ссылки  на  любой  URL  создаются  аналогично  ссылкам  на  страницы    (п.1)  за  исключением  того,  что  в  свойстве  тег  непосредственно        прописывается  URL  (к  примеру,  http://www.fastreport.ru  )
 
 Объект  указанный  в  URL  будет  открыт  браузером  по  умолчанию  во  время        клика  на  объект  со  ссылкой.
 
 Более  детальный  пример  можно  посмотреть,  скачав  и  установив  файл
 
         http://www.fastreport.ru/files/fr251demo.exe

Q-9: Есть ли у отчёта такие свойства как "комментарий", "дата создания"

 3.  Q:  Есть  ли  у  отчёта  такие  свойства  как  "комментарий",  "дата  создания"  (можно  ли  защитить  отчёт  паролем?  и  т.д.)
 
 A:  Начиная  с  FR  версии  2.5  -  есть  и  можно.
 
               ReportName:  String  -  название  отчета;
               ReportAutor  :  String  -  автор  отчета;
               ReportComment:  String  -  комментарий  к  отчету;
               ReportVersionMajor,  
               ReportVersionMinor,  
               ReportVersionRelease,  
               ReportVersionBuild:  String  -  поля  номера  версии  отчета;
               ReportPasswordProtected:  Boolean  -  признак  защиты  паролем;
               ReportPassword:  String  -  пароль  для  доступа  к  отчету.
 
 Вышеуказанные  свойства  доступны  для  редактирования  в  дизайнере.  Существует  также  два  свойства,  которые  заполняются  дизайнером  автоматически:
 
         ReportCreateDate:  TDateTime  -  дата  и  время  создания  отчета;
         ReportLastChange:  TDateTime  -  дата  и  время  последней  модификации  отчета.
 
 Доступ  ко  всем  выше  описанным  свойствам  можно  получить  из  кода  программы  путем  прямого  обращения  к  ним.
 
 Например:
 
 ShowMessage(frReport1.ReportComment);
 frReport1.ReportComment  :=  [This  is  comment!];
 
 Также  возможен  доступ  ко  всем  этим  свойствам  из  скрипта  отчета.
 
 Например:
 [REPORTNAME].

Q-10: Хочу в триальной версии своей программы выводить "Nag Label" в отчёт

 4.  Q:  Хочу  в  триальной  версии  своей  программы  выводить  "Nag  Label"  в  отчёт,  который  был  бы  недоступен  для  удаления  пользователю.
 
 A:  Пример  использования  возможности  модификации  нужных  страниц  после  операции  PrepareReport  (непосредственно  перед  печатью).
 
 var
     m  :  TfrMemoView;

Q-11: FR не печатает на каком-то принтере.

 Q:1.1.  FR  не  печатает  на  каком-то  принтере.
 (варианты:  при  выборе  принтера  возникает  exception;  некоторые  страницы  не  печатаются;  часть  букв  повернута  на  90  градусов;  текст  сбился  в  кучу  и  т.д.)
 (проблема  известна  с  принтерами  от  Xerox,  Canon  и  HP).
 
 Попробуйте  убрать  комментарий  со  строки  {$DEFINE  PRN_RESET}  в  файле  FR_Prntr.pas  и  перекомпилировать  пакет  FR  и  ваш  проект.  Как  правило,  проблема  решается.  Если  это  не  помогло,  попробуйте  поставить  драйвер  от  похожей  модели  принтера.
 
 (HP  LJ  1000w  -  многостраничные  отчеты  не  печатаются  -  все  страницы  печатаются  на  одном  листе  -  нашел  новый  драйвер,  все  заработало)

Q-12: Не могу установить пользовательские размеры бумаги.

 Q:1.2.  Не  могу  установить  пользовательские  размеры  бумаги.
 (Диалог  "Параметры  страницы"  в  дизайнере,  поля  для  ввода  размеров  все  время  недоступны).  
 
 FR  использует  только  размеры  бумаги,  поддерживаемые  драйвером  принтера.  Если  в  списке  типов,  возвращаемых  драйвером,  присутствует  пользовательский  размер  (номер  бумаги  в  Windows  -  0100h),  то  поле  для  ввода  размеров  станет  доступным  при  выборе  этого  типа  бумаги.  (Некоторые  драйверы  используют  другой  номер  для  пользовательского  размера,  отличный  от  100h  -  с  ними  FR  также  не  будет  разрешать  ввод  размеров).

Q-13: Объекты не смещаются при изменении левой или правой границы печати.

 Q:1.3.  Объекты  не  смещаются  при  изменении  левой  или  правой  границы  печати.  
 
 Левая  и  правая  границы  влияют  только  на  отчеты  типа  Cross-tab.  В  обычных  отчетах  можно  задать  св-во  объектов  BandAlign  =  baLeft  (к  примеру),  и  объект  будет  прижат  к  левой  границе  автоматически.  Если  у  бэнда  несколько  объектов  с  BandAlign  =  baLeft,  то  они  будут  прижаты  друг  к  другу.  Самому  крайнему  справа  объекту  при  этом  можно  установить  BandAlign  =  baRest,  тогда  он  займет  все  оставшееся  до  правой  границы  пространство.

Q-14: Экспорт в другие форматы (word, html, text) работает криво.

 Q:1.4.  Экспорт  в  другие  форматы  (word,  html,  text)  работает  криво.  
 (смещение  текста,  пустые  строки  и  пр.)
 
 А  что  вы  хотели?  ;)  В  FR  координаты  объектов  в  пикселях,  в  MSWord,  html,  txt  -  построчное  представление  информации.  При  экспорте  из-за  этого  неизбежны  искажения.  Попробуйте  поиграть  настройками  фильтра  экспорта  (коэффициенты  преобразования  по  X  и  Y,  опция  удаления  пустых  строк).  
 
 (не  экспортируются  некоторые  объекты,  напр.  объект  Rich)
 Попробуйте  взять  другой  фильтр  экспорта  -  в  powerpack  их  много.  Кроме  того,  есть  замечательные  (небесплатные,  правда)  фильтры  от  Pragnaan  Software  -  ссылка  на  них  есть  на  домашней  странице  FR.

Q-15: Во всех диалогах FR написана какая-то фигня.

 Q:1.5.  Во  всех  диалогах  FR  написана  какая-то  фигня.  
 
 а)  установлены  неверные  языковые  ресурсы.  Скомпилируйте  FR  с  русскими  ресурсами  (для  этого  запустите  FRRESRUSSIANmk.bat).
 
 б)  конфликт  ресурсов  FR  с  ресурсами  одного  из  установленных  компонентов.  Ресурсы  FR  занимают  диапазон  53000..59000.  Исправьте  константу  frRes  в  файле  FR_Const.pas  для  смещения  нижней  границы  диапазона  и  перекомпилируйте  пакет  FR.  

Q-16: При установке пакета FR Delphi требует другие пакеты, которых у меня нет.

 Q:1.6.  При  установке  пакета  FR  Delphi  требует  другие  пакеты,  которых  у  меня  нет.
 (напр.,  требует  IBO40CRT,  TEE45,  RXCTL6,  mwEdit_D6  и  пр.)  
 
 Файл  FRх.dpk  (х  -  версия  Delphi)  содержит  ссылки  на  эти  файлы.  Но  ссылки  закомментированы  директивами  {$IFDEF}.  Файл  используется,  если  в  файле  FR.inc  убран  комментарий  с  соответствующей  строки  (напр.,  если  раскомментирована  строка  {$DEFINE  RX},  то  при  установке  потребуется  пакет  RXCTLх.dpk).  При  установке  пакета  FRх.dpk  Delphi  просит  сохранить  изменения  в  файле  FRх.dpk.
 
 Если  вы  нажали  "Yes",  то  Delphi  уберет  все  директивы  {$IFDEF}  и  файл  будет  испорчен,  и  вы  получите  вышеуказанный  эффект.  Попробуйте  установить  FR  еще  раз,  взяв  оригинальный  файл  .dpk,  и  на  вопрос  сохранить  файл  ответьте  "No".
   

Q-17: Пропал инспектор объектов, не могу его вернуть на место.

 Q:1.7.  Пропал  инспектор  объектов,  не  могу  его  вернуть  на  место.  
 
 FR  хранит  позиции  своих  диалоговых  окон  в  системном  реестре.  Запустите  редактор  реестра  (regedit.exe),  откройте  ветку  HKEY_CURRENT_USERSoftwareFastReportимя_проектаFormTfrInspForm  и  проверьте  и  при  необходимости  откорректируйте  значения  XPosition,  YPosition,  Width,  Height.  Внимание!  Неаккуратные  действия  могут  привести  к  порче  Windows!  

Q-18: Функция SUM работает неправильно.

 Q:1.8.  Функция  SUM  работает  неправильно.
 (в  отчете  с  двумя  masterdata-бэндами  не  могу  вывести  сумму  по  второму  бэнду)  
 
 FR  в  этом  случае  не  может  определить,  по  какому  бэнду  считать  сумму.  Надо  в  вызове  функции  SUM  (это  же  касается  и  функцийй  MIN,  MAX,  AVG)  указывать  явным  образом  бэнд,  по  которому  считается  сумма.  Напр.,  SUM([CustNo],  MasterData2)  

Q-19: Проблемы с делфийским Translation Tool.

 Q:1.9.  Проблемы  с  делфийским  Translation  Tool.
 (при  попытке  запустить  проект,  в  котором  используется  FR,  и  для  которого  сгенерированы  языковые  DLL  с  помощью  Translation  Tool,  выдается  ошибка  типа  "Resource  TfrProgressForm  not  found")  
 
 Включите  в  список  uses  все  файлы  FR,  чтобы  Translation  Tool  сделал  ресурсы  и  для  них.  Или  скомпилируйте  ваш  проект  с  run-time  пакетами  FR.  

Q-20: Не работает обращение к свойствам внутренних DB-компонентов из скрипта.

 Q:1.10.  Не  работает  обращение  к  свойствам  внутренних  DB-компонентов  из  скрипта.
 (пишу  frDialogForm.Query1.Open)    
 
 Надо  писать  без  frDialogForm:
 Query1.Open    

Q-21: Переменная TOTALPAGES всегда возвращает 0.

 Q:1.11.  Переменная  TOTALPAGES  всегда  возвращает  0.    
 
 Отчет  должен  быть  двухпроходным  (диалог  "Свойства  отчета"  в  меню  "Файл"  дизайнера).  
   

Q-22: Ошибка при присвоении переменной FR строкового значения.

 Q:1.12.  Ошибка  при  присвоении  переменной  FR  строкового  значения.
 (код  типа  frReport1.Dictionary.Variables['Отчетный  период']  :=  'Март')    
 
 FR  трактует  строковые  значения,  присвоенные  переменным  из  Dictionary,  как  выражения,  которые  надо  вычислять.  Добавьте  к  строке  кавычки:
 
 frReport1.Dictionary.Variables['Отчетный  период']  :=  ''''  +  'Март'  +  '''';
 
 Либо  передавайте  статичные  данные  через  frVariables.  

Q-23: Дизайнер показывает имя отчета как "Untitled".

 Q:1.13.  Дизайнер  показывает  имя  отчета  как  "Untitled".
 (я  храню  форму  отчета  в  BLOb-поле  таблицы  БД.  Когда  я  загружаю  отчет  и  запускаю  дизайнер,  он  показывает  имя  отчета  как  "Untitled")    
 
 Перед  запуском  дизайнера  сделайте  frReport1.FileName  :=  'MyReport';  

Q-24: FR2.4 не открывает файлы frf, сделанные в предыдущих версиях FR.

 Q:1.14.  FR2.4  не  открывает  файлы  frf,  сделанные  в  предыдущих  версиях  FR.
 (до  приобретения  FastReportа  мы  пользовались  бесплатной  версией  FreeReport,  создали  много  шаблонов  отчетов...  а  теперь  они  не  открываются,  пишет  "Неверный  FRF  формат"  :((  Неужели  все  придется  переделывать?)  
 
 У  файлов  отчета  надо  заменить  первый  байт  (с  17h  на  16h),  сделать  следующие  модификации,  прочитать  все  отчеты  и  сохранить  их,  потом  изменения  в  коде  вернуть  назад.
 
 FR_Class:
 
     function  ReadString(Stream:  TStream):  String;
     begin
         {  if  frVersion  >=  23  then}
           Result  :=  frReadString(Stream)  {else
           Result  :=  frReadString22(Stream);}
       end;
 
     procedure  ReadMemo(Stream:  TStream;  Memo:  TStrings);
     begin
       {  if  frVersion  >=  23  then}
         frReadMemo(Stream,  Memo){  else
         frReadMemo22(Stream,  Memo);}
     end;
 
 FR_Utils:
 
     procedure  frReadMemo(Stream:  TStream;  l:  TStrings);
     var
       s:  String;
       b:  Byte;
       n:  Word;
     begin
       l.Clear;
       l.Text  :=  frReadString(Stream);  exit;
       Stream.Read(n,  2);
       if  n  >  0  then
         repeat
           Stream.Read(n,  2);
           SetLength(s,  n);
           Stream.Read(s[1],  n);
           l.Add(s);
           Stream.Read(b,  1);
         until  b  =  0
       else
         Stream.Read(b,  1);
     end;
 
     function  frReadString(Stream:  TStream):  String;
     var
       s:  String;
       n:  Integer;
       b:  Byte;
     begin
       Stream.Read(n,  4);
       SetLength(s,  n);
       Stream.Read(s[1],  n);
       //  Stream.Read(b,  1);
       Result  :=  s;
     end;    

Q-25: Распечатка немного отличается от того, что видно в превью.

 Q:1.15.  Распечатка  немного  отличается  от  того,  что  видно  в  превью.  
 
 В  FR2.4  обеспечивается  не  совсем  полный  WYSIWYG.  Ждите  версию  3.0.  

Q-26: Как сделать какой-нибудь отчет?

 Q:2.1.  Как  сделать  какой-нибудь  отчет?  
 
 Этот  вопрос  лучше  задать  в  форуме  или  в  списке  рассылки.  Кстати,  в  разделе  "ссылки"  есть  ссылки  на  коллекции  готовых  форм  отчетов.  

Q-27: Умеет ли FR работать с какой-нибудь библиотекой?

 Q:2.2.  Умеет  ли  FR  работать  с  какой-нибудь  библиотекой?  
 
 FR  работает  со  всеми  библиотеками  доступа  к  БД,  которые  используют  механизм  TDataSet.  Кроме  того,  в  виде  исключения  поддерживается  библиотека  IB_Objects,  несовместимая  с  TDataSet.
   

Q-28: Что такое скрипт?

 Q:2.3.  Что  такое  скрипт?  
 
 Это  кусочек  кода  на  языке,  похожем  на  Pascal.  FR  умеет  исполнять  такой  код,  что  дает  возможность  изменять  вид  отчета  в  процессе  его  построения.  См.  подробнее  о  возможностях  языка  в  документации.
 
 (а  есть  ли  скрипт  у  бэнда?)
 Есть,  для  этого  выделите  бэнд  и  нажмите  Ctrl+Enter  либо  выберите  в  инспекторе  объектов  свойство  "OnBeforePrint".
 
 (а  у  страницы  отчета?)
 Есть.  Щелкните  на  пустом  месте  страницы  и  выберите  в  инспекторе  свойство  "OnBeforePrint".  Если  страница  типа  "диалоговая  форма",  то  свойство  называется  OnActivate.
 
 (а  можно  ли  из  скрипта  одного  объекта  обращаться  к  свойствам  другого?)
 Можно,  через  точечную  нотацию.
 
 (а  к  каким  именно  свойствам  объектов  можно  обращаться?)
 К  тем,  которые  отображаются  в  инспекторе.  Кроме  того,  к  некоторым  комплексным  свойствам  типа  Font  возможно  обращение  как  Font.Name,  Font.Size  и  пр.  Свойство  Memo  также  доступно:  
 Memo1.Memo  :=  'some  text'.  Полный  список  свойств  и  методов  объектов  приведен  в  документации.  
 
 (в  каком  порядке  выполняются  скрипты  объектов  -  слева  направо?)
 Нет,  в  порядке,  в  котором  были  созданы  объекты.  Поэтому  во  избежание  путаницы  скрипты  лучше  писать  в  бэнде.

Q-29: Как вывести бэнд Summary внизу страницы?

 Q:2.4.  Как  вывести  бэнд  Summary  внизу  страницы?  
 
 См.  отчет  "Summary  at  the  bottom"  в  демке  FR\DEMOS\REPORTS  

Q-30: Как напечатать сумму по группе в ее заголовке?

   Q:2.5.  Как  напечатать  сумму  по  группе  в  ее  заголовке?  
 
 См.  отчет  "Group  totals  in  header"  в  демке  FR\DEMOS\REPORTS  

Q-31: Как сделать, чтобы группа не переносилась частично на следующую страницу?

 Q:2.6.  Как  сделать,  чтобы  группа  не  переносилась  частично  на  следующую  страницу?  
 
 См.  отчет  "Keep  group  together"  в  демке  FR\DEMOS\REPORTS  

Q-32: Как сделать, чтобы MasterFooter не переносился в одиночку на след.страницу?

 Q:2.7.  Как  сделать,  чтобы  MasterFooter  не  переносился  в  одиночку  на  след.страницу?  
 
 В  скрипте  MasterData  надо  написать:
 
 begin
     if  FreeSpace  <  MasterFooter1.Height  then
         NewPage;
 end
 Правда,  в  результате  появится  избыток  пустого  места  внизу  страницы  (если  бэнд  MasterFooter  имеет  большую  высоту).  

Q-33: Как задать TabOrder для контролов на диалоговой странице?

 Q:2.8.  Как  задать  TabOrder  для  контролов  на  диалоговой  странице?  
 
 a)  с  помощью  кнопок  Bring  to  front/Send  to  back  на  панели  инструментов
 б)  установите  мастер  TabOrder  из  powerpack.  
   

Q-34: Как сменить язык в FR во время выполнения программы?

 Q:2.9.  Как  сменить  язык  в  FR  во  время  выполнения  программы?  
 
 а)  использовать  ресурсы  в  DLL.  
 Скомпилируйте  нужный  ресурс  в  DLL  (для  этого  запустите  файл  mkdll.bat  из  папки  FRRESнужный_язык)  и  в  программе  подключите  его  строкой
 
 frLocale.LoadDll('FR_ENGL.DLL');
 
 Если  нужно  использовать  ресурсы  по  умолчанию,  сделайте
 
 frLocale.UnloadDll;
 
 б)  ресурсы  в  текстовом  файле  или  другом  виде.  Используйте  событие  frLocale.OnLocalize.  Оно  передает  параметр  StringID  (номер  строки)  и  ожидает  возврата  в  параметр  ResultString.  Например:
 
 frLocale.OnLocalize  :=  MyClass.OnLocalize;
 
 procedure  TMyClass.OnLocalize(StringID:  Integer;  var  ResultString:  String);
 begin
     if  StringID  =  53000      then
         ResultString  :=  'Search';
 end;

Q-35: Можно ли сделать дизайнер в стиле MDI Child?

 Q:2.10.  Можно  ли  сделать  дизайнер  в  стиле  MDI  Child?  
 
 Нет  -  придется  переписывать  исходники  FR.  

Q-36: Как работать с TfrUserDataset?

 Q:2.11.  Как  работать  с  TfrUserDataset?  
 (я  хочу  напечатать  данные  не  из  БД)    
 
 См.  примеры  в  FRDEMOSPRNGRID  

Q-37: Можно ли отчет формата А3 вывести на двух листах А4?

 Q:2.12.  Можно  ли  отчет  формата  А3  вывести  на  двух  листах  А4?    
 
 Нет,  FR  не  сможет  переразбить  уже  построенный  отчет.  

Q-38: Как напечатать на матричном принтере?

 Q:2.13.  Как  напечатать  на  матричном  принтере?    
 
 Чтобы  было  быстро  -  экспортируйте  отчет  в  txt  и  выведите  его  на  принтер.
 Например,  так:
 
 frReport1.PrepareReport;
 frReport1.ExportTo(frTextExport1,  'prn');  
   

Q-39: Как запретить печать (но не превью) отдельных элементов отчета?

 Q:2.14.  Как  запретить  печать  (но  не  превью)  отдельных  элементов  отчета?  
 
 Увы,  никак.  Это  будет  в  версии  3.0.  
   

Q-40: FR печатает страницы в порядке 1,1,2,2. Как поменять порядок на 1,2,1,2?

 Q:2.15.  FR  печатает  страницы  в  порядке  1,1,2,2.  Как  поменять  порядок  на  1,2,1,2?  
 
 Если  шаблон  отчета  имеет  несколько  страниц,  то  FR  печатает  сначала  все  записи  первой  страницы,  потом  все  записи  второй,  и  т.д.  Чтобы  поменять  это,  присвойте  свойству  TfrReport.DataSet  источник  данных,  в  котором  столько  записей,  сколько  раз  надо  повторить  печать  страниц,  и  установите  TfrReport.ReportType  =  rtMultiple.  

Q-41: Можно ли первой странице отчета назначить другой лоток принтера?

 Q:2.16.  Можно  ли  первой  странице  отчета  назначить  другой  лоток  принтера?  
 
 Если  шаблон  отчета  имеет  несколько  страниц,  то  каждой  из  них  можно  назначить  свои  установки  принтера.  Если  шаблон  одностраничный,  то  сменить  лоток  принтера  нельзя.  

Q-42: Как послать сформированный отчет по факсу/эл.почте?

 Q:2.17.  Как  послать  сформированный  отчет  по  факсу/эл.почте?  
 
 а)  по  факсу:  установите  программу-факс  (она  добавит  в  список  принтеров  "Fax"),  выберите  этот  принтер  в  FR  и  напечатайте  отчет  на  нем.
 б)  по  эл.почте:  сохраните  готовый  отчет  в  один  из  доступных  форматов  (frp,txt,html,rtf  и  пр.)  и  отправьте  как  вложение.  

Q-43: Как изменить параметр во встроенном запросе из скрипта?

 Q:2.18.  Как  изменить  параметр  во  встроенном  запросе  из  скрипта?
 (можно  ли  написать  что-то  типа  Query1.Params[0].Text  :=  '10'?)  
 
 Нет,  но  вы  можете  сопоставить  параметру  запроса  переменную,  и  менять  ее  значение.  При  этом  надо  закрыть  и  открыть  запрос:
 
 Query1.Close;
 MyParam1  :=  '10';
 Query1.Open;

Q-44: Как "отключить" отдельные страницы отчета?

 Q:2.19.  Как  "отключить"  отдельные  страницы  отчета?  
 
 Добавьте  в  отчет  пустую  диалоговую  форму  и  в  ее  скрипте  (OnActivate)  напишите:
 
 begin
     Page2.Visible  :=  False  //  скрываем  страницу  с  именем  Page2
 end  

Q-45: Как определить, что отчет был построен успешно?

 Q:2.20.  Как  определить,  что  отчет  был  построен  успешно?  
 
 if  frReport1.PrepareReport  then  //  успешно,  показываем  его
     frReport1.ShowPreparedReport

Q-46: Как скрыть некоторые кнопки в окне дизайнера?

 Q:2.21.  Как  скрыть  некоторые  кнопки  в  окне  дизайнера?  
 
 В  FR_Desgn.pas  определены  следующие  вещи:
 
 type
     TfrDesignerRestriction  =  (frdrDontEditObj,  frdrDontModifyObj,  frdrDontSizeObj,  frdrDontMoveObj,
           frdrDontDeleteObj,  frdrDontCreateObj,
           frdrDontDeletePage,  frdrDontCreatePage,  frdrDontEditPage,
           frdrDontCreateReport,  frdrDontLoadReport,  frdrDontSaveReport,
           frdrDontPreviewReport,  frdrDontEditVariables,  frdrDontChangeReportOptions);
     TfrDesignerRestrictions  =  set  of  TfrDesignerRestriction;
 
 var
     DesignerRestrictions:  TfrDesignerRestrictions;
 
 Присвойте  набор  значений  переменной  DesignerRestrictions  и  вызовите  дизайнер.

Q-47: Как подключить свою функцию (например, сумму прописью)?

 Q:2.22.  Как  подключить  свою  функцию  (например,  сумму  прописью)?  
 
 Используйте  обработчик  TfrReport.OnUserFunction.  Вот  простой  пример  такого  обработчика  (определяется  функция  SumPropis):
 
   procedure  TForm1.frReport1UserFunction(const  Name:  String;
           p1,  p2,  p3:  Variant;  var  val:  Variant);
       begin
           if  AnsiCompareText('SUMPROPIS',  Name)  =  0  then
               val  :=  My_Convertion_Routine(frParser.Calc(p1));
       end;
 
       Теперь  функцию  можно  использовать  в  любом  месте  отчета  (текст,  скрипт)  в  форме  SumPropis(Value).  
 
 (но  такой  подход  работает  только  для  одного  компонента  TfrReport.  А  если  я  хочу  сделать  свою  функцию  доступной  везде?)
 
 Самый  простой  вариант  -  сделать  обработчик  события  OnUserFunction  общим  для  всех  компонентов.  Если  этот  вариант  не  подходит,  придется  писать  библиотеку  функций.
 Простой  пример  того,  как  это  сделать:
 
         type
           TMyFunctionLibrary  =  class(TfrFunctionLibrary)
           public
               constructor  Create;  override;
               procedure  DoFunction(FNo:  Integer;  p1,  p2,  p3:  Variant;
                   var  val:  Variant);  override;
           end;
 
       constructor  TMyFunctionLibrary.Create;
       begin
           inherited  Create;
           with  List  do
           begin
               Add('DATEPROPIS');
               Add('SUMPROPIS');
           end;
       end;
 
       procedure  TMyFunctionLibrary.DoFunction(FNo:  Integer;  
           p1,  p2,  p3:  Variant;  var  val:  Variant);
       begin
           val  :=  0;
           case  FNo  of
               0:  val  :=  My_DateConvertion_Routine(frParser.Calc(p1));
               1:  val  :=  My_SumConvertion_Routine(frParser.Calc(p1));
           end;
       end;
 
 Регистрация  библиотеки  осуществляется  процедурой
       frRegisterFunctionLibrary(TMyFunctionLibrary);  
 Удаление  библиотеки  осуществляется  процедурой
       frUnRegisterFunctionLibrary(TMyFunctionLibrary);
 
 (а  как  зарегистрировать  функцию  в  списке  функций  (диалог  "Вставка  функции")?)
 
 Используйте  процедуру  frAddFunctionDesc  (модуль  FR_Class):
 
       frAddFunctionDesc('SUMPROPIS',  'Мои  функции',
         'SUMPROPIS(<Число>)/Возвращает  сумму  прописью.');
 
       Обратите  внимание:  символ  "/"  в  описании  функции  обязателен!  Он  отделяет  описание  синтаксиса  от  описания  самой  функции.
 FuncLib  -  это  ссылка  на  библиотеку  функций  (может  быть  nil,  если  библиотека  не  используется).  Когда  библиотека  удаляется  процедурой  frUnRegisterFunctionLibrary,  все  связанные  с  ней  функции  удаляются  из  списка  функций.

Q-48: Как программно заполнить список переменных в словаре данных?

 Q:2.23.  Как  программно  заполнить  список  переменных  в  словаре  данных?  
 
 Переменные  хранятся  в  TfrReport.Dictionary.Variables.  Там  же  хранятся  и  категории.
 
 with  frReport1.Dictionary  do
 begin
     //  создаем  категорию  (пробел  перед  именем  обязателен)
     Variables['  New  category']  :=  '';
     //  создаем  переменную
     Variables['New  Variable']  :=  'CustomerData.Customers."CustNo"';
     Variables['Another  Variable']  :=  'Page#';
 end;  

Q-49: Я не хочу показывать некоторые датасеты из моего проекта в дизайнере FR.

 Q:2.24.  Я  не  хочу  показывать  некоторые  датасеты  из  моего  проекта  в  дизайнере  FR.  
 
 Используйте  TfrReport.Dictionary.DisabledDatasets:
 
 with  frReport1.Dictionary  do
 begin
     //  отключаем  ненужный  датасет
     DisabledDatasets.Add('CustomerData.Bio');
     //  или  вообще  все  датасеты,  находящиеся  в  форме  или  модуле  данных
     DisabledDatasets.Add('CustomerData*');
 end;  

Q-50: Как передать значение из программы в отчет?

 Q:2.25.  Как  передать  значение  из  программы  в  отчет?  
 
 Есть  несколько  способов.  Первый:  использовать  глобальный  объект  frVariables  (описан  в  FR_Class):
 
 frVariables['My  variable']  :=  10;
 
 создает  переменную  My  variable  со  значением  10.  Это  способ  подходит,  если  в  отчет  нужно  передать  статическую  информацию  (т.е.  не  меняющуюся  в  течение  построения  отчета).
 
 Второй  способ:  использовать  событие  TfrReport.OnGetValue.  Этот  способ  подходит  для  передачи  в  отчет  информации,  которая  может  меняться  от  записи  к  записи:
 
 procedure  TForm1.frReport1GetValue(ParName:  String;  var  ParValue:  Variant);
 begin
     if  ParName  =  'MyField'  then
         ParValue  :=  Table1MyField.Value;
 end;
 
 И,  наконец,  третий  способ:  программно  заполнить  список  переменных.
 
 with  frReport1.Dictionary  do
 begin
     Variables['MyVariable']  :=  'CustomerData.Customers."CustNo"';
     Variables['Another  Variable']  :=  '10';
 end;
 
 (а  можно  ли  передать  значение  из  отчета  обратно  в  программу?)
 
 Можно  -  используйте  объект  frVariables.  Если  в  отчете  написать  в  скрипте  одного  из  объектов:
 
 MyVariable  :=  10
 
 то  в  программе  значение  MyVariable  можно  достать  так:
 v  :=  frVariables['MyVariable'];  

Q-51: Как сделать TChart с несколькими сериями?

 Q:2.26.  Как  сделать  TChart  с  несколькими  сериями?  
 
 Средствами  дизайнера  FR  -  никак.  Но  вы  можете  сформировать  нужную  диаграму  у  себя  в  программе  и  передать  ее  в  готовом  виде  в  FR.  Для  этого  поместите  в  отчет  пустой  компонент  TfrChartView  (с  именем  Chart1,  к  примеру)  и  напишите  следующий  обработчик
 TfrReport.OnBeforePrint:
 
 if  View.Name  =  'Chart1'  then
     TfrChartView(View).AssignChart(your_Delphi_chart)  

Q-52: Как поменять местами страницы отчета в дизайнере?

 Q:2.27.  Как  поменять  местами  страницы  отчета  в  дизайнере?  
 
 Просто  переместите  мышкой  закладку  страницы  на  нужное  место  (drag&drop).  

Q-53: Хотелось бы видеть все, что необходимо вставлять в отчет (поля БД, переменные) в одном списке.

 Q:2.28.  Хотелось  бы  видеть  все,  что  необходимо  вставлять  в  отчет  (поля  БД,  переменные)  в  одном  списке.  
 
 Установите  TfrReport.MixVariablesAndDBFields  :=  True.  Это  заставит  отображаться  переменные  в  списке  полей  БД.  Теперь  вставку  всего  необходимого  можно  делать  из  диалога  "Вставка  поля  БД".

Q-54: Как не показывать окно с параметрами экспорта?

 Q:2.29.  Как  не  показывать  окно  с  параметрами  экспорта?  
 
 Установите  необходимые  параметры  в  компоненте  (например,  для  экспорта  в  текст  -  в  компоненте  TfrTextExport  из  палитры  компонент)  и  отключите  диалог  с  помощью  свойства  ShowDialog.    

Q-55: Я храню отчет в BLOb, и диалоги "Открыть файл"/"Сохранить файл" в дизайнере мне не нужны.

 Q:2.30.  Я  храню  отчет  в  BLOb,  и  диалоги  "Открыть  файл"/"Сохранить  файл"  в  дизайнере  мне  не  нужны.  
 
 У  компонента  TfrDesigner  есть  соответствующие  события:  OnLoadReport  и  OnSaveReport.  Маленький  пример:
 
 procedure  TForm1.frDesigner1LoadReport(Report:  TfrReport;      var  ReportName:  String;  var  Opened:  Boolean);
 begin
     with  MyOpenDialog  do
     begin
         Opened  :=  ShowModal  =  mrOk;
         if  Opened  then
         begin
             Report.LoadFromBlobField(...);
             ReportName  :=  ...;
         end;
     end;
 end;
 
 procedure  TForm1.frDesigner1SaveReport(Report:  TfrReport;      var  ReportName:  String;  SaveAs:  Boolean;  var  Saved:  Boolean);
 begin
     if  SaveAs  then
         with  MySaveDialog  do
         begin
             Saved  :=  ShowModal  =  mrOk;
             if  Saved  then
             begin
                 Report.SaveToBlobField(...);
                 ReportName  :=  ...;
             end;
         end
     else
         Report.SaveToBlobField(...);
 end;

Q-56: Как обратиться к объекту отчета из программы?

 Q:2.31.  Как  обратиться  к  объекту  отчета  из  программы?  
 
 Объекты  FR  не  являются  компонентами  (как  в  QR,  RB)  и  недоступны  в  программе  обычным  способом.  Используйте  следующий  код:
 
 var
     t:  TfrMemoView;
 begin
     t  :=  TfrMemoView(frReport1.FindObject('Memo1'));
 
     if  t  <>  nil  then
         t.Memo.Text  :=  'FastReport';
 //  или  так:
     if  t  <>  nil  then
         t.Prop['Memo']  :=  'FastReport';
 end;

Q-57: Как определить собственные горячие клавиши в компоненте TfrPreview?

 Q:2.32.  Как  определить  собственные  горячие  клавиши  в  компоненте  TfrPreview?  
 
 У  компонента  есть  свойство  Window:  TForm.  На  Window.OnKeyDown  достаточно  подвесить  собственный  обработчик.  

Q-58: Как распечатать отчет сразу, без предварительного просмотра?

 Q:2.33.  Как  распечатать  отчет  сразу,  без  предварительного  просмотра?  
 
 Вот  так:
 
 if  frReport1.PrepareReport  then
     frReport1.PrintPreparedReport('',  1,  True,  frAll);
     //  или
     frReport1.PrintPreparedReportDlg;  
   

Q-59: Как распечатать картинку, находящуюся в файле?

 Q:2.34.  Как  распечатать  картинку,  находящуюся  в  файле?  
 
 а)  используйте  обработчик  события  TfrReport.OnBeforePrint:
 
 if  View.Name  =  'Picture1'  then
     TfrPictureView(View).Picture.LoadFromFile(...)  or
                                                             .Assign  or
                                                             .everything_what_you_want
 
 б)  в  скрипте  (объекта  или  его  бэнда)  напишите:
 
 begin
     Picture1.LoadFromFile(filename)
 end