Also die Hinweise zusammengeworfen, (wenn schon die ganze Datenbank eingelesen und angezeigt werden muss) würde es am meisten Sinn machen, die Daten in einen schnellen "Container" einzulesen.
Also Daten erst in ein passendes dyn. Array einlesen und über eine simple Funktion die Werte für die jeweilige Zeile/Spalte bereitstellen (ist im Ausgangspost ja quasi schon vorhanden)
function GetDatabaseArrayValue(ACol, ARow): String;
.
Nach dem Einlesen ist RowCount bekannt und kann im StringGrid gesetzt werden. Das StringGrid wird jetzt nicht gefüllt sonder wie mkinzler vorgeschlagen hat, nur der sichtbare Bereich via DrawCell angezeigt (Beispiel mit einer fixed Row):
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject;
ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
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
s := Cells[Acol,Arow]
else
s := GetDatabaseArrayValue(ACol, ARow);
Canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2, s);
end;
end;