2014-09-23 2 views
1

Я использую FastReport 4 для отображения некоторых динамически сгенерированных данных и переупорядочения в отчете.Создание и удаление объектов в Fast Report VCL (Delphi)

Я использую «шаблон» объект в отчете, чтобы получить начальную позицию (в моей реальной программе скопировать свойство шрифта, выравнивание и т.д.)

Я сумел создать небольшой проект, так что я могу создать примечательный компонент в отчете, просмотреть отчет, а затем удалить компонент, чтобы я мог повторно использовать отчет с разными данными.

Однако, когда я освобождаю созданный объект, я теряю другие объекты из отчета (в этом случае мой объект шаблона не найден во второй раз, когда я просматриваю отчет).

Каков правильный способ создания и удаления объектов из отчета быстрого отчета?

Вот паскаль единица:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, frxClass; 

type 
    TForm1 = class(TForm) 
    frxReport1: TfrxReport; 
    btn1: TButton; 
    procedure btn1Click(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.btn1Click(Sender: TObject); 
var 
    modelObj: TfrxComponent; 
    newObj: TfrxMemoView; 
begin 
    modelObj := frxReport1.FindObject('modelObj'); 
    newObj := TfrxMemoView.Create(modelObj.Parent); 
    newObj.CreateUniqueName; 
    newObj.Text := 'Whee'; 
    newObj.SetBounds(modelObj.Left, modelObj.Top + modelObj.Height, 
    modelObj.Width, modelObj.Height); 
    frxReport1.PrepareReport; 
    frxReport1.ShowPreparedReport; 
    newObj.Free; 
end; 

end. 

Вот DFM:

object Form1: TForm1 
    Left = 0 
    Top = 0 
    Caption = 'Form1' 
    ClientHeight = 299 
    ClientWidth = 635 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object btn1: TButton 
    Left = 224 
    Top = 48 
    Width = 75 
    Height = 25 
    Caption = 'btn1' 
    TabOrder = 0 
    OnClick = btn1Click 
    end 
    object frxReport1: TfrxReport 
    Version = '4.15' 
    DotMatrixReport = False 
    IniFile = '\Software\Fast Reports' 
    PreviewOptions.Buttons = [pbPrint, pbLoad, pbSave, pbExport, pbZoom, pbFind, pbOutline, pbPageSetup, pbTools, pbEdit, pbNavigator, pbExportQuick] 
    PreviewOptions.Zoom = 1.000000000000000000 
    PrintOptions.Printer = 'Por defecto' 
    PrintOptions.PrintOnSheet = 0 
    ReportOptions.CreateDate = 41905.757295162040000000 
    ReportOptions.LastChange = 41905.757295162040000000 
    ScriptLanguage = 'PascalScript' 
    ScriptText.Strings = (
     'begin' 
     '' 
     'end.') 
    Left = 72 
    Top = 32 
    Datasets = <> 
    Variables = <> 
    Style = <> 
    object Data: TfrxDataPage 
     Height = 1000.000000000000000000 
     Width = 1000.000000000000000000 
    end 
    object Page1: TfrxReportPage 
     PaperWidth = 216.000000000000000000 
     PaperHeight = 279.000000000000000000 
     PaperSize = 1 
     LeftMargin = 10.000000000000000000 
     RightMargin = 10.000000000000000000 
     TopMargin = 10.000000000000000000 
     BottomMargin = 10.000000000000000000 
     object PageHeader1: TfrxPageHeader 
     Height = 279.685220000000000000 
     Top = 18.897650000000000000 
     Width = 740.787880000000000000 
     object modelObj: TfrxMemoView 
      Left = 166.299320000000000000 
      Top = 30.236240000000000000 
      Width = 264.567100000000000000 
      Height = 18.897650000000000000 
      ShowHint = False 
      Color = clYellow 
      Font.Charset = DEFAULT_CHARSET 
      Font.Color = clBlack 
      Font.Height = -13 
      Font.Name = 'Arial' 
      Font.Style = [] 
      Memo.UTF8W = (
      'Model') 
      ParentFont = False 
     end 
     end 
    end 
    end 
end 

ответ

1

К сожалению, мой первый ответ в заблуждение.
Это похоже на внутреннюю ошибку в PrepareReport, объекты, кажется, обмениваются.

var 
    modelObj: TfrxComponent; 
    newObj: TfrxMemoView; 
    cn:String; 
begin 
    modelObj := frxReport1.FindObject('modelObj'); 
    newObj := TfrxMemoView.Create(modelObj.Parent); 
    newObj.CreateUniqueName; 
    cn := newObj.Name; // keep for dirty workaround 
    newObj.Text := 'Whee'; 
    newObj.SetBounds(modelObj.Left, modelObj.Top + modelObj.Height, 
    modelObj.Width, modelObj.Height); 

    Showmessage('New: ' + newObj.Name + ' modelObj: ' + modelObj.Name); 
    frxReport1.PrepareReport; 
    Showmessage('New: ' + newObj.Name + ' modelObj: ' + modelObj.Name); 

    frxReport1.ShowPreparedReport; 
    newObj := TfrxMemoView(frxReport1.FindObject(cn)); // dirty workaround 
    newObj.Free; 
end; 

Выход:

New: Memo1 modelObj: modelObj 
New: modelObj modelObj: Memo1 

Обходной показано здесь не будет использоваться способ, поэтому загрузка отчетов из файла или размещения компонента TfrxReport на DataModule, которые будут созданы перед печатью и уничтоженных впоследствии могут быть лучшими обходными решениями, пока эта ошибка не будет исправлена.

+0

Ага, так что это была ошибка. В качестве обходного пути я создаю новый отчет и копирую с оригинала, используя 'NewReport.AssignAll (BaseReport)'. Кажется, это трюк. –

Смежные вопросы