Глюки интерактивности
RhinoFC
Новосибирск
Захотелось мне привнести в свой отчёт элементы интерактивности. Если быть точнее, то хочется в отчёте иметь элементы настройки самого отчёта, чтобы не пользоваться страницей диалога. Т.е. лежат сверху страницы какие-то чекбоксы, например, которые в превью видны, но на принтер не выводятся, пользователь кликает на них и отчёт перерисовывается, например, изменяя группировку или ещё чего-нибудь. Вроде как все возможности для этого присутствуют. Но не тут то было!
Итак, мастрячим тестовый пример:
Создаём пустой отчёт, на который бросаем два Мемо и один CheckBox. Прописываем обработчики событий OnPreviewClick каждому из них таким вот образом:
Запускаем превью прямо из дизайнера отчёта и начинаем кликать на всех элементах по очереди.
Итак, всё путём! Я радуюсь, но далее... Закрываем дизайнер отчётов и пытаемся выполнить этот отчёт напрямую из приложения. Получаем такие результаты:
Здесь следует отметить, что если на отчёте будет больше элементов, то Мемо1/2 будут выдавать вообще что угодно, либо вываливаться с ошибкой (AccessViolation). Клики по CheckBox1 тоже могут вызывать исключения. Т.е. это дело вообще непрогнозируемо.
Напрашивается вывод: когда не работает дизайнер отчётов, слетают ссылки на все объекты, расположенные в отчёте. Вопрос - почему? Это баг или так и задумано? Или я в чём-то очень сильно заблуждаюсь? Лучше бы это был баг, тогда есть надежда, что разработчики FR его пофиксят, и будет счастье. А пока вопрос об интерактивности отчёта остаётся открытым .
PS: Вообще, доступ к элементам отчёта по их именам работает только в период формирования отчёта (например, из событий OnBeforePrint), но как только отчёт сформирован, все ссылки слетают. Неправильно это, я считаю. Мало-ли чего может потребоваться сделать с отчётом из его превью. В событии "OnPreviewClick" можно корректно работать только с тем объектом, на котором произведён клик. И только через параметр "Sender". Но этого совсем недостаточно.
PPS: Данный пример можно легко повторить, воспользовавшись приложением "Main (FastReport 4.0 Demo)" из демосов, входящих в комплект поставки FR.
PPPS: А может это только у меня так?
Итак, мастрячим тестовый пример:
Создаём пустой отчёт, на который бросаем два Мемо и один 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: А может это только у меня так?
Комментарии
Присоединяюсь к вопросу - ответьте пожалуйста!