![]() |
Stringgrid in INI file schreiben
Hallo allerseits!
ich benutze folgende herangehensweise um meine INI file einzulesen ins Stringgrid:
Delphi-Quellcode:
allerdings stosse ich auf fehlermeldungen wenn ich auf dieselbe weise versuche aus dem Stringgrid in die INI file zu schreiben...
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;
Delphi-Quellcode:
-> [DCC Fehler] source.pas(39): E2010 Inkompatible Typen: 'Integer' und 'string'
Cells[0, X]:=GridINI.WriteString(Section, 'TitleY'+IntToStr(X), '');
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 |
AW: Stringgrid in INI file schreiben
Tip: Ein Blick in die Dokumentation werfen
![]() ![]() 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) |
AW: Stringgrid in INI file schreiben
Das was du da versuchst ergibt keinen Sinn.
Zitat:
Delphi-Quellcode:
den Rückgabewert von
Cells[0, X]
Delphi-Quellcode:
zuzuweisen. Hä? :mrgreen:
GridINI.WriteString
Wenn dann eher so:
Delphi-Quellcode:
Du willst ja den Inhalt von
GridINI.WriteString(Section, 'TitleY'+IntToStr(X), Cells[0, X]);
Delphi-Quellcode:
in die Ini schreiben, daher muss der dritte Parameter für
Cells[0, X]
Delphi-Quellcode:
auch
TIniFile.WriteString
Delphi-Quellcode:
sein. Und
Cells[0, X]
Delphi-Quellcode:
ist eine Prozedur, also dh da gibts auch keinen Rückgabewert.
TIniFile.WriteString
|
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:
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.
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; 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; |
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. |
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:
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...
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; 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 :) |
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. |
AW: Stringgrid in INI file schreiben
danke sir rufo!
Delphi-Quellcode:
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
var
Ini: TIniFile; begin ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini'); ini.EraseSection('sel'); ini.Free; end; |
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. ;)
|
AW: Stringgrid in INI file schreiben
popovs code funktioniert schon sauber.^^ hab ich quasi übernommen
lesen:
Delphi-Quellcode:
schreiben:
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;
Delphi-Quellcode:
columns zur runtime erzeugen:
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;
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 01:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz