Solange das StringGrid nur paar Daten enthällt, also nicht zu groß ist, kann man das so lösen:
Delphi-Quellcode:
var
x, y: Integer;
IniFile: String;
Ini: TIniFile;
begin
IniFile := ChangeFileExt(ParamStr(0), '.ini');
with StringGrid1 do
begin
//Speichern
Ini := TIniFile.Create(IniFile);
try
for x := 0 to ColCount do
Ini.WriteString('Sel', IntToStr(x), Cols[x].CommaText);
finally
Ini.Free;
end;
//Löschen
for x := 0 to ColCount do
for y := 0 to RowCount do
Cells[x, y] := '';
//Lesen
Ini := TIniFile.Create(IniFile);
try
for x := 0 to ColCount do
Cols[x].CommaText := Ini.ReadString('Sel', IntToStr(x), '');
finally
Ini.Free;
end;
end;
end;
Rows und Cols sind StringLists, somit kann man leicht CommaText als einzelnen String speichern. In dem Beispiel werden Cols gespeichert, man kann aber auch Rows speichern.
Das Problem ist, dass die Zeilenlänge nur knapp über 2000 Zeichen lang sein kann, danach wird sie umbrochen, womit es dann beim Einlesen wieder Probleme gibt. Wenn die Summe alle Zellen einer Spalte aber darunter bleibt, sollte das kein Problem bilden.
//EDIT:
Oder man macht es pro Zelle:
Delphi-Quellcode:
var
x, y, k: Integer;
IniFile, s, xs, ys: String;
sl: TStringList;
Ini: TIniFile;
begin
IniFile := ChangeFileExt(ParamStr(0), '.ini');
with StringGrid1 do
begin
Ini := TIniFile.Create(IniFile);
try
k := 0;
for x := 0 to ColCount do
for y := 0 to RowCount do
begin
Inc(k);
Ini.WriteString('Sel2', IntToStr(k), Format('%d:%d:%s', [x, y, Cells[x, y]]));
end;
finally
Ini.Free;
end;
for x := 0 to ColCount do
for y := 0 to RowCount do
Cells[x, y] := '';
Ini := TIniFile.Create(IniFile);
try
sl := TStringList.Create;
try
Ini.ReadSection('Sel2', sl);
for k := 0 to sl.Count - 1 do
begin
s := Ini.ReadString('Sel2', sl[k], '');
xs := System.Copy(s, 1, Pos(':', s) - 1);
System.Delete(s, 1, Pos(':', s));
ys := System.Copy(s, 1, Pos(':', s) - 1);
System.Delete(s, 1, Pos(':', s));
Cells[StrToInt(xs), StrToInt(ys)] := s;
end;
finally
sl.Free;
end; {}
finally
Ini.Free;
end;
end;
end;