Навигация по отчету

отредактировано 04:48 Раздел: FastReport 4.0
Добрый день!

Необходимо создать динамический отчет, в котором кликнув по строке увидеть детализированные данные по этой строке.
К примеру:

<!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->
Master1
Master2
Master3
Master4
Master5
...
<!--fontc--></span><!--/fontc-->

Кликнув по Master3, должны получить:

<!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->
Master1
Master2
Master3
Detail3
Detail3
Detail3
Master4
Master5
...
<!--fontc--></span><!--/fontc-->

Такой отчет сделать удалось, но только повторно перестраивая его (Report.ShowReport в скрипте);
Есть одна проблемка. Если перестраиваешь отчет, то соответственно после Report.ShowReport мы видем первую страницу
отчета, а не ту, на которой мы кликнули.
Как можно и можно ли вообще после построения отчета перейти на определенный номер страницы ?
Или возможно показать Detail данные как бы в новом отчете ? чтобы когда закрываешь Detail, Master - оставался на прежних данных!

Заранее благодарен за ответы!!!

Комментарии

  • отредактировано October 2008
    var
      Page, nTop: Integer;
    begin
    .....  
      Page := TfrxPreview(frxReport.Preview).PageNo;
      nTop := TfrxPreview(frxReport.Preview).GetTopPosition;
    
    
      ....
      TfrxPreview(frxReport.Preview).SetPosition(Page, nTop);
    

    Функции можно использовать, только если окно предпросмотра уже создано.
  • отредактировано 04:48
    написал: »
    var
      Page, nTop: Integer;
    begin
    .....  
      Page := TfrxPreview(frxReport.Preview).PageNo;
      nTop := TfrxPreview(frxReport.Preview).GetTopPosition;
      ....
      TfrxPreview(frxReport.Preview).SetPosition(Page, nTop);
    

    Функции можно использовать, только если окно предпросмотра уже создано.

    При попытке выполнить отчет пишет:
    "Неопределенный идентификатор: TfrxPreview"

    Смотрю в зарегистрированных классах скрипта, действительно такого нет (есть только TfrxPreviewOption и там только свойства, методов нет).

  • отредактировано 04:48
    В uses вашего приложения добавьте frxPreview.
  • отредактировано 04:48
    написал: »
    В uses вашего приложения добавьте frxPreview.

    Добавил методы следующим образом:
    with AddClass(TfrxPreview, 'TfrxPreview') do
            begin
               AddMethod('function PageNo(): integer', CallMethod);
               AddMethod('function GetTopPosition(): integer', CallMethod);
               AddMethod('procedure SetPosition(Page: integer; nTop: integer)', CallMethod);
               AddMethod('function PageCount(): integer', CallMethod);
            end;
    
    function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; Caller: TfsMethodHelper): Variant;
    begin
      Result := 0;
    
      if ClassType = TfrxPreview then
      begin
        if MethodName = 'PAGENO' then Result:= TfrxPreview(Instance).PageNo
        else if MethodName = 'GETTOPPOSITION' then Result:= TfrxPreview(Instance).GetTopPosition
        else if MethodName = 'SETPOSITION' then TfrxPreview(Instance).SetPosition(Caller.Params[0],Caller.Params[1])
        else if MethodName = 'PAGECOUNT' then Result:= TfrxPreview(Instance).PageCount
        //else if MethodName = 'PAGECOUNT' then Result:= TfrxPreview(Instance).PreviewPages
      end;
    end;
    

    Все, ок, получаю номер страницы, положение по вертикали.
    Теперь проблема в другом :) На какое событие повесить
    TfrxPreview(Report.Preview).SetPosition(StrToInt(<pageusr>), StrToInt(<nTop>));
    
    Если вешаю на OnStopReport, то на последних страницах не отрабатывает SetPosition.
    Делал проверку, вешал ShowMessage на OnStopReport. Получается следующая ситуация, в просмотрщике пишет еще страниц 1/2, а по событию метод PageCount возвращает 5 стр.
    Нажимаем кнопку "ок" (ShowMessage), через доли сек. в Просмотрщике уже стоит 1/5 (одна страница из пяти).
    Вот собственно и вопрос на какое событие можно повесить
    TfrxPreview(Report.Preview).SetPosition(StrToInt(<pageusr>), StrToInt(<nTop>));
    
    Как узнать когда отчет построился на экране пользователя полностью ?
  • отредактировано 04:48
    Если использовать стандартное окно предпросмотра, то для этого подходит событие OnEndDoc.
    Но в скрипте такого события нет, попробуйте добавить вручную.
  • отредактировано 04:48
    написал: »
    Если использовать стандартное окно предпросмотра, то для этого подходит событие OnEndDoc.
    Но в скрипте такого события нет, попробуйте добавить вручную.

    Спасибо, получилось, сделал следующим образом:
    with
          AddClass(TfrxPreview, 'TfrxPreview') do
            begin
               AddMethod('function PageNo(): integer', CallMethod);
               AddMethod('function GetTopPosition(): integer', CallMethod);
               AddMethod('procedure SetPosition(Page: integer; nTop: integer)', CallMethod);
               AddMethod('function PageCount(): integer', CallMethod);
    
            end;
    
    function TFunctions.CallMethod(Instance: TObject; ClassType: TClass; const MethodName: String; Caller: TfsMethodHelper): Variant;
    begin
      Result := 0;
      if ClassType = TfrxPreview then               //OnEndDoc
      begin
        if MethodName = 'PAGENO' then Result:= TfrxPreview(Instance).PageNo
        else if MethodName = 'GETTOPPOSITION' then Result:= TfrxPreview(Instance).GetTopPosition
        else if MethodName = 'SETPOSITION' then
           begin
              dmrep.page:= Caller.Params[0];
              dmrep.ntop:= Caller.Params[1];
           end
        else if MethodName = 'PAGECOUNT' then Result:= TfrxPreview(Instance).PageCount
        //else if MethodName = 'PAGECOUNT' then Result:= TfrxPreview(Instance).PreviewPages
      end;
    end;
    

    Присваиваю переменным dmrep.page и dmrep.ntop значения при событии OnReportStop (в скрипте), а затем уже в делфи вызываю
    TfrxPreview(Report.Preview).SetPosition(page,ntop); на событии OnEndDoc.

    Спасибо за помощь!

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.