Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ускорение работы гридов в FastReport: альтернативы TfrxCrossObject

Delphi , Базы данных , Отчеты

При работе с большими данными в FastReport одним из способов отображения информации является использование гридов. Однако, при использовании компонента TfrxCrossObject для подготовки грида могут возникнуть проблемы с производительностью, особенно если грид содержит более 1000 строк. В этом случае может потребоваться поиск альтернативных решений для ускорения работы гридов в FastReport.

Одной из альтернатив TfrxCrossObject может быть использование компонента TfrxUserDataSet. Этот компонент позволяет создавать пользовательские наборы данных, которые можно использовать для отображения информации в гриде. При использовании TfrxUserDataSet можно создавать динамические гриды, которые можно менять в режиме реального времени.

Пример кода на Object Pascal (Delphi) для создания динамического грида с использованием TfrxUserDataSet:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    frxReport1: TfrxReport;
    frxUserDataSet1: TfrxUserDataSet;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure frxUserDataSet1Next(Sender: TObject);
    procedure frxUserDataSet1GetValue(const VarName: string; var Value: Variant);
    procedure frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
    procedure frxUserDataSet1First(Sender: TObject);
  private
    X, Y, TCol, TRow : Integer;
    IsEof : Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j : Integer;
begin
  TCol := 2000; // Total Column
  TRow := 16; // Total Row

  for i := 1 to TRow do
    for j := 1 to TCol do
      StringGrid1.Cells[i - 1, j - 1] := IntToStr(i * j);

  frxUserDataSet1.Fields.Text := 'Data';
  frxReport1.Clear;
  frxReport1.DataSets.Add(frxUserDataSet1);
end;

procedure TForm1.frxUserDataSet1CheckEOF(Sender: TObject; var Eof: Boolean);
begin
  Eof := IsEof;
end;

procedure TForm1.frxUserDataSet1First(Sender: TObject);
begin
  X := 0;
  Y := 0;
end;

procedure TForm1.frxUserDataSet1GetValue(const VarName: string; var Value: Variant);
begin
  Value := StringGrid1.Cells[X,Y];
end;

procedure TForm1.frxUserDataSet1Next(Sender: TObject);
begin
  If Y = TCol - 1 then
  begin
    if X = TRow - 1 then
      IsEof := True;
    Inc(X);
    Y := 0;
  end
  else
    Inc(Y);
end;

end.

При нажатии кнопки "Показать отчет" (Button1Click) отображается отчет с динамическим гридом, который заполняется данными из StringGrid1 в процедуре FormCreate. При этом процедуры frxUserDataSet1Next, frxUserDataSet1GetValue, frxUserDataSet1CheckEOF и frxUserDataSet1First обрабатывают движение по данным в наборе TfrxUserDataSet.

При использовании TfrxUserDataSet для ускорения работы гридов в FastReport важно учитывать, что этот компонент требует больше кода для настройки и заполнения данных, чем TfrxCrossObject. Однако, при правильной настройке TfrxUserDataSet может обеспечить значительно лучшую производительность при работе с большими данными.

Другим способом ускорить работу гридов в FastReport может быть использование компонента TfrxClientDataSet. Этот компонент позволяет создавать клиентские наборы данных, которые можно использовать для отображения информации в гриде. При использовании TfrxClientDataSet можно создавать динамические гриды, которые можно менять в режиме реального времени, а также выполнять операции по сортировке и фильтрации данных на клиентской стороне, что может ускорить работу с большими данными.

Пример кода на Object Pascal (Delphi) для создания динамического грида с использованием TfrxClientDataSet: ```pascal unit Unit1;

interface

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

type TForm1 = class(TForm) Button1: TButton; StringGrid1: TStringGrid; frxReport1: TfrxReport; frxClientDataSet1: TfrxClientDataSet; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure frxReport1BeforePrint(c: TfrxReportComponent); private { Private declarations } public { Public declarations } end;

var Form1: TForm1;

implementation

{$R *.dfm}

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

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);

frxClientDataSet1.DataSet := TClientDataSet.Create(nil); frxClientDataSet1.DataSet.CreateDataSet('DataSet', False); frxClientDataSet1.DataSet.CreateFieldDef('Col1', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col2', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col3', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col4', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col5', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col6', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col7', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col8', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col9', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col10', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col11', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col12', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col13', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col14', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col15', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col16', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col17', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col18', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col19', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col20', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col21', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col22', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col23', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col24', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col25', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col26', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col27', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col28', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col29', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col30', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col31', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col32', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col33', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col34', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col35', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col36', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col37', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col38', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col39', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col40', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col41', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col42', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col43', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col44', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col45', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col46', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col47', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col48', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col49', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col50', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col51', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col52', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col53', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col54', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col55', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col56', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col57', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col58', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col59', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col60', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col61', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col62', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col63', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col64', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col65', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col66', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col67', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col68', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col69', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col70', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col71', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col72', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col73', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col74', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col75', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col76', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col77', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col78', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col79', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col80', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col81', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col82', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col83', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col84', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col85', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col86', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col87', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col88', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col89', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col90', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col91', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col92', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col93', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col94', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col95', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col96', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col97', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col98', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col99', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col100', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col101', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col102', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col103', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col104', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col105', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col106', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col107', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col108', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col109', ftString, 50); frxClientDataSet1.DataSet.CreateFieldDef('Col110', ftString,

Создано по материалам из источника по ссылке.

Ускорение работы гридов в FastReport: альтернативы TfrxCrossObject


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Отчеты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 22:36:29/0.0036239624023438/0