Проблема с сохранением изменений в Tfrxreport

отредактировано October 2015 Раздел: FastReport VCL
Коллеги, доброго дня.

В моем прикладном приложении активно используется TfrxReport.

Загрузка содержимого в него осуществляется кодом:

AStream := TMemoryStream.Create;
... // тут код записывает в мемори-поток из нужного источника

AStream.Seek(0,soFromBeginning);

If AStream.Size > 0 Then frxReport1.Report.LoadFromStream(AStream)
else frxReport1.Report.Clear;

Макет отчета открывается, все ОК. После того как пользователь в приложении нажимает кнопку Сохранить срабатывает код:
AStream := TMemoryStream.Create;

frxReport1.Report.SaveToStream(AStream);

AStream.Seek(0,soFromBeginning);
SetLength(Result, AStream.Size);
AStream.Read(Result[1], AStream.Size);

... // тут код читает из мемори-потока и пишет в нужное место.



ВСЕ РАБОТАЕТ - ВСЕ ОК.

Однако я заметил, что если открыть макет отчета и поправить ТОЛЬКО во вкладке Code не переключаясь на другие закладки и не изменяя содержимое других закладок, то изменения во вкладке Code не будут
сохранены.

Комментарии

  • gpigpi
    отредактировано 01:18
    Unit2.pas:
    unit Unit2;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, frxClass, frxDesgn;
    
    type
    TOnCloseEvent = procedure of object;
    
    TForm2 = class(TForm)
    Panel1: TPanel;
    frxReport1: TfrxReport;
    frxDesigner1: TfrxDesigner;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    function frxDesigner1SaveReport(Report: TfrxReport;
    SaveAs: Boolean): Boolean;
    private
    { Private declarations }
    public
    FOnCloseEvent2 : TOnCloseEvent;
    { Public declarations }
    end;
    
    var
    Form2: TForm2;
    
    implementation
    
    uses Unit1;
    
    {$R *.dfm}
    
    procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    CanClose := True;
    end;
    
    procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    frxReport1.Designer.Close;
    Action := caFree;
    end;
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
    frxDesigner1.CloseQuery := False;
    frxDesigner1.Restrictions := [drDontCreateReport, drDontLoadReport{, drDontSaveReport}];
    end;
    
    function TForm2.frxDesigner1SaveReport(Report: TfrxReport;
    SaveAs: Boolean): Boolean;
    begin
    if not SaveAs then
    begin
    Unit1.AMemory.Position := 0;
    Form2.frxReport1.SaveToStream(Unit1.AMemory);
    Result := True;
    end;
    end;
    
    end.
    

    Unit1.pas:
    unit Unit1;
    
    interface
    
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, frxClass, DB, ADODB, StdCtrls, Grids, DBGrids, frxDesgn;
    
    type
    TForm1 = class(TForm)
    Button4: TButton;
    Button5: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    private
    { Private declarations }
    procedure SaveReport;
    public
    { Public declarations }
    end;
    
    var
    Form1: TForm1;
    AMemory : TMemoryStream;
    
    implementation
    
    uses Unit2;
    
    {$R *.dfm}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    AMemory := TMemoryStream.Create;
    AMemory.Clear;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    Form2 := TForm2.Create(Self);
    // Form2.FOnCloseEvent2 := SaveReport;
    
    AMemory.Position := 0;
    
    If AMemory.Size >0 Then Form2.frxReport1.LoadFromStream(AMemory)
    else Form2.frxReport1.Clear;
    
    Form2.frxReport1.DesignReportInPanel(Form2.Panel1);
    //Form2.frxReport1.Designer.Close;
    Form2.ShowModal;
    
    //AMemory.Clear;
    
    //Form2.frxReport1.Designer.Close; 
    
    FreeAndNil(Form2);
    end;
    
    procedure TForm1.SaveReport;
    begin
    
    end;
    
    end.
    

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

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