Отловить нажатие сохранения отчета в дизайнере

отредактировано 06:34 Раздел: FastReport 4.0
Добрый день.

Имеется отчет. По нажатию кнопки №1 он должен открываться в режиме дизайна, по нажатию кнопки №2 - в режиме просмотра. Причем по нажатию кнопки сохранения отчета в дизайнере отчета весь отчет должен сохраняться в базе данных. При открытии отчета на редактирование или просмотр необходимо брать данные из БД.
Всё делается достаточно легко, кроме одной проблемы: как отловить нажатие "дискетки" в дизайнере отчета? Я нашел только один подход - это помещать дизайнер отчета на свою форму. И реализовал я это следующим образом:

Есть главная форма, на ней находятся отчет frxReport1 и две кнопки btReportDesign и btReportView. Есть дополнительная форма FmReportDesignPlaceholder - на ней ничего нет, она служит в качестве формы, где отображается дизайнер отчета.
procedure TFmReportTest.btReportDesignClick(Sender: TObject);
// Кнопка дизайна отчета
begin
  frxReport.DesignReportInPanel(FmReportDesignPlaceholder);

  with TfrxDesignerForm(frxReport.Designer) do
  begin
    frxReport.EngineOptions.DestroyForms := False;
    SaveCmd.OnExecute := SaveReport;
  end;

  FmReportDesignPlaceholder.ShowModal;
end;

procedure TFmReportTest.btReportViewClick(Sender: TObject);
// Кнопка просмотра отчета
begin
  LoadReport;
  frxReport.ShowReport();
end;

procedure TFmReportTest.LoadReport;
// Процедура загружает отчет из базы данных
begin
// код загрузки данных из БД есть тут, на форуме
end;

procedure TFmReportTest.SaveReport(Sender: TObject);
// Процедура сохраняет отчет в базе данных
begin
// код сохранения данных в БД есть тут, на форуме
end;

Внимание, вопрос.
Правильно ли сделано, или есть более кошерный путь?

Комментарии

  • отредактировано 06:34
    В данном подходе есть минус: некий AV при повторном открытии формы дизайнера, т.е. открыли дизайнер, закрыли форму, открыавем заново, получаем эксепшн. Что я делаю не так?
  • отредактировано 06:34
    Сделал по-другому. Определил форму, на которой показываю дизайнер отчета. На данной форме разместил экземпляр TfrxReport.
    При нажатии кнопки "Дизайн" каждый раз создаю экземпляр формы и показываю отчет на ней же.

    Почему изменил решение? Когда экземпляр TfrxReport жил на основной форме, а форма дизайнера создавалась по-требованию (с уничтожением после использования), возникала ошибка в frxClass в методе function TfrxReportPage.GetColor: TColor; (когда необходима была перерисовка).

    В процедуре procedure TfrxDesignerForm.DoTopmosts(Enable: Boolean); пришлось добавить строку
    begin
    //+++
    if Report.Owner <> nil then
    Exit;
    //+++

    if Enable then
    fStyle := HWND_TOPMOST
    ...
    иначе падало, когда переключал окна (фокус уходил с формы-дизайнера)
  • отредактировано 06:34
    Удивляюсь сам себе. Повторить свою же ошибку не могу...

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

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