Also es gibt ja noch andere Zugriffskomponenten, die Datasource unterstützen (Zeos z.B.). MUss aber sagen, dass ich auch den "Simple SQLite Wrapper" verwende. Auch wenn die Eigenheit, erzeugte Objekte als Funktionsergebnis zu übergeben, etwas ungewöhnlich ist (und nichtmal Einheitlich, siehe Blob-Stream)
Was die Anzeige via TStringGrid angeht:
1 Million Datensätze werden im Stringgrid fast so schnell und gut angezeigt, wie 100! Das StringGrid darf nur nicht als DatenContainer missbraucht werden.
Also
TStringGrid.RowCount auf Gesamt-Datenmenge setzen und Anzeige auf OwnerDraw,
keine Daten ins StringGrid, nur der Header mit Feldnamen wird direkt im StringGrid gespeichert. Ein Puffer hält nur die Zeilen, die sichtbar sind (evtl. etwas davor/dahinter). In DrawCell werden dann die Daten aus dem Buffer im sichtbaren StringGrid-Feld angezeigt.
Symbolisch:
Delphi-Quellcode:
procedure TForm1.StringGridTableDrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
function GetDBField(FieldNo, RecNo: Integer): String;
begin
Result := // Hier FeldDaten aus dem Buffer holen
end;
procedure SetTextStyle(ACanvas: TCanvas; BackClr, FontClr: TColor; Style: TFontStyles);
begin
ACanvas.Brush.Color := BackClr;
ACanvas.Font.Color := FontClr;
ACanvas.Font.Style := Style;
end;
var
s : String;
begin
with (Sender as TStringGrid) do begin
if gdFixed in State then
SetTextStyle(Canvas, clBtnFace, clBtnText, [])
else
if gdSelected in State then
SetTextStyle(Canvas, clHighlight, clHighlightText, [])
else
SetTextStyle(Canvas, clWindow, clWindowText, []);
if ARow = 0 then // hier davon ausgehend, das es eine FixedRow als Header gibt
s := Cells[Acol,Arow]
else
s := GetDBField(ACol, ARow);
Canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2, s);
end;
end;