FAQ по FastReport 2.5

отредактировано March 2005 Раздел: FastReport 2.xx VCL
<span style='font-size:14pt;line-height:100%'>1. Печать отчетов.</span>

1.1. Почему FastReport не печатает на принтере или печатает неправильно?
Возможные проявления:
- при выборе принтера возникает exception;
- некоторые страницы не печатаются;
- часть букв повернута на 90 градусов;
- текст сбился в кучу;
- неправлильная кодировка текста при печати;
- все страницы печатаются на одном листе.

Проблема известна с принтерами от Xerox, Canon и HP.
Попробуйте убрать комментарий со строки {$DEFINE PRN_RESET} в файле FR_Prntr.pas и перекомпилировать пакет FastReport и ваш проект. Как правило, проблема решается. Если это не помогло, попробуйте поставить драйвер от похожей модели принтера.
Также настоятельно рекоменуем скачать самые последние драйвера с сайта производителя принтера.

1.2. Как установить пользовательские размеры бумаги?
Диалог "Параметры страницы" в дизайнере, поля для ввода размеров все время недоступны.

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

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

1.4. FastReport поддерживает печать на матричном принтере?
Да поддерживает. С версии 2.53 FastReport может быть использован для печати на матричных принтерах, а версия 3.0 содержит специальные инструменты для разработки и печати отчетов специально на матричных принтерах.
В версии FastReport 2.53 можно напечатать любой отчет на матричном принтере при помощи фильтра экспорта в текстовый файл TfrTextAdvExport. Перед печатью убедитесь в корретном отображении вашего отчета с помощью предварительного простмотра и если есть необходимость, измените параметры "Lead spaces", "Empty lines", "Borders", "Width", "Height". Если пропадают строки, необходимо увеличить параметр "Height" до 150% и т.д.

Пример кода для печати на матричный принтер напрямую из программы:
...
var
  frTextAdvExport1: TfrTextAdvExport;
...
  frReport1.LoadFromFile('myreport.frf');
  frReport1.PrepareReport;
  frTextAdvExport := TfrTextAdvExport.Create(nil);
  try
    frTextAdvExport.LeadSpaces := False;
    frTextAdvExport.EmptyLines := False;
    frTextAdvExport.Borders := False;
    frTextAdvExport.ScaleWidth := 1.3;
    frTextAdvExport.ScaleHeight := 1.5;
    frTextAdvExport.PrintAfter := True;
// убрать следующую строку, если нужно показывать окно с выбором принтера
    frTextAdvExport.PrinterDialog := False; 
// строка инициализации принтера
    frTextAdvExport.InitString := #27#64;
    frReport1.ExportTo(frTextAdvExport, 'tempfile.prn');
  finally
    frTextAdvExport.Free;
  end;
....

1.5. Распечатка немного отличается от того, что видно в превью.
В FR2.4 обеспечивается не совсем полный WYSIWYG. Используйте версию 3.0.

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

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

