Правка отчета на панели

отредактировано March 2018 Раздел: FastReport VCL
Приветствую уважаемые.
Есть замечательная процедура DesignReportInPanel. Вопрос: есть ли что-то подобное для правки fp3? Идея похожа на демку EmbedDesigner, но с некоторыми отличиями: PageControl содержит две вкладки, на первой расположен frxPreview, а вторая предназначена для редактирования активной страницы отчета. Может кто-то уже реализовывал и не против поделиться кодом? Буду благодарен всем.

Комментарии

  • gpigpi
    отредактировано 14:07
    написал:
    Есть замечательная процедура DesignReportInPanel.
    Она замечательна лишь тем, что её можно не использовать
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, frxDesgn, frxClass, frxPreview, frxDMPClass, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        frxReport1: TfrxReport;
        frxDesigner1: TfrxDesigner;
        Panel1: TPanel;
        frxPreview1: TfrxPreview;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure frxReport1Preview(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      r: TfrxReport;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
     // r: TfrxReport;
      p: TfrxReportPage;
      SourcePage: TfrxPage;
      l: TList;
      i: Integer;
      c: TfrxComponent;
      ct: TControl;
      cp: TWinControl;
    
      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
      if r <> nil then
      begin
      r := nil;
      r.Free;
    
      end;
     // else
      r := TfrxReport.Create(nil);
      if SourcePage <> nil then
        SourcePage := nil;
      if p <> nil then
        p := nil;
      SourcePage := frxReport1.PreviewPages.Page[TfrxPreview(frxReport1.Preview).PageNo - 1];//frxReport1.PreviewPages.Page[I];
      if SourcePage is TfrxDMPPage then
        p := TfrxDMPPage.Create(nil)
      else
        p := TfrxReportPage.Create(nil);
      p.AssignAll(SourcePage);
      p.Parent := r;
      RemoveBands;
      if r.Designer <> nil then Exit;
      if frxDesignerClass <> nil then
      begin
        r.Script.ClearItems(r);
        l := r.AllObjects;
        for i := 0 to l.Count - 1 do
        begin
          c := l[i];
          if c is TfrxCustomDBDataset then
            c.BeforeStartReport;
        end;
    
        r.Modified := False;
        r.Designer := TfrxCustomDesigner(frxDesignerClass.NewInstance);
        r.Designer.CreateDesigner(nil, r);
        cp := Panel1.Parent;
        while cp <> nil do
        begin
          if cp is TForm then
            r.Designer.ParentForm := TForm(cp);
          cp:= cp.Parent;
        end;
        PostMessage(r.Designer.Handle, WM_USER + 1, 0, 0);
        r.Designer.OnShow(r.Designer);
    
        while r.Designer.ControlCount > 0 do
        begin
          ct := r.Designer.Controls[0];
          ct.Parent := Panel1;
        end;
      end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
         frxReport1.ShowReport();
    end;
    
    procedure TForm1.frxReport1Preview(Sender: TObject);
    begin
         TfrxPreviewForm(frxReport1.PreviewForm).DesignerB.OnClick := Button1Click;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var ct: TControl;
    begin
    
      if r.Modified then// r.DesignPreviewPage then
       try
         frxReport1.Preview.Lock;
         frxReport1.PreviewPages.ModifyPage(TfrxPreview(frxReport1.Preview).PageNo - 1, TfrxReportPage(r.Pages[1]));
       finally
         frxReport1.Preview.Unlock;
         ShowMessage('Страница изменена');
       end;
      while r.Designer.ControlCount > 0 do
        begin
          ct := r.Designer.Controls[0];
          ct.Parent := nil;
        end;
      r.Designer.Free;  
    end;
    
    end.
    
  • отредактировано 14:07
    gpi написал: »
    Она замечательна лишь тем, что её можно не использовать
    Не согласен кардинально). Часто работаю с шаблонами, помимо дизайнер нужен доступ к другим элементам приложения, поэтому дизайнер на панели а не в модальном окне - самое то. По поводу кода - двумя часами ранее техподдержка прислала идентичный код - работает, уже пилю под свои нужды, тем не менее благодарен Вам за ответ. Вопрос исчерпан, тему можно закрывать.

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

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