![]() |
Stringgrid Zeilen füllen
Ich will aus einem Array mit ca. 100 Records ein Stringgrid füllen. Rowcount gebe ich mit 2 vor , da Fixedrows := 1
Wenn ich es so mache:
Delphi-Quellcode:
dann wird die Tabelle nur mit genau 53 Einträgen gefüllt.
zeile := 0; tabelle.rowcount := 2;
for zaehler := low(xyarray) to high(xyarray) do begin inc(zeile); tabelle.cells[1,zeile] := xyarray[zaehler].bezeichnung; end; tabelle.rowcount := length(xyarray); Erhöhe ich aber rowcount in der Schleife jeweils um 1,
Delphi-Quellcode:
wird brav das ganze Array eingelesen. Wie kommt es zu diesem Unterschied? Verstehen könnte ich ja, wenn bei der ersten Variante nur eine Zeile beschrieben würde (die erste ist ja fixed!) , oder die ersten 15 (die Abmessung des Stringgrids ist so, daß 15 Zeilen angezeigt werden können).
zeile := 0; tabelle.rowcount := 2;
for zaehler := low(xyarray) to high(xyarray) do begin inc(zeile); tabelle.rowcount := tabelle.rowcount + 1; tabelle.cells[1,zeile] := xyarray[zaehler].bezeichnung; end; Warum 53? Was genau bewirkt eigentlich rowcount? Anzahl der angezeigten Zeilen? Oder Anzahl der benutzbaren Zeilen? Gibt es eine Art 'Voreinstellung' für die Zeilenanzahl eines Stringgrids? |
AW: Stringgrid Zeilen füllen
Hallo,
Delphi-Quellcode:
gibt die Anzahl aller Zeilen an, also die fixen Zeilen + die "normalen" Zeilen.
RowCount
Was ich bei StringGrids vermute ist, dass es schon eine gewisse Anzahl Zeilen (im Hintergrund) gibt. Nur werden eben durch die Zahl in RowCount nur die Zeilen angezeigt, die eben angezeigt werden sollen. Deswegen kann man auf Zeilen zugreifen, die eigentlich nicht vorhanden sein sollen (da RowCount - FixRows kleiner als die Anzahl Zeilen). |
AW: Stringgrid Zeilen füllen
ungetestet...
Delphi-Quellcode:
Wenn Du nichts editieren, sondern nur anzeigen willst wäre ein Drawgrid IMHO die bessere Wahl.
tabelle.rowcount := length(xyarray); // Zeilenanzahl incl. fixierter Zeile
for zaehler := low(xyarray) to high(xyarray) do begin tabelle.cells[1,zaehler+1] := xyarray[zaehler].bezeichnung; end; |
AW: Stringgrid Zeilen füllen
Sollte beides kein Problem sein. Problem liegt evtl. wo anders.
//Edit: Ich hab es gerade noch mal getestet, bei mir funktioniert beides in etwa ähnlich
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type Txyarray = record bezeichnung: string; end; var xyarray: array[1..100] of Txyarray; zeile, zaehler: Integer; begin for zaehler := low(xyarray) to high(xyarray) do xyarray[zaehler].bezeichnung := IntToStr(zaehler); { zeile := 0; tabelle.rowcount := 2; for zaehler := low(xyarray) to high(xyarray) do begin inc(zeile); tabelle.cells[1,zeile] := xyarray[zaehler].bezeichnung; end; tabelle.rowcount := length(xyarray); } zeile := 0; tabelle.rowcount := 2; for zaehler := low(xyarray) to high(xyarray) do begin inc(zeile); tabelle.rowcount := tabelle.rowcount + 1; tabelle.cells[1,zeile] := xyarray[zaehler].bezeichnung; end; end; |
AW: Stringgrid Zeilen füllen
@Helmi:
Den Verdacht habe ich auch: Stringgrid hat voreingestellt 50 Zeilen (möglicherweise habe ich mich um drei verzählt), wenn man mehr braucht, muß man sie explizit mit rowcount erzeugen. @Bummi: Zur Verdeutlichung habe ich etwas gekürzt. In meinem konkreten Fall werden nicht alle Arrayelemente übernommen, sondern nur bestimmte ausgewählt. Deswegen weiß ich vorher nicht, wieviele Zeilen im Stringgrid gebraucht werden. Dein Lösungsvorschlag geht hier also nicht; im Endeffekt kommt es auf das gleiche hinaus: Anscheinend müssen Zeilen oberhalb einer gewissen Anzahl (50?) extra angefordert werden. @Popov Bei dir funktionieren beide Varianten gleich? Es werden in beiden Fällen 100 Zeilen in der Tabelle angezeigt? Vielleicht ist es von der Compilerversion abhängig? Ich habe mit D7 programmiert |
AW: Stringgrid Zeilen füllen
Wenn man sich die (versteckte) Funktion "DeleteRow" vom StringGrid anschaut, wird beim löschen nur RowCount reduziert, das würde dafür sprechen, dass es eine feste Anzahl vorhandener Zeilen gibt. Bin deswegen schon mal auf die Schnauze gefallen.
In diesem Sinne möcht ich auch mal auf diesen Hack hinweisen: ![]() Nichts desto trotz find ich es richtiger wenn man explizit sagt wieviele Zeilen dass man braucht, sprich RowCount dementsprechend hochzählt, bzw. von vorn hinein, wenn man es weiss, bereits auf die gewünschte Anzahl setzt (inkl. FixRows) |
AW: Stringgrid Zeilen füllen
Hallo,
ich würde erst mal durch das Array gehen, um die benötigte Zeilenzahl zu ermitteln und zu setzen. Und ja, die Zeilenzahl erhöht sich nicht automatisch und muss explizit gesetzt werden. Heiko |
AW: Stringgrid Zeilen füllen
@hoika :thumb:
|
AW: Stringgrid Zeilen füllen
Hallo,
was das ganze so gemein macht: Das Grid entfernt Zeilen nicht direkt, wenn man RowCount verringert. Sie werden nur nicht angezeigt. Der alte Inhalt ist noch da. Vergrößert man RowCount wieder, ist der alte Inhalt wieder da, ob das gewollt, sie dahingestellt. Das läuft alles unter den Stichwort "Speicheroptimierung". Heiko |
AW: Stringgrid Zeilen füllen
Nun, soweit ich weiß sind in beide Richtigen TStringLists oder TStrings. Man kann also füllen bis an die grenze. Das andere ist der sichtbare Bereich.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz