Lukas hat Recht, Onkel Google hat dir nicht alles gegeben. In seinem Code hat er allerdings ein paar Fehler eingebaut.
Beim Speichern eines StringGrid musst man überlegen, ob die Daten spalten- oder zeilenorientiert gespeichert werden sollen. Das Speichern mehrerer StringGrids in derselben Datei ist technisch kein Problem, aber ob es auch sinnvoll ist? Falls es Überschriften (FixedCols, FixedRows) gibt, sollen die immer bei jedem Speichervorgang mitgespeichert werden?
Eine Speicherroutine, die diese Fragestellungen berücksichtigt, könnte ansatzweise so aussehen:
Delphi-Quellcode:
type
TSaveOption = (soSaveCols, soExcludeFixed);
TSaveOptions = set of TSaveOption;
procedure SaveGrid(sg: TStringGrid; s: TStream; so: TSaveOptions = []);
var
iLow, iHigh, i: Integer;
ss: TStringStream;
bSaveCols, bExcludeFixed: Boolean;
begin
ss := TStringStream.Create('');
with sg do
begin
bSaveCols := soSaveCols in so;
bExcludeFixed := soExcludeFixed in so;
if bSaveCols then
begin
iLow := IfThen(bExcludeFixed, FixedCols);
iHigh := Pred(ColCount);
end else
begin
iLow := IfThen(bExcludeFixed, FixedRows);
iHigh := Pred(RowCount);
end;
for i := iLow to iHigh do
begin
ss.Size := 0;
if bSaveCols
then ss.WriteString(Cols[i].CommaText + sLineBreak)
else ss.WriteString(Rows[i].CommaText + sLineBreak);
ss.Position := 0;
s.CopyFrom(ss, ss.Size);
end;
end;
ss.Free;
end;
Testen kannst du so:
Delphi-Quellcode:
var
s: TStream;
fn: TFileName;
begin
fn := ChangeFileExt(ParamStr(0), '.txt');
s := TFileStream.Create(fn, fmCreate);
// Zeilenweise, FixedRows mitspeichern
SaveGrid(StringGrid, s);
// Zeilenweise, FixedRows nicht mitspeichern
SaveGrid(StringGrid, s, [soExcludeFixed]);
// Spaltenweise, FixedRows mitspeichern
SaveGrid(StringGrid, s, [soSaveCols]);
// Spalteweise, FixedRows nicht mitspeichern
SaveGrid(StringGrid, s, [soSaveCols, soExcludeFixed]);
s.Free;
end;
Mit diesem Test-Code würde dasselbe StringGrid auf vier verschiedene Arten hintereinander in dieselbe Datei geschrieben.
Grüße vom marabu