Что сделать чтобы не показывался диалог?

отредактировано 15:39 Раздел: FastReport 4.0
В отчете есть диалог запроса периода.

У Бэнда(GroupHeader) стоит свойство разворачиваемый(DrillDown).
Отчет стоится все нормально но при каждом клике на группу
выводится диалог
Как сделать чтобы диалог вызывался один раз перед построением отчета

Если в обработчике прописать

procedure DialogPage1OnShow(Sender: TfrxComponent);
begin
if Engine.FinalPass then
DialogPage1.Visible := False;
end;
Все равно диалог вызывается.

Комментарии

  • FokewolfFokewolf Киев
    отредактировано 15:39
    А почему это он у вас показывается каждый раз ? Код в студию.
  • отредактировано 15:39
    Открой демку в дизайнере
    отчет Drill down groups 97.fr3
    Добавь диалог DialogPage1
    туда же кнопку Button1 в свойствах ее ModalResult поставь mrOk
    Запусти превью.
  • отредактировано 15:39
    Вставьте обработчик
    procedure DialogPage1OnShow(Sender: TfrxComponent);
    begin
    if Engine.FinalPass then
    DialogPage1.Visible := False;
    end;
    Работает!!!
    Сохраняем выходим из дизайнера.

    Нажимаем кнопку превью.
    Сколько раз диалог появился?
    Я еще не смотрел дергает ли он запрос Но судя по всему дергает так как медленно группа открывается.
    Версия последняя 4.7.3

  • gpigpi
    отредактировано October 2008
    procedure DialogPage1OnHide(Sender: TfrxComponent);
    begin
         DialogPage1.Visible:=False;                                      
    end;
    
    И не забыть frxReport1.EngineOptions.DestroyForms:=False;
    А запрос будет дёргать, т.к. отчёт перестраивается заново
  • отредактировано 15:39
    Да, такая проблема есть, т.к. отчет перестраивается после разворачивания группы.

    Можно сделать так:
    - добавить в отчет переменную (не в скрипт , а в отчет).
    - установить ее перед вызовом Preparereport (или showreport).
    - установить Report.EngineOptions.DestroyForms := False.
    - в скрипте проверять эту переменную и в зависимости от ее значения устанавливать Visible у диалога.

    Выглядеть это будет приблизительно так:
    В отчете создать переменную bFlag.


    Код программы:
    Report.LoadFromFile(...);
    Report.EngineOptions.DestroyForms := False;
    Report.Variables['bFlag'] := True;
    Report.ShowReport();
    

    Скрипт:
    procedure frxReport1OnStopReport(Sender: TfrxComponent);
    begin
      Set(<bFlag>, False);                                
    end;
    
    begin
     DialogPage1.Visible := <bFlag>;                        
    end.
    
  • отредактировано 15:39
    gpi написал: »
    И не забыть frxReport1.EngineOptions.DestroyForms:=False;
    А запрос будет дёргать, т.к. отчёт перестраивается заново

    Данные же все с сервера отфечены зачем по новой их все тянуть(А если запрос тяжелый)?
    Если только датасет закрывается...

    Отчеты лежат в БД в Блобах
  • отредактировано 15:39
    написал: »
    begin
    DialogPage1.Visible := <bFlag>;
    end.[/code]

    Попробовал сделать так как выше - что-то не работает.
    Может что я не правильно делаю?

    Отчеты лежат в БД. Код который их вытаскивает - менять не могу.

    97.fr3 - из стандартной демки
  • отредактировано 15:39
    Вот этот код :
    Report.EngineOptions.DestroyForms := False;
    Report.Variables := True;
    Report.ShowReport();

    я его показывал не просто так, через скрипт сделать можно как предложил gpi (Report.EngineOptions.DestroyForms нужно устанавливать в False в обоих случаях, в демке это св-во по умолчанию True).
    Но в примере предложенным gpi не учитывается, что отчет может перестраиваться повторно через preparereport.
    Из дизайнера такой вариант будет работать (т.к. он перегружает шаблон), а вот при вызове preparereport нужно либо перезагружать шаблон самостоятельно, либо использовать вариант с переменной, которая устанавливается перед вызовом prepareport/showreport.
  • отредактировано 15:39
    Во что нашел.!!!!
    Если в отчете прописать
    procedure frxReport1OnStopReport(Sender: TfrxComponent);
    begin
       Set(<bFlag>, False);     
    end;
    
    procedure frxReport1OnStartReport(Sender: TfrxComponent);
    begin
        Set(<bFlag>, True);  
    end;
    

    Сохранить его и запустить на просмотр FRDemo.exe - падет ничего не сказав.

    вроде бы добился чтобы диалог показывался один раз. Ничего не меняя в клиенте
  • отредактировано 15:39
    Ваш пример вызывает переполнение стека, получается что, переменные в отчете c именами True и False ссылаются сами на себя.
    При вычислении выражений сначала проверяется список переменных отчета (т.к. он меньше и это в большинстве случаев экономит время), а последним идет список переменных скрипта.
    Не используйте рекурсивных вызовов в переменных.

    Добавил проверку на рекурсивный вызов переменных, теперь будет выдавать ошибку и завершать построение отчета.
  • отредактировано 15:39
    написал: »
    Да, такая проблема есть, т.к. отчет перестраивается после разворачивания группы.

    ...

    Скрипт:
    procedure frxReport1OnStopReport(Sender: TfrxComponent);
    begin
      Set(<bFlag>, False);                                
    end;
    
    begin
     DialogPage1.Visible := <bFlag>;                        
    end.
    
    написал: »
    Set(<bFlag>, False);
    неправильно, должно быть
    Set('bFlag', False)
    
    убил час

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

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