Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#4

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 04:28
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;

Geändert von Popov (25. Apr 2014 um 04:43 Uhr)
  Mit Zitat antworten Zitat