Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Stringgrid in INI file schreiben (https://www.delphipraxis.net/180136-stringgrid-ini-file-schreiben.html)

rhodan 25. Apr 2014 00:58

Stringgrid in INI file schreiben
 
Hallo allerseits!

ich benutze folgende herangehensweise um meine INI file einzulesen ins Stringgrid:

Delphi-Quellcode:
Procedure InitGridFromINI(StrGrid:TStringGrid; Const Section:String; GridINI:TIniFile);
Var X:Integer;
Begin
  With StrGrid Do
  Begin
    RowCount:=GridINI.ReadInteger(Section, 'RowCount', 0)+1;
    ColCount:=GridINI.ReadInteger(Section, 'ColCount', 0);
    For X:=1 To RowCount-1 Do
      Cells[0, X]:=GridINI.ReadString(Section, 'TitleY'+IntToStr(X), '');
    For X:=1 To ColCount Do
    Begin
      Cells[X-1, 0]:=GridINI.ReadString(Section, 'TitleX'+IntToStr(X), '');
      ColWidths[X-1]:=GridINI.ReadInteger(Section, 'ColW'+IntToStr(X), DefaultColWidth)
    End
  End
End;
allerdings stosse ich auf fehlermeldungen wenn ich auf dieselbe weise versuche aus dem Stringgrid in die INI file zu schreiben...
Delphi-Quellcode:
Cells[0, X]:=GridINI.WriteString(Section, 'TitleY'+IntToStr(X), '');
-> [DCC Fehler] source.pas(39): E2010 Inkompatible Typen: 'Integer' und 'string'

offensichtlich reicht es nicht ReadString in Writestring zu ändern...was mache ich falsch bzw. auf welche art schreibe ich die daten in die ini?
ich hab mal gegoogelt aber primär zum lesen aus ini files gefunden, nicht zum schreiben aus dem stringgrid..

wäre dankbar für nen tip!

LG aus Hamburg
Rhodan

Sir Rufo 25. Apr 2014 01:06

AW: Stringgrid in INI file schreiben
 
Tip: Ein Blick in die Dokumentation werfen Delphi-Referenz durchsuchenTIniFile.ReadString und Delphi-Referenz durchsuchenTIniFile.WriteString.
Was fällt dir auf?

Zum Schreiben einer Ini-Datei aus einem StringGrid wirst du auch nicht viel finden. Wenn es dazu Einträge geben würde, dann auch zu jeder anderen beliebigen Komponente, die aber alle das Gleiche aussagen würden:

Was interessiert sich die Ini-Datei dafür wo die Daten zum Schreiben herkommen?
Ein String ist und bleibt ein String, egal ob von einem Edit, StringGrid, ... oder wie auch immer Komponente.
(Mir ist auf jeden Fall noch kein spezieller StringGridString vor die Füße gefallen)

nuclearping 25. Apr 2014 03:00

AW: Stringgrid in INI file schreiben
 
Das was du da versuchst ergibt keinen Sinn.

Zitat:

Zitat von rhodan (Beitrag 1256870)
Delphi-Quellcode:
Cells[0, X]:=GridINI.WriteString(Section, 'TitleY'+IntToStr(X), '');

Du versuchst hier,
Delphi-Quellcode:
Cells[0, X]
den Rückgabewert von
Delphi-Quellcode:
GridINI.WriteString
zuzuweisen. Hä? :mrgreen:

Wenn dann eher so:
Delphi-Quellcode:
GridINI.WriteString(Section, 'TitleY'+IntToStr(X), Cells[0, X]);
Du willst ja den Inhalt von
Delphi-Quellcode:
Cells[0, X]
in die Ini schreiben, daher muss der dritte Parameter für
Delphi-Quellcode:
TIniFile.WriteString
auch
Delphi-Quellcode:
Cells[0, X]
sein. Und
Delphi-Quellcode:
TIniFile.WriteString
ist eine Prozedur, also dh da gibts auch keinen Rückgabewert.

Popov 25. Apr 2014 04:28

AW: Stringgrid in INI file schreiben
 
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;

Dejan Vu 25. Apr 2014 07:42

AW: Stringgrid in INI file schreiben
 
Oder:
TClientDataSet => TDataSource => TDBGrid
Die Daten stehen dann nicht im TStringGrid, sondern im TClientDataSet, wo sie vielleicht besser hingehören.
Laden/Speichern über das TClientDataSet, und zwar mit einem Aufruf. Ist zwar nicht eine INI-Datei, aber dafür sind die INI-Teile ja auch nicht gedacht.

rhodan 25. Apr 2014 23:16

AW: Stringgrid in INI file schreiben
 
hallo!

danke für die hilfe euch allen!
und danke dir popov für deine mühe! ich wette du hast das wie ich dich kenne bei nem Käffchen und nem keks so nebenbei aus dem ärmel geschüttelt ;D

2 fragen habe ich noch...lesen/schreiben funktioniert dank deiner hilfe einwandfrei...ich nutze diesen code nun um während der laufzeit neue columns hinzuzufügen:
Delphi-Quellcode:
var
 Column: Integer;
 NewColumn: Integer;
begin
  StrGrid.ColCount := StrGrid.ColCount + 1;
  for Column := StrGrid.ColCount - 1 downto NewColumn do
    StrGrid.Cols[Column].Assign(StrGrid.Cols[Column - 1]);
  StrGrid.Cols[NewColumn - 1].Text := '';
end;
das klappt auch super..nur wenn ich das programm neu starte und es sind z.bsp zu beginn nur 2 columns da, in der ini aber 7 gespeichert wird nicht alles eingelesen...ich kriege es nicht gebacken beim lesevorgang automatisch so viele columns zu erzeugen wie in der INI stehen so das alle infos eingelesen werden...

2. frage...wenn ich öfter abspeichere und einlese hab ich die erfahrung gemacht das sich "müll" bzw leere zeilen in der ini sammeln, wäre es nicht sinnvoll vor dem schreibvorgang die ini zu leeren/löschen damit sie auf dem aktuellen stand ist? steh da vor dem berg.

danke für eure anteilnahme..auch wenn ich mich freue wenn mir geholfen wird, ich versuche jedesmal daraus zu lernen...dankeschön :)

