Hallo Delphi-Fans,
ist das jemandem schonmal aufgefallen:
Wenn zur Laufzeit ein TStringgrid kreiert wird, und man Zeilen iterativ einträgt über z.B.:<pre>
MySgrid.cells[0,i]:=strTexta;
MySgrid.cells[1,i]:=strTextb;
inc(i)
</pre>
dann findet später der Befehl <pre>MySgrid.Cols[0].IndexOf(strTextzumVergleich);</pre> keine Einträge, die ab der sechsten Zeile vorkommen.
Die Modifikation<pre>
MySgrid.cells[0,i]:=strTexta;
MySgrid.cells[1,i]:=strTextb;
MySgrid.rowcount:=i;
inc(i)
</pre>
behebt den Fehler.
Wenn man ein TStringgrid zur Entwurfszeit erzeugt, steht es standardmäßig auf Rowcount=5 (ist das irgendwo einstellbar?).
Offenbar gilt also folgendes:
1. IndexOf durchsucht nur bis zu Rowcount-ten Zeile.<br>
2. Rowcount erhöht sich nicht bei direkter Belegung der Cell.
Aber ein iteratives Vorgehen à la<pre>
MySgrid.cols[0].add(strTexta);
MySgrid.cols[1].add(strTextb);
inc(i) // i nur noch als Laufvariable erforderlich
</pre>
gibt es so gar nicht, im Gegensatz zum Fall einer einspaltigen Liste (z.B. TStringList), wo hier auch die Eigenschaft TStringList.Colcount durch Add automatisch erhöht wird.
Natürlich ist mir auch klar, daß es bei einer mehrspaltigen Liste nicht unabhängige Colcounts geben sollte (das macht kaum Sinn). Aber Grid.Rowcount könnte sich doch eigentlich automatisch auf die höchste vorkommende Colcount setzen, oder? Dann könnte das TStringgrid-Objekt unterschiedliche Colcounts wiederum damit ebenfalls abgleichen, also alle Spalte immer auf gleiche Länge aufstocken.
Hätte, könnte... so ist TStringgrid halt nicht implementiert ;-)
Mich würden andere Erfahrungen/Meinungen/Workarounds/Sonstiges dazu interessieren.
Greetings2u<br>
Alex
ist das jemandem schonmal aufgefallen:
Wenn zur Laufzeit ein TStringgrid kreiert wird, und man Zeilen iterativ einträgt über z.B.:<pre>
MySgrid.cells[0,i]:=strTexta;
MySgrid.cells[1,i]:=strTextb;
inc(i)
</pre>
dann findet später der Befehl <pre>MySgrid.Cols[0].IndexOf(strTextzumVergleich);</pre> keine Einträge, die ab der sechsten Zeile vorkommen.
Die Modifikation<pre>
MySgrid.cells[0,i]:=strTexta;
MySgrid.cells[1,i]:=strTextb;
MySgrid.rowcount:=i;
inc(i)
</pre>
behebt den Fehler.
Wenn man ein TStringgrid zur Entwurfszeit erzeugt, steht es standardmäßig auf Rowcount=5 (ist das irgendwo einstellbar?).
Offenbar gilt also folgendes:
1. IndexOf durchsucht nur bis zu Rowcount-ten Zeile.<br>
2. Rowcount erhöht sich nicht bei direkter Belegung der Cell.
Aber ein iteratives Vorgehen à la<pre>
MySgrid.cols[0].add(strTexta);
MySgrid.cols[1].add(strTextb);
inc(i) // i nur noch als Laufvariable erforderlich
</pre>
gibt es so gar nicht, im Gegensatz zum Fall einer einspaltigen Liste (z.B. TStringList), wo hier auch die Eigenschaft TStringList.Colcount durch Add automatisch erhöht wird.
Natürlich ist mir auch klar, daß es bei einer mehrspaltigen Liste nicht unabhängige Colcounts geben sollte (das macht kaum Sinn). Aber Grid.Rowcount könnte sich doch eigentlich automatisch auf die höchste vorkommende Colcount setzen, oder? Dann könnte das TStringgrid-Objekt unterschiedliche Colcounts wiederum damit ebenfalls abgleichen, also alle Spalte immer auf gleiche Länge aufstocken.
Hätte, könnte... so ist TStringgrid halt nicht implementiert ;-)
Mich würden andere Erfahrungen/Meinungen/Workarounds/Sonstiges dazu interessieren.
Greetings2u<br>
Alex
Comment