Интерактивные отчеты
В интерактивных отчетах можно определить реакцию на щелчок мышью на том или ином объекте отчета в окне предварительного просмотра. Например, пользователь может щелкнуть мышью на строке данных и тем самым сформировать новый отчет с детальными данными по выбранной строке.
Интерактивным можно сделать любой отчет. Для этого надо всего лишь создать обработчик для события TfrxReport.OnClickObject. Ниже приведен пример такого обработчика:
Pascal:
procedure TForm1.frxReport1ClickObject(Page: TfrxPage; View: TfrxView;
Button: TMouseButton; Shift: TShiftState; var Modified: Boolean);
begin
if View.Name = 'Memo1' then
ShowMessage('Memo1 contents:' + #13#10 + TfrxMemoView(View).Text);
if View.Name = 'Memo2' then
begin
TfrxMemoView(View).Text := InputBox('Edit', 'Edit Memo2 text:', TfrxMemoView(View).Text);
Modified := True;
end;
end;
C++:
void __fastcall TForm1::frxReport1ClickObject(TfrxView *Sender,
TMouseButton Button, TShiftState Shift, bool &Modified)
{
TfrxMemoView * Memo;
if(Memo = dynamic_cast <TfrxMemoView *> (Sender))
{
if(Memo->Name == "Memo1")
ShowMessage("Memo1 contents:\n\r" + Memo->Text);
if(Memo->Name == "Memo2")
{
Memo->Text = InputBox("Edit", "Edit Memo2 text:", Memo->Text);
Modified = true;
}
}
}
В обработчике OnClickObject вы можете делать следующее:
менять содержимое переданного в обработчик объекта или страницы (при этом надо выставить флаг Modified, чтобы учесть изменения);
вызывать метод TfrxReport.PrepareReport для построения отчета заново.
В этом примере щелчок на объекте с именем Memo1 выведет сообщение с содержимым этого объекта. При щелчке на Memo2 выведется диалог, в котором можно поменять содержимое объекта. Установка флага Modified в True позволяет зафиксировать изменения и отобразить их на экране.
Таким же образом можно определить другую реакцию на щелчок, например, формирование нового отчета. Здесь необходимо отметить следующее. В версии FastReport 3 один компонент TfrxReport может отображать отчет только в одном окне предварительного просмотра (в отличие от версии 2). Поэтому формировать новый отчет придется либо в отдельном объекте TfrxReport, либо в том же, но с затиранием текущего отчета.
Для подсказки пользователю, на какие объекты можно щелкать мышью, удобно менять форму курсора при прохождении мыши над объектом. Для этого достаточно установить свойству Cursor у нужных объектов значение, отличное от crDefault. Это делается в дизайнере отчета.
Еще один момент касается определения того, на каком объекте пользователь щелкнул мышью. В простых отчетах это можно определить по имени объекта или его содержимому. Однако это не всегда удается сделать в более сложных случаях. Например, необходимо сформировать детальный отчет по выбранной строке данных. Пользователь щелкнул на объекте Memo1 с содержимым '12'. К какой строке данных относится этот объект? Для этого нужно знать первичный ключ, который однозначно идентифицирует эту строку. FastReport позволяет сопоставить каждому объекту отчета строку, содержащую любые данные (в нашем случае - данные первичного ключа). Эта строка хранится в свойстве TagStr.
Рассмотрим это на примере отчета, который входит в демо FRDemo.exe - 'Simple list'. Это список клиентов некоторой фирмы - имя клиента, адрес, контактное лицо и пр. Источник данных - таблица Customer.db из демонстрационной базы DBDEMOS. У этой таблицы есть первичный ключ - поле CustNo, которое в отчете не присутствует. Наша задача - по щелчку на любом объекте из сформированного отчета определить, к какой записи он относится, т.е. узнать значение первичного ключа. Для этого достаточно занести в свойство TagStr всех объектов, которые лежат на бэнде Master Data, следующее значение:
[Customers."CustNo"]
Во время формирования отчета содержимое свойства TagStr вычисляется таким же образом, как и содержимое текстовых объектов, т.е. вместо всех переменных подставляются их значения. Переменная в данном случае - это то, что заключено в квадратные скобки. Поэтому после формирования отчета в свойстве TagStr объектов, лежащих на Master Data, будут содержаться строки типа '1005', '2112' и т.д. Простое преобразование из строки в число даст нам значение первичного ключа, по которому можно найти нужную запись.
Если первичный ключ составной, т.е. содержит несколько полей, то содержимое свойства TagStr может быть следующим:
[Table1."Field1"];[Table1."Field2"]
После построения отчета свойство TagStr будет содержать значения типа '1000;1', из которых также нетрудно извлечь значения ключа.