Отловить нажатие сохранения отчета в дизайнере
Добрый день.
Имеется отчет. По нажатию кнопки №1 он должен открываться в режиме дизайна, по нажатию кнопки №2 - в режиме просмотра. Причем по нажатию кнопки сохранения отчета в дизайнере отчета весь отчет должен сохраняться в базе данных. При открытии отчета на редактирование или просмотр необходимо брать данные из БД.
Всё делается достаточно легко, кроме одной проблемы: как отловить нажатие "дискетки" в дизайнере отчета? Я нашел только один подход - это помещать дизайнер отчета на свою форму. И реализовал я это следующим образом:
Есть главная форма, на ней находятся отчет frxReport1 и две кнопки btReportDesign и btReportView. Есть дополнительная форма FmReportDesignPlaceholder - на ней ничего нет, она служит в качестве формы, где отображается дизайнер отчета.
Внимание, вопрос.
Правильно ли сделано, или есть более кошерный путь?
Имеется отчет. По нажатию кнопки №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;
Внимание, вопрос.
Правильно ли сделано, или есть более кошерный путь?
Комментарии
При нажатии кнопки "Дизайн" каждый раз создаю экземпляр формы и показываю отчет на ней же.
Почему изменил решение? Когда экземпляр TfrxReport жил на основной форме, а форма дизайнера создавалась по-требованию (с уничтожением после использования), возникала ошибка в frxClass в методе function TfrxReportPage.GetColor: TColor; (когда необходима была перерисовка).
В процедуре procedure TfrxDesignerForm.DoTopmosts(Enable: Boolean); пришлось добавить строку
begin
//+++
if Report.Owner <> nil then
Exit;
//+++
if Enable then
fStyle := HWND_TOPMOST
...
иначе падало, когда переключал окна (фокус уходил с формы-дизайнера)