Sir Rufo 25. Apr 2014 23:25

AW: Stringgrid in INI file schreiben
 
Du kannst einfach die gesamte Section in der Ini vor dem Speichern entfernen. Dann gibt es die nicht mehr und ist also komplett leer.

Speicherst du denn nicht die Anzahl der Spalten und Zeilen in der Ini?
Auslesen, setzen und dann die Zellwerte eintragen.

rhodan 25. Apr 2014 23:35

AW: Stringgrid in INI file schreiben
 
danke sir rufo!
Delphi-Quellcode:
var
 Ini: TIniFile;
begin
 ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
ini.EraseSection('sel');
 ini.Free;
end;
damit habe ich eine saubere inifile for dem speichern, aber ich kriegs nicht hin beim einlesen die anzahl der columns in der ini file in der runtime zu erzeugen :S

Sir Rufo 25. Apr 2014 23:38

AW: Stringgrid in INI file schreiben
 
Wenn du es einrichten könntest deinen aktuellen Code zum Speichern und Laden zu zeigen, dann könnte ich auch konkret antworten. ;)

rhodan 25. Apr 2014 23:53

AW: Stringgrid in INI file schreiben
 
popovs code funktioniert schon sauber.^^ hab ich quasi übernommen

lesen:
Delphi-Quellcode:
procedure TForm2.btnreadClick(Sender: TObject);
var
  x, y: Integer;
  IniFile: String;
  Ini: TIniFile;
begin
  IniFile := ChangeFileExt(ParamStr(0), '.ini');
  with strgrid do
  begin
      ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
    try
      for x := 0 to ColCount do
      strgrid.
        Cols[x].CommaText := Ini.ReadString('Sel', IntToStr(x), '');
    finally
      Ini.Free;
    end;
  end;
end;
schreiben:
Delphi-Quellcode:
procedure TForm2.btnwriteClick(Sender: TObject);
var
  x, y: Integer;
  IniFile: String;
  Ini: TIniFile;
begin
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
ini.EraseSection('sel');
 ini.Free;
  with strgrid do
  begin
    ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
    try
      for x := 0 to ColCount do
        Ini.WriteString('Sel', IntToStr(x), Cols[x].CommaText);
    finally
      Ini.Free;
    end;
 end;
end;
columns zur runtime erzeugen:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
 Column: Integer;
 NewColumn: Integer;
begin
  StrGrid.ColCount := StrGrid.ColCount + 1;
  for Column := StrGrid.ColCount - 1 downto NewColumn do
    StrGrid.Cols[Column].Assign(StrGrid.Cols[Column - 1]);
  StrGrid.Cols[NewColumn - 1].Text := '';
end;

wobei mir auffällt das in der ini immer EINE column mehr erzeugt wird bzw abgespeichert wird als tatsächlich existieren..also wenn ich 3 in der runtime habe und speichere wird in der ini eine vierte erzeugt "4=,," die leer ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz