Прерывание экспорта отчёта

отредактировано 10:34 Раздел: FastReport 4.0
Так же как и в Прерывания события печати отчёта требуется прервать экспорт отчёта, если пользователь выбрал не разрешённый носитель информации.

Сейчас сделано у меня так (урезанный пример):
1. Есть форма с отчётом и классом экспорта. Для класса экспорта есть подписка на событие:
  TdmReport = class(TDataModule)
    frxXMLExport: TfrxXMLExport;
    frxReport: TfrxReport;
    procedure frxXMLExportBeginExport(Sender: TObject);
    ...
  end;
В обработчике события происходит проверка выбранного пользователем пути и прерывание (при необходимости):
procedure TdmReport.frxXMLExportBeginExport(Sender: TObject);
var
  ExportFilter: TfrxCustomExportFilter;
begin
  ExportFilter := TfrxCustomExportFilter(Sender);
  if not TAccessChecks.AccessSave(ExportFilter.FileName) then
  begin
    ... { Говорим пользователю, что сюда сохранять нельзя }
    {$REGION 'временное решение проблемы'}
    ExportFilter.FileName := '';
    ExportFilter.Stream := nil;
    {$ENDREGION}
    Exit;
  end;
  { Если всё хорошо, то делаем что-то другое }
  ...
end;

Код работает, но работает он "не по правилам". А как будет правильно прерывать экспорт, при этом с возможностью проверить путь сохранения?

P.S. Попытка использовать тоже самое, что было указано в теме "Прерывания события печати отчёта" не была удачной...

Комментарии

  • gpigpi
    отредактировано 10:34
    Попробуйте переопределить обработчик кнопки в превью:
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxClass, frxExportPDF, frxPreview, frxDsgnIntf, Menus;
    
    type
      TForm1 = class(TForm)
        frxReport1: TfrxReport;
        frxPDFExport1: TfrxPDFExport;
        SaveDialog1: TSaveDialog;
        procedure FormCreate(Sender: TObject);
        procedure frxReport1Preview(Sender: TObject);
        procedure PDFExport(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    
    {$R *.dfm}
    
    procedure TForm1.PDFExport(Sender: TObject);
    begin
         if SaveDialog1.Execute then
           begin
             frxPDFExport1.FileName:=SaveDialog1.FileName;
             TfrxPreview(frxReport1.Preview).Export(frxPDFExport1);
           end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
         frxReport1.ShowReport;
    end;
    
    procedure TForm1.frxReport1Preview(Sender: TObject);
    var i, j, mi: integer;
    begin
           TfrxPreviewForm(frxReport1.PreviewForm).PdfB.OnClick:=PDFExport;
           for i := 0 to frxExportFilters.Count - 1 do
             begin
               if TfrxCustomExportFilter(frxExportFilters[i].Filter).ClassName = 'TfrxPDFExport' then
                 mi:=i;
             end;
           TfrxPreviewForm(frxReport1.PreviewForm).ExportPopup.Items[mi].OnClick:=PDFExport;
           for i:=0 to TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items.Count-1 do
             begin
               if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Caption=TfrxPreviewForm(frxReport1.PreviewForm).ExportB.Hint then
                 begin
                   for j:=0 to TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Count-1 do
                     if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i][j].Caption=TfrxPreviewForm(frxReport1.PreviewForm).ExportPopup.Items[mi].Caption then
                        TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i][j].OnClick:=PDFExport;
                 end;
               if TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].Caption=TfrxPreviewForm(frxReport1.PreviewForm).PdfB.Hint then
                 TfrxPreviewForm(frxReport1.PreviewForm).RightMenu.Items[i].OnClick:=PDFExport;
             end;
    end;
    
    end.
    
  • отредактировано April 2011
    Да... немного грамозко получается.

    Может быть Вы в следующих версиях сделаете, как при печати, проверку "frxReport.Terminated" или что-то подобное реализуете в TfrxCustomExportFilter? :)
    А то это это становится похоже на то, как я извращался с Preview в DevExpress-е, что бы там контролировать печать, печать в файл, экспорт...
    Да и такой подход потом может выйти боком, если Вы измените формы и добавится ещё в какие нибудь меню возможности экспорта... Особенно, если такие действия мне нужно совершать со всеми видами экспорта (которые могут сохраняться в файл).

    P.S. С наилучшими пожеланиями реализовать всё так, что при наличии "прямых рук" у программиста, он мог управлять практически всеми процессами :)
  • отредактировано 10:34
    Ок, будет сделано :)

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

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