Глюки интерактивности

RhinoFCRhinoFC Новосибирск
отредактировано 16:53 Раздел: FastReport 4.0
Захотелось мне привнести в свой отчёт элементы интерактивности. Если быть точнее, то хочется в отчёте иметь элементы настройки самого отчёта, чтобы не пользоваться страницей диалога. Т.е. лежат сверху страницы какие-то чекбоксы, например, которые в превью видны, но на принтер не выводятся, пользователь кликает на них и отчёт перерисовывается, например, изменяя группировку или ещё чего-нибудь. Вроде как все возможности для этого присутствуют. Но не тут то было! :)
Итак, мастрячим тестовый пример:
Создаём пустой отчёт, на который бросаем два Мемо и один CheckBox. Прописываем обработчики событий OnPreviewClick каждому из них таким вот образом:
procedure Memo1OnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
begin
  ShowMessage(Memo2.Name);
end;

procedure Memo2OnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
begin
  ShowMessage(Memo1.Name);                                                
end;

procedure CheckBox1OnPreviewClick(Sender: TfrxView; Button: TMouseButton; Shift: Integer; var Modified: Boolean);
begin
  Report.OldStyleProgress := False;  // <- !!!
  CheckBox1.Checked := not CheckBox1.Checked;
  Report.ShowReport;
end;

Запускаем превью прямо из дизайнера отчёта и начинаем кликать на всех элементах по очереди.
Memo1: Выдаёт сообщение "Мемо2"
Memo2: Выдаёт сообщение "Memo1"
CheckBox1: Перерисовывает отчёт и состояние его меняется, как и хотелось. Здесь следует отметить, что при OldStyleProgress = True, всё отрабатывает, но приложение выдаёт ошибку "List index out of bounds (0)", поэтому в данном примере я воткнул строчку, помеченную "!!!", хотя это само по себе совсем не есть гуд.

Итак, всё путём! Я радуюсь, но далее... Закрываем дизайнер отчётов и пытаемся выполнить этот отчёт напрямую из приложения. Получаем такие результаты:
Memo1: Выдаёт сообщение "Мемо1" :)
Memo2: Выдаёт сообщение "Мемо2" :)
CheckBox1: Отчёт перерисовывается, но состояние чекбокса не меняется. :)

Здесь следует отметить, что если на отчёте будет больше элементов, то Мемо1/2 будут выдавать вообще что угодно, либо вываливаться с ошибкой (AccessViolation). Клики по CheckBox1 тоже могут вызывать исключения. Т.е. это дело вообще непрогнозируемо.

Напрашивается вывод: когда не работает дизайнер отчётов, слетают ссылки на все объекты, расположенные в отчёте. Вопрос - почему? Это баг или так и задумано? Или я в чём-то очень сильно заблуждаюсь? Лучше бы это был баг, тогда есть надежда, что разработчики FR его пофиксят, и будет счастье. А пока вопрос об интерактивности отчёта остаётся открытым :) .

PS: Вообще, доступ к элементам отчёта по их именам работает только в период формирования отчёта (например, из событий OnBeforePrint), но как только отчёт сформирован, все ссылки слетают. Неправильно это, я считаю. Мало-ли чего может потребоваться сделать с отчётом из его превью. В событии "OnPreviewClick" можно корректно работать только с тем объектом, на котором произведён клик. И только через параметр "Sender". Но этого совсем недостаточно.

PPS: Данный пример можно легко повторить, воспользовавшись приложением "Main (FastReport 4.0 Demo)" из демосов, входящих в комплект поставки FR.

PPPS: А может это только у меня так? :)

Комментарии

  • отредактировано 16:53
    Уважаемые разработчики!
    Присоединяюсь к вопросу - ответьте пожалуйста!
  • gpigpi
    отредактировано July 2010
    Попробуйте установить TfrxReport.EngineOptions.DestroyForms в False
    написал:
    Вообще, доступ к элементам отчёта по их именам работает только в период формирования отчёта (например, из событий OnBeforePrint), но как только отчёт сформирован, все ссылки слетают. Неправильно это, я считаю. Мало-ли чего может потребоваться сделать с отчётом из его превью. В событии "OnPreviewClick" можно корректно работать только с тем объектом, на котором произведён клик. И только через параметр "Sender". Но этого совсем недостаточно.
    В превью может потребоваться только перестроить отчёт. По поводу обработки OnPreviewClick - можете предложить другой механизм обработки клика на одном из сотен(тысяч) повторяющихся TfrxMemoView, расположенном на Masterdata?

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

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