Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Wie zeige ich einen TSQLiteTable an?

  Alt 17. Apr 2011, 07:58
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;

Geändert von Satty67 (17. Apr 2011 um 08:04 Uhr)
  Mit Zitat antworten Zitat