Комментарии

  • отредактировано 01:26
    <span style='font-size:14pt;line-height:100%'>2. Экспорт отчетов в другие форматы</span>

    2.1. Какие форматы экспорта поддерживает FastReport?
    С версии FastReport 2.53 поддерживаются форматы RTF, HTML, XLS, XML, TXT, CSV, JPEG, BMP, TIFF

    2.2. Почему TfrOLEExcelExport работает очень медленно?
    TfrOLEExcelExport передает данные в Excel с использованием технологии OLE, которая работает очень медленно. Данный фильтр экспорта можно рекомендовать только для небольших отчетов. Основное время при передаче данных уходит на настройку стиля отображения той или иной ячейки таблицы Excel (цвета, обрамления, шрифта и пр.)
    Ускорить процесс передачи объектов в Excel можно путем упрощения шаблона отчета:
    * использовать однотипные шрифты (вплоть до размера, гарнитуры и цвета);
    * уменьшить количество передаваемых объектов путем оптимизации шаблона отчета (п. 2.3 FAQ).
    Если вышеописанные методы не помогают - рекомендуем воспользоваться фильтром экспорта с применением XML таблиц Excel TfrXMLExcelExport. Недостатки XML экспорта:
    * невозможность сохранения графических изображений,
    * поддержка начиная с Office XP.

    2.3. Как оптимизировать отчет для экспорта в Excel?
    Excel работает с табличным представлением данных. Никаких пересечений или наслоений ячеек сделать в нем невозможно. Фильтр экспорта в Excel (TfrOLEExcelExport, TfrXMLExcelExport) максимально учитывает эти требования при переносе объектов из вашего отчета FastReport в файл Excel. Это реализуется при помощи специальных алгоритмов учета пересечений объектов.
    В местах пересечений объектов возникают новые столбцы и строки в таблице Excel для сохранения точного позиционирования переносимых объектов FastReport. Большое количество пересекающихся объектов в отчете приводит к росту числа столбцов и строк в результирующей таблице, что усложняет ее дальнейшее использование в Excel и замедляет процесс экспорта.
    В процессе разработки шаблона отчета помните об этом, если Вы хотите в последующем экспортировать свои отчеты в Excel.
    Избежать перекрытия ячеек помогут инструменты выравнивания текстовых объектов по сетке.
    Проследите за тем, чтобы было включено выравнивание по сетке
    "Tools->Options->Designer->Grid->Align to grid".
    Для упрощения выравнивания можно увеличить шаг сетки
    "Tools->Options->Designer->Grid size".
    При создании таблиц в отчетах проследите чтобы границы соседних ячеек соприкасались друг с другом. Важно, чтобы ячейки не пересекались!
    Располагайте объекты так, чтобы находились на одной линии, как по вертикали, так и по горизонтали. В этом могут помочь временно создаваемые объекты больших размеров с обрамлением, которые будут играть роль выносных линий (выносные линии поддерживаются в версии FastReport 3.0 и более поздних). После разработки шаблона отчета, вспомогательные объекты можно будет удалить.
    Применение этих простых правил на практике поможет Вам создать отчет, который будет прекрасно выглядеть после экспорта в Excel! Это справедливо и для многих других форматов, которые используют табличную разметку для представления данных.

    2.4. В какие из форматов я могу экспортировать объекты Rich не в виде картинки, а как текст?
    Только в формат RTF (фильтр экспорта TfrRtfAdvExport).

    2.5. Почему при использовании экспорта в текстовый файл пропадают некоторые текстовые поля или строки текста?
    Фильтр экспорта TfrTextAdvExport использует алгоритм табличного выравнивания объектов с учетом обрамления ячеек и усредненного размера шрифта, поэтому возможны такие накладки. Рекомендуем Вам установить следующие значения для свойств фильтра экспорта TfrTextAdvExport:
    LeadSpaces := False;
    EmptyLines := False;
    Borders := False;
    ScaleWidth := 1.3;
    ScaleHeight := 1.5;
    
    Свойства ScaleWidth и ScaleHeight вам будет необходимо подобрать вручную конкретно для Вашего отчета и принтера.

    2.6. Как не показывать окно с параметрами экспорта?
    Установите необходимые параметры в компоненте (например, для экспорта в текст - в компоненте TfrTextExport из палитры компонент) и отключите диалог с помощью свойства ShowDialog.
  • отредактировано 01:26
    <span style='font-size:14pt;line-height:100%'>3. Установка FastReport.</span>

    3.1. При установке пакета 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".

    3.2. Проблемы с делфийским Translation Tool.
    (при попытке запустить проект, в котором используется FR, и для которого сгенерированы языковые DLL с помощью Translation Tool, выдается ошибка типа "Resource TfrProgressForm not found")

    Включите в список uses все файлы FR, чтобы Translation Tool сделал ресурсы и для них. Или скомпилируйте ваш проект с run-time пакетами FR.

    3.3. Почему после приобретения FastReport он все равно печатает FastReport unregistered?
    Во первых: необходимо зайти на закрытую секцию нашего сайта и получить файл fr_class.pas. Логин и пароль для входа будут высланы Вам по электронной почте.
    Затем необходимо положить fr_class.pas в папку FastReport\Source и переустановить пакеты FastReport (*.dpk) следуя инструкции в install.txt.

    Для пользователей C++Builder важное замечание: после удаления старых пакетов из среды, обязательно удалите файлы fr*.lib из папки C++Builder\Projects\Lib, и fr*.bpl из папки C++Builder\Projects\Bpl!
  • отредактировано 01:26
    <span style='font-size:14pt;line-height:100%'>4. Разработка отчетов.</span>

    4.1. Как сделать какой-нибудь отчет?
    Этот вопрос лучше задать в форуме или в списке рассылки.

    4.2. Ф-я SUM работает неправильно.
    (в отчете с двумя masterdata-бэндами не могу вывести сумму по второму бэнду)

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

    4.3. Что такое скрипт?
    Это кусочек кода на языке, похожем на Pascal. FR умеет исполнять такой код, что дает возможность изменять вид отчета в процессе его построения.
    См. подробнее о возможностях языка в документации.

    (а есть ли скрипт у бэнда?)
    Есть, для этого выделите бэнд и нажмите Ctrl+Enter либо выберите в инспекторе объектов свойство "OnBeforePrint".

    (а у страницы отчета?)
    Есть. Щелкните на пустом месте страницы и выберите в инспекторе свойство "OnBeforePrint". Если страница типа "диалоговая форма", то свойство называется OnActivate.

    (а можно ли из скрипта одного объекта обращаться к свойствам другого?)
    Можно, через точечную нотацию.

    (а к каким именно свойствам объектов можно обращаться?)
    К тем, которые отображаются в инспекторе. Кроме того, к некоторым комплексным свойствам типа Font возможно обращение как Font.Name, Font.Size и пр. Свойство Memo также доступно: Memo1.Memo := 'some text'. Полный список свойств и методов объектов приведен в документации.

    (в каком порядке выполняются скрипты объектов - слева направо?)
    Нет, в порядке, в котором были созданы объекты. Поэтому во избежание путаницы скрипты лучше писать в бэнде.

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

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

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

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

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

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


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

    Надо писать без frDialogForm:
    Query1.Open

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

    4.11. Как запретить печать (но не превью) отдельных элементов отчета?
    Увы, никак. Используйте версию 3.0.

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

    4.13. Как изменить параметр во встроенном запросе из скрипта?
    (можно ли написать что-то типа Query1.Params[0].Text := '10'?)

    Нет, но вы можете сопоставить параметру запроса переменную, и менять ее
    значение. При этом надо закрыть и открыть запрос:
    Query1.Close;
    MyParam1 := '10';
    Query1.Open;
    

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

    4.15. Как поменять местами страницы отчета в дизайнере?
    Просто переместите мышкой закладку страницы на нужное место (drag&drop).
  • отредактировано 01:26
    <span style='font-size:14pt;line-height:100%'>5. Вопросы программирования.</span>

    5.1. Как передать значение из программы в отчет?
    Есть несколько способов. Первый: использовать глобальный объект frVariables
    (описан в FR_Class):

    frVariables := 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;

    5.2. Ошибка при присвоении переменной FR строкового значения.
    (код типа frReport1.Dictionary.Variables := 'Март')

    FR трактует строковые значения, присвоенные переменным из Dictionary, как выражения, которые надо вычислять. Добавьте к строке кавычки:

    frReport1.Dictionary.Variables := '''' + 'Март' + '''';

    Либо передавайте статичные данные через frVariables.

    5.3. Дизайнер показывает имя отчета как "Untitled".
    (я храню форму отчета в BLOb-поле таблицы БД. Когда я загружаю отчет и запускаю дизайнер, он показывает имя отчета как "Untitled")

    Перед запуском дизайнера сделайте
    frReport1.FileName := 'MyReport';

    5.4. FR2.5 не открывает файлы frf, сделанные в предыдущих версиях FR.
    (до приобретения FastReportа мы пользовались бесплатной версией FreeReport, создали много шаблонов отчетов... а теперь они не открываются, пишет "Неверный FRF формат" :(( Неужели все придется переделывать?)

    У файлов отчета надо заменить первый байт (с 17h на 16h - легче всего это сделать в DosNavigator), сделать следующие модификации, прочитать все отчеты и сохранить их, потом изменения в коде вернуть назад.

    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);
      if (n > 0) and (s[n] = #$0A) then
        SetLength(s, n - 2);
    //  Stream.Read(b, 1);
      Result := s;
    end;
    

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

    5.6. Как сменить язык в FR во время выполнения программы?
    а) использовать ресурсы в DLL.
    Скомпилируйте нужный ресурс в DLL (для этого запустите файл mkdll.bat из папки FR\RES\нужный_язык) и в программе подключите его строкой

    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;
    

    5.7. Как работать с TfrUserDataset?
    (я хочу напечатать данные не из БД)

    См. примеры в FR\DEMOS\PRNGRID

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

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

    5.10. Как скрыть некоторые кнопки в окне дизайнера?
    В 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 и вызовите дизайнер.

    5.11. Как подключить свою функцию (например, сумму прописью)?
    Используйте обработчик 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(FuncLib, 'SUMPROPIS', 'Мои функции',
      'SUMPROPIS(<Число>)/Возвращает сумму прописью.');
    
    Обратите внимание: символ "/" в описании функции обязателен! Он отделяет описание синтаксиса от описания самой функции.
    FuncLib - это ссылка на библиотеку функций (может быть nil, если библиотека не используется). Когда библиотека удаляется процедурой frUnRegisterFunctionLibrary, все связанные с ней функции удаляются из списка функций.

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

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

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

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

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

    5.16. Как распечатать картинку, находящуюся в файле?
    а) используйте обработчик события TfrReport.OnBeforePrint:
    if View.Name = 'Picture1' then
      TfrPictureView(View).Picture.LoadFromFile(...) or
                                  .Assign or
                                  .everything_what_you_want
    
    б) в скрипте (объекта или его бэнда) напишите:
    begin
      Picture1.LoadFromFile(filename)
    end
    
  • отредактировано 01:26
    <span style='font-size:14pt;line-height:100%'>6. Интерфейс FastReport.</span>

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

    6.2. Пропал инспектор объектов, не могу его вернуть на место.
    FR хранит позиции своих диалоговых окон в системном реестре. Запустите редактор реестра (regedit.exe), откройте ветку HKEY_CURRENT_USER\Software\FastReport\имя_проекта\Form\TfrInspForm и проверьте и при необходимости откорректируйте значения XPosition, YPosition, Width, Height. Внимание! Неаккуратные действия могут привести к порче Windows!


    <span style='font-size:14pt;line-height:100%'>7. Различные вопросы.</span>

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

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