Производительность с FastReport TFrxCrossObject и большими сетками (> 1000 строк)

Я использую FastReport, и мне нужно просмотреть/распечатать сетки с более чем 1000 строк, и у меня есть некоторые проблемы с производительностью. Обычно я использую TfrxCrossObject для подготовки своей сетки, потому что конечный пользователь может изменить представление сетки (используемые столбцы, имя столбца, размер), поэтому мне нужна динамическая печать. Я протестировал простую сетку (16 столбцов x 2000 строк), и для отображения первой страницы предварительного просмотра требуется более 10 секунд. Любая идея улучшить производительность?

РЕДАКТИРОВАТЬ: Как сказано в некоторых ответах, проблема заключается в следующем: как создать «динамически» сетку (с теми же именами и размерами столбцов, что и на экране) в FastReport без использования TFrxCrossObject, что кажется не очень эффективным. Я могу принять все решения, такие как использование DataSet или улучшение TfrxCrossObject.

Тестовый код:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    frxCrossObject1: TfrxCrossObject;
    frxReport1: TfrxReport;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure frxReport1BeforePrint(c: TfrxReportComponent);
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j: Integer;
begin
  for i := 1 to 16 do
    for j := 1 to 2000 do
      StringGrid1.Cells[i - 1, j - 1] := IntToStr(i * j);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  frxReport1.ShowReport;
end;

procedure TForm1.frxReport1BeforePrint(c: TfrxReportComponent);
var
  Cross: TfrxCrossView;
  i, j: Integer;
begin
  if c is TfrxCrossView then
  begin
    Cross := TfrxCrossView(c);
    for i := 1 to 16 do
      for j := 1 to 2000 do
        Cross.AddValue([i], [j], [StringGrid1.Cells[i - 1, j - 1]]);
  end;
end;
end.
6
задан Justmade 21 March 2012 в 01:57
поделиться