Конференция: fido7.ru.delphi.reports
FAQ создан с помощью программы FAQ Maker ver. 1.1
от Анатолия Подгорецкого
Доступен на http:/www.podgoretsky.com или http://podgoretsky.pri.ee
Альтернативный источник FAQ центр
Первичный источник http://www.fastreport.ru/ru/faq.php
Copyright © 1998-2003 by Fast Reports, Inc.
Публикуется с разрешения Fast Reports, Inc.
Данный FAQ стал возможным благодаря любезному разрешению корпорации Fast Report
Ни какие изменения в текст FAQ не вносятся, за исключением нумерации вопросов. По технологическим причинам и с целью преемственности с другими FAQ этой серии.
Любые предложения по внесению изменений должны посылаться на адрес michael@fast-report.com
NB! темы 7-10 имеют статус неофициальных, пока не включены в официальный FAQ (7.11.2003)
Этот документ регулярно изменяется в результате отслеживания содержимого базового FAQ на сайте производителя продукта http://www.fastreport.ru/ru/faq.php
Распространение и использование этого документа возможно только с разрешения Fast Reports, Inc, в случае получения такого разрешения, дополнительное разрешение не требуется.
Остерегайтесь подделок.
Основыным источником инфорамации по Fast Report является сайт корпорации, насположеный по следующему адресу: http://www.fastreport.ru
На сайте есть FAQ, форум, документация и другая связанная с продуктом информации
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
2. Q: А настоящий URL - ссылки на страницы - можно?
A: Ссылки на любой URL создаются аналогично ссылкам на страницы (п.1) за исключением того, что в свойстве тег непосредственно прописывается URL (к примеру, http://www.fastreport.ru )
Объект указанный в URL будет открыт браузером по умолчанию во время клика на объект со ссылкой.
Более детальный пример можно посмотреть, скачав и установив файл
http://www.fastreport.ru/files/fr251demo.exe
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].
4. Q: Хочу в триальной версии своей программы выводить "Nag Label" в отчёт, который был бы недоступен для удаления пользователю.
A: Пример использования возможности модификации нужных страниц после операции PrepareReport (непосредственно перед печатью).
var
m : TfrMemoView;
Q:1.1. FR не печатает на каком-то принтере.
(варианты: при выборе принтера возникает exception; некоторые страницы не печатаются; часть букв повернута на 90 градусов; текст сбился в кучу и т.д.)
(проблема известна с принтерами от Xerox, Canon и HP).
Попробуйте убрать комментарий со строки {$DEFINE PRN_RESET} в файле FR_Prntr.pas и перекомпилировать пакет FR и ваш проект. Как правило, проблема решается. Если это не помогло, попробуйте поставить драйвер от похожей модели принтера.
(HP LJ 1000w - многостраничные отчеты не печатаются - все страницы печатаются на одном листе - нашел новый драйвер, все заработало)
Q:1.2. Не могу установить пользовательские размеры бумаги.
(Диалог "Параметры страницы" в дизайнере, поля для ввода размеров все время недоступны).
FR использует только размеры бумаги, поддерживаемые драйвером принтера. Если в списке типов, возвращаемых драйвером, присутствует пользовательский размер (номер бумаги в Windows - 0100h), то поле для ввода размеров станет доступным при выборе этого типа бумаги. (Некоторые драйверы используют другой номер для пользовательского размера, отличный от 100h - с ними FR также не будет разрешать ввод размеров).
Q:1.3. Объекты не смещаются при изменении левой или правой границы печати.
Левая и правая границы влияют только на отчеты типа Cross-tab. В обычных отчетах можно задать св-во объектов BandAlign = baLeft (к примеру), и объект будет прижат к левой границе автоматически. Если у бэнда несколько объектов с BandAlign = baLeft, то они будут прижаты друг к другу. Самому крайнему справа объекту при этом можно установить BandAlign = baRest, тогда он займет все оставшееся до правой границы пространство.
Q:1.4. Экспорт в другие форматы (word, html, text) работает криво.
(смещение текста, пустые строки и пр.)
А что вы хотели? ;) В FR координаты объектов в пикселях, в MSWord, html, txt - построчное представление информации. При экспорте из-за этого неизбежны искажения. Попробуйте поиграть настройками фильтра экспорта (коэффициенты преобразования по X и Y, опция удаления пустых строк).
(не экспортируются некоторые объекты, напр. объект Rich)
Попробуйте взять другой фильтр экспорта - в powerpack их много. Кроме того, есть замечательные (небесплатные, правда) фильтры от Pragnaan Software - ссылка на них есть на домашней странице FR.
Q:1.5. Во всех диалогах FR написана какая-то фигня.
а) установлены неверные языковые ресурсы. Скомпилируйте FR с русскими ресурсами (для этого запустите FRRESRUSSIANmk.bat).
б) конфликт ресурсов FR с ресурсами одного из установленных компонентов. Ресурсы FR занимают диапазон 53000..59000. Исправьте константу frRes в файле FR_Const.pas для смещения нижней границы диапазона и перекомпилируйте пакет FR.
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:1.7. Пропал инспектор объектов, не могу его вернуть на место.
FR хранит позиции своих диалоговых окон в системном реестре. Запустите редактор реестра (regedit.exe), откройте ветку HKEY_CURRENT_USERSoftwareFastReportимя_проектаFormTfrInspForm и проверьте и при необходимости откорректируйте значения XPosition, YPosition, Width, Height. Внимание! Неаккуратные действия могут привести к порче Windows!
Q:1.8. Функция SUM работает неправильно.
(в отчете с двумя masterdata-бэндами не могу вывести сумму по второму бэнду)
FR в этом случае не может определить, по какому бэнду считать сумму. Надо в вызове функции SUM (это же касается и функцийй MIN, MAX, AVG) указывать явным образом бэнд, по которому считается сумма. Напр., SUM([CustNo], MasterData2)
Q:1.9. Проблемы с делфийским Translation Tool.
(при попытке запустить проект, в котором используется FR, и для которого сгенерированы языковые DLL с помощью Translation Tool, выдается ошибка типа "Resource TfrProgressForm not found")
Включите в список uses все файлы FR, чтобы Translation Tool сделал ресурсы и для них. Или скомпилируйте ваш проект с run-time пакетами FR.
Q:1.10. Не работает обращение к свойствам внутренних DB-компонентов из скрипта.
(пишу frDialogForm.Query1.Open)
Надо писать без frDialogForm:
Query1.Open
Q:1.11. Переменная TOTALPAGES всегда возвращает 0.
Отчет должен быть двухпроходным (диалог "Свойства отчета" в меню "Файл" дизайнера).
Q:1.12. Ошибка при присвоении переменной FR строкового значения.
(код типа frReport1.Dictionary.Variables['Отчетный период'] := 'Март')
FR трактует строковые значения, присвоенные переменным из Dictionary, как выражения, которые надо вычислять. Добавьте к строке кавычки:
frReport1.Dictionary.Variables['Отчетный период'] := '''' + 'Март' + '''';
Либо передавайте статичные данные через frVariables.
Q:1.13. Дизайнер показывает имя отчета как "Untitled".
(я храню форму отчета в BLOb-поле таблицы БД. Когда я загружаю отчет и запускаю дизайнер, он показывает имя отчета как "Untitled")
Перед запуском дизайнера сделайте frReport1.FileName := 'MyReport';
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:1.15. Распечатка немного отличается от того, что видно в превью.
В FR2.4 обеспечивается не совсем полный WYSIWYG. Ждите версию 3.0.
Q:2.1. Как сделать какой-нибудь отчет?
Этот вопрос лучше задать в форуме или в списке рассылки. Кстати, в разделе "ссылки" есть ссылки на коллекции готовых форм отчетов.
Q:2.2. Умеет ли FR работать с какой-нибудь библиотекой?
FR работает со всеми библиотеками доступа к БД, которые используют механизм TDataSet. Кроме того, в виде исключения поддерживается библиотека IB_Objects, несовместимая с TDataSet.
Q:2.3. Что такое скрипт?
Это кусочек кода на языке, похожем на Pascal. FR умеет исполнять такой код, что дает возможность изменять вид отчета в процессе его построения. См. подробнее о возможностях языка в документации.
(а есть ли скрипт у бэнда?)
Есть, для этого выделите бэнд и нажмите Ctrl+Enter либо выберите в инспекторе объектов свойство "OnBeforePrint".
(а у страницы отчета?)
Есть. Щелкните на пустом месте страницы и выберите в инспекторе свойство "OnBeforePrint". Если страница типа "диалоговая форма", то свойство называется OnActivate.
(а можно ли из скрипта одного объекта обращаться к свойствам другого?)
Можно, через точечную нотацию.
(а к каким именно свойствам объектов можно обращаться?)
К тем, которые отображаются в инспекторе. Кроме того, к некоторым комплексным свойствам типа Font возможно обращение как Font.Name, Font.Size и пр. Свойство Memo также доступно:
Memo1.Memo := 'some text'. Полный список свойств и методов объектов приведен в документации.
(в каком порядке выполняются скрипты объектов - слева направо?)
Нет, в порядке, в котором были созданы объекты. Поэтому во избежание путаницы скрипты лучше писать в бэнде.
Q:2.4. Как вывести бэнд Summary внизу страницы?
См. отчет "Summary at the bottom" в демке FR\DEMOS\REPORTS
Q:2.5. Как напечатать сумму по группе в ее заголовке?
См. отчет "Group totals in header" в демке FR\DEMOS\REPORTS
Q:2.6. Как сделать, чтобы группа не переносилась частично на следующую страницу?
См. отчет "Keep group together" в демке FR\DEMOS\REPORTS
Q:2.7. Как сделать, чтобы MasterFooter не переносился в одиночку на след.страницу?
В скрипте MasterData надо написать:
begin
if FreeSpace < MasterFooter1.Height then
NewPage;
end
Правда, в результате появится избыток пустого места внизу страницы (если бэнд MasterFooter имеет большую высоту).
Q:2.8. Как задать TabOrder для контролов на диалоговой странице?
a) с помощью кнопок Bring to front/Send to back на панели инструментов
б) установите мастер TabOrder из powerpack.
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:2.10. Можно ли сделать дизайнер в стиле MDI Child?
Нет - придется переписывать исходники FR.
Q:2.11. Как работать с TfrUserDataset?
(я хочу напечатать данные не из БД)
См. примеры в FRDEMOSPRNGRID
Q:2.12. Можно ли отчет формата А3 вывести на двух листах А4?
Нет, FR не сможет переразбить уже построенный отчет.
Q:2.13. Как напечатать на матричном принтере?
Чтобы было быстро - экспортируйте отчет в txt и выведите его на принтер.
Например, так:
frReport1.PrepareReport;
frReport1.ExportTo(frTextExport1, 'prn');
Q:2.14. Как запретить печать (но не превью) отдельных элементов отчета?
Увы, никак. Это будет в версии 3.0.
Q:2.15. FR печатает страницы в порядке 1,1,2,2. Как поменять порядок на 1,2,1,2?
Если шаблон отчета имеет несколько страниц, то FR печатает сначала все записи первой страницы, потом все записи второй, и т.д. Чтобы поменять это, присвойте свойству TfrReport.DataSet источник данных, в котором столько записей, сколько раз надо повторить печать страниц, и установите TfrReport.ReportType = rtMultiple.
Q:2.16. Можно ли первой странице отчета назначить другой лоток принтера?
Если шаблон отчета имеет несколько страниц, то каждой из них можно назначить свои установки принтера. Если шаблон одностраничный, то сменить лоток принтера нельзя.
Q:2.17. Как послать сформированный отчет по факсу/эл.почте?
а) по факсу: установите программу-факс (она добавит в список принтеров "Fax"), выберите этот принтер в FR и напечатайте отчет на нем.
б) по эл.почте: сохраните готовый отчет в один из доступных форматов (frp,txt,html,rtf и пр.) и отправьте как вложение.
Q:2.18. Как изменить параметр во встроенном запросе из скрипта?
(можно ли написать что-то типа Query1.Params[0].Text := '10'?)
Нет, но вы можете сопоставить параметру запроса переменную, и менять ее значение. При этом надо закрыть и открыть запрос:
Query1.Close;
MyParam1 := '10';
Query1.Open;
Q:2.19. Как "отключить" отдельные страницы отчета?
Добавьте в отчет пустую диалоговую форму и в ее скрипте (OnActivate) напишите:
begin
Page2.Visible := False // скрываем страницу с именем Page2
end
Q:2.20. Как определить, что отчет был построен успешно?
if frReport1.PrepareReport then // успешно, показываем его
frReport1.ShowPreparedReport
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: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: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:2.24. Я не хочу показывать некоторые датасеты из моего проекта в дизайнере FR.
Используйте TfrReport.Dictionary.DisabledDatasets:
with frReport1.Dictionary do
begin
// отключаем ненужный датасет
DisabledDatasets.Add('CustomerData.Bio');
// или вообще все датасеты, находящиеся в форме или модуле данных
DisabledDatasets.Add('CustomerData*');
end;
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:2.26. Как сделать TChart с несколькими сериями?
Средствами дизайнера FR - никак. Но вы можете сформировать нужную диаграму у себя в программе и передать ее в готовом виде в FR. Для этого поместите в отчет пустой компонент TfrChartView (с именем Chart1, к примеру) и напишите следующий обработчик
TfrReport.OnBeforePrint:
if View.Name = 'Chart1' then
TfrChartView(View).AssignChart(your_Delphi_chart)
Q:2.27. Как поменять местами страницы отчета в дизайнере?
Просто переместите мышкой закладку страницы на нужное место (drag&drop).
Q:2.28. Хотелось бы видеть все, что необходимо вставлять в отчет (поля БД, переменные) в одном списке.
Установите TfrReport.MixVariablesAndDBFields := True. Это заставит отображаться переменные в списке полей БД. Теперь вставку всего необходимого можно делать из диалога "Вставка поля БД".
Q:2.29. Как не показывать окно с параметрами экспорта?
Установите необходимые параметры в компоненте (например, для экспорта в текст - в компоненте TfrTextExport из палитры компонент) и отключите диалог с помощью свойства ShowDialog.
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: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:2.32. Как определить собственные горячие клавиши в компоненте TfrPreview?
У компонента есть свойство Window: TForm. На Window.OnKeyDown достаточно подвесить собственный обработчик.
Q:2.33. Как распечатать отчет сразу, без предварительного просмотра?
Вот так:
if frReport1.PrepareReport then
frReport1.PrintPreparedReport('', 1, True, frAll);
// или
frReport1.PrintPreparedReportDlg;
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