diff --git a/components/gridprinter/examples/dbgrid2/dbgrid_demo.lpi b/components/gridprinter/examples/dbgrid2/dbgrid_demo.lpi index 3282350df..f50bb16aa 100644 --- a/components/gridprinter/examples/dbgrid2/dbgrid_demo.lpi +++ b/components/gridprinter/examples/dbgrid2/dbgrid_demo.lpi @@ -15,7 +15,6 @@ - diff --git a/components/gridprinter/examples/dbgrid2/main.lfm b/components/gridprinter/examples/dbgrid2/main.lfm index a75bc6048..a453ddc74 100644 --- a/components/gridprinter/examples/dbgrid2/main.lfm +++ b/components/gridprinter/examples/dbgrid2/main.lfm @@ -6,8 +6,8 @@ object Form1: TForm1 Caption = 'Form1' ClientHeight = 382 ClientWidth = 689 + LCLVersion = '3.99.0.0' OnCreate = FormCreate - LCLVersion = '2.3.0.0' object DBGrid1: TDBGrid Left = 0 Height = 345 @@ -42,8 +42,8 @@ object Form1: TForm1 AutoSize = True BorderSpacing.Around = 6 Caption = 'Print preview...' - OnClick = Button1Click TabOrder = 0 + OnClick = Button1Click end object cbShowTitles: TCheckBox AnchorSideLeft.Control = Button1 @@ -56,8 +56,8 @@ object Form1: TForm1 Width = 75 BorderSpacing.Around = 6 Caption = 'Show titles' - OnChange = cbShowTitlesChange TabOrder = 1 + OnChange = cbShowTitlesChange end object cbShowIndicator: TCheckBox AnchorSideLeft.Control = cbShowTitles @@ -71,8 +71,22 @@ object Form1: TForm1 BorderSpacing.Left = 6 BorderSpacing.Around = 6 Caption = 'Show indicator column' - OnChange = cbShowIndicatorChange TabOrder = 2 + OnChange = cbShowIndicatorChange + end + object cbFiltered: TCheckBox + AnchorSideLeft.Control = cbShowIndicator + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = cbShowIndicator + AnchorSideTop.Side = asrCenter + Left = 350 + Height = 19 + Top = 9 + Width = 296 + BorderSpacing.Left = 6 + Caption = 'Print only records with IntFields >=1000 and <= 2000' + TabOrder = 3 + OnChange = cbFilteredChange end end object DataSource1: TDataSource @@ -99,6 +113,7 @@ object Form1: TForm1 end object BufDataset1: TBufDataset FieldDefs = <> + OnFilterRecord = BufDataset1FilterRecord Left = 167 Top = 64 end diff --git a/components/gridprinter/examples/dbgrid2/main.pas b/components/gridprinter/examples/dbgrid2/main.pas index d00818496..7745e6a72 100644 --- a/components/gridprinter/examples/dbgrid2/main.pas +++ b/components/gridprinter/examples/dbgrid2/main.pas @@ -17,14 +17,17 @@ type Button1: TButton; cbShowTitles: TCheckBox; cbShowIndicator: TCheckBox; + cbFiltered: TCheckBox; DataSource1: TDataSource; DBGrid1: TDBGrid; GridPrinter1: TGridPrinter; GridPrintPreviewDialog1: TGridPrintPreviewDialog; Panel1: TPanel; + procedure BufDataset1FilterRecord(DataSet: TDataSet; var Accept: Boolean); procedure Button1Click(Sender: TObject); procedure cbShowIndicatorChange(Sender: TObject); procedure cbShowTitlesChange(Sender: TObject); + procedure cbFilteredChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure GridPrinter1AfterPrint(Sender: TObject); procedure GridPrinter1GetCellText(Sender: TObject; AGrid: TCustomGrid; @@ -132,6 +135,15 @@ begin end; end; +procedure TForm1.BufDataset1FilterRecord(DataSet: TDataSet; var Accept: Boolean + ); +var + value: Integer; +begin + value := Dataset.FieldByName('IntField').AsInteger; + Accept := (value >= 1000) and (value <= 2000); +end; + procedure TForm1.cbShowIndicatorChange(Sender: TObject); begin if cbShowIndicator.Checked then @@ -148,6 +160,19 @@ begin DBGrid1.Options := DBGrid1.Options - [dgTitles]; end; +procedure TForm1.cbFilteredChange(Sender: TObject); +begin + if cbFiltered.Checked then + begin + BufDataset1.OnFilterRecord := @BufDataset1FilterRecord; + BufDataset1.Filtered := true; + end else + begin + BufDataset1.Filtered := false; + BufDataset1.OnFilterRecord := nil; + end; +end; + { The OnGetCellText fires whenever a cell is printed and the printer needs to know the cell text. } procedure TForm1.GridPrinter1GetCellText(Sender: TObject; AGrid: TCustomGrid; @@ -181,13 +206,35 @@ begin end; { Since the DBGrid does not load all records, but we want to print all - of them, we must tell the printer the real number of rows to print. } + of them, we must tell the printer the real number of rows to print. + Note that depending on the type of dataset RecordCount may be wrong, + in particular when the dataset is filtered.} procedure TForm1.GridPrinter1GetRowCount(Sender: TObject; AGrid: TCustomGrid; var ARowCount: Integer); +var + accept: Boolean; + n: Integer; begin - BufDataset1.Last; - BufDataset1.First; - ARowCount := BufDataset1.RecordCount; + if BufDataset1.Filtered then + begin + BufDataset1.DisableControls; + BufDataset1.First; + n := 0; + while not BufDataset1.EoF do + begin + BufDataset1FilterRecord(BufDataset1, accept); + if accept then inc(n); + BufDataset1.Next; + end; + BufDataset1.First; + BufDataset1.EnableControls; + end else + begin + BufDataset1.Last; + BufDataset1.First; + n := BufDataset1.RecordCount; + end; + ARowCount := n; if dgTitles in TDBGrid(AGrid).Options then inc(ARowCount); // added 1 for the header row end;