Узнать изменен ли был отчет?

отредактировано 16:44 Раздел: FastReport 4.0
В базе имеется таблица "архив сост. отчетов" в которую сохраняются все отчеты составленные в программе. При наличие на форме TfrxDesigner составленный отчет можно редактировать в режиме просмотра спец. кнопкой.
Можно ли запретить редактирование в рантайм?
Можно ли узнать после ShowReport() был ли отредактирован отчет?

var 
  FReport: TMemoryStream;
begin
...
  with frxReport do
  begin
...
    ShowReport();   
    PreviewPages.SaveToStream(FReport);
...
  end;

Комментарии

  • xlaalaaxlaalaa Минск
    отредактировано 16:44
    hexing написал: »
    Можно ли запретить редактирование в рантайм?

    да, с помощью свойств
    Report1.PreviewOptions.AllowEdit := false;
    Report1.PreviewOptions.Buttons := [нужные кнопки];

  • отредактировано 16:44
    xlaalaa написал: »
    да, с помощью свойств
    Report1.PreviewOptions.AllowEdit := false;
    Report1.PreviewOptions.Buttons := [нужные кнопки];

    Спасибо! А как с вторым вопросом?
  • gpigpi
    отредактировано 16:44
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxDesgn, frxClass, frxPreview, frxDMPClass;
    
    type
      TForm1 = class(TForm)
        frxReport1: TfrxReport;
        frxDesigner1: TfrxDesigner;
        procedure frxReport1Preview(Sender: TObject);
        procedure NewClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.frxReport1Preview(Sender: TObject);
    begin
         TfrxPreviewForm(frxReport1.PreviewForm).DesignerB.OnClick := NewClick;
    end;
    
    procedure TForm1.NewClick(Sender: TObject);
    var
      r: TfrxReport;
      p: TfrxReportPage;
      SourcePage: TfrxPage;
    
      procedure RemoveBands;
      var
        i: Integer;
        l: TList;
        c: TfrxComponent;
      begin
        l := p.AllObjects;
    
        for i := 0 to l.Count - 1 do
        begin
          c := l[i];
          if c is TfrxView then
          begin
            TfrxView(c).DataField := '';
            TfrxView(c).DataSet := nil;
            TfrxView(c).Restrictions := [];
          end;
    
          if c.Parent <> p then
          begin
            c.Left := c.AbsLeft;
            c.Top := c.AbsTop;
            c.ParentFont := False;
            c.Parent := p;
            if (c is TfrxView) and (TfrxView(c).Align in [baBottom, baClient]) then
              TfrxView(c).Align := baNone;
          end;
        end;
    
        for i := 0 to l.Count - 1 do
        begin
          c := l[i];
          if c is TfrxBand then
            c.Free;
        end;
      end;
    
    begin
      SourcePage := frxReport1.PreviewPages.Page[TfrxPreview(frxReport1.Preview).PageNo - 1];
      r := nil;
      if Assigned(SourcePage) then
      try
    
        if SourcePage is TfrxDMPPage then
          p := TfrxDMPPage.Create(nil) else
          p := TfrxReportPage.Create(nil);
        r := TfrxReport.Create(nil);
        p.AssignAll(SourcePage);
        p.Parent := r;
        RemoveBands;
        if r.DesignPreviewPage then
          try
            frxReport1.Preview.Lock;
            frxReport1.PreviewPages.ModifyPage(TfrxPreview(frxReport1.Preview).PageNo - 1, TfrxReportPage(r.Pages[0]));
            ShowMessage('Отчёт изменён');
          finally
            frxReport1.Preview.Unlock;
          end;
      except
      end;
      if r <> nil then
        r.Free;
    end;
    
    procedure TForm1.FormShow(Sender: TObject);
    begin
         frxReport1.ShowReport();
    end;
    
    end.
    
  • отредактировано 16:44
    gpi написал: »
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, frxDesgn, frxClass, frxPreview, frxDMPClass;
    ...
    

    Спасибо! Да это работает все замечательно, но насколько я понимаю это переопределение события редактирования отчета. т.е. при обновлении версии FR не исключено что режим редактирования будет не корректно работать.
  • gpigpi
    отредактировано 16:44
    написал:
    но насколько я понимаю это переопределение события редактирования отчета. т.е. при обновлении версии FR не исключено что режим редактирования будет не корректно работать.
    Такое маловероятно. В случае несовместимости придётся подкорректировать код. Другого варианта я предложить не могу

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

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