Я использую 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.