[Lazarus] db grid/dataset components that only load currently visible records?

Luca Olivetti luca at wetron.es
Fri Feb 24 10:44:02 CET 2023

El 23/2/23 a les 17:16, Michael Van Canneyt ha escrit:

  write a TDataset descendant tailor made for this
>> application, any pointer on how to write a minimal descendant?
>> I'm looking at the TMemDataset implementation as an example, is it a 
>> good one?
> As good as any other.
>> The idea is to substitute open and scrolling (next/prior/locate/etc.) 
>> with the appropriate sql statements to just retrieve a small buffer of 
>> data around the current record (I can do that easily enough), though 
>> I'm not sure that would be enough to fool the TDBGrid.
> I don't know what the grid exactly does, so I cannot advise.

I did some tests and the grid is not a problem (it only fetches the 
records that are visible), the TDataset is:  either I am blind or the 
only way for the TDataset to realize there is data is to fetch every 
record and allocate the corresponding buffers.
That's because FRecordCount/FBof/FEof are private

procedure TDataSet.DoInternalOpen;

   FInternalOpenComplete := True;
{$ifdef dsdebug}
   Writeln ('Calling internal open');
{$ifdef dsdebug}
   Writeln ('Calling RecalcBufListSize');
   FRecordCount := 0;
   RecalcBufListSize; <-- this will fetch all the records
   FBOF := True;
   FEOF := (FRecordCount = 0); <--- FRecordCount must be set

There's no point overriding 
GetNextRecords/GetNextRecord/GetPriorRecords/GetPriorRecord (called by 
RecalcBufListSize) since I cannot directly modify the private fields of 
the TDataSet.

Any idea?


Luca Olivetti
Wetron Automation Technology http://www.wetron.es/
Tel. +34 93 5883004 (Ext.3010)  Fax +34 93 5883007

More information about the lazarus mailing list