![]() |
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 |
AW: Stringgrid in INI file schreiben
Warum speicherst du in der Ini nicht (mehr) die Informationen von Zeilen- und Spaltenanzahl?
Das würde doch ungemein helfen, oder? Und das
Delphi-Quellcode:
kannst du direkt vor die
ini.EraseSection
Delphi-Quellcode:
-Schleife setzen.
for
Ach ja, 4 Spalten von 0 an gezählt gehen von 0 bis 3 ;) |
AW: Stringgrid in INI file schreiben
Delphi-Quellcode:
Nicht groß geprüft, sollte aber funktionieren.
const
IniSelRC = 'Sel3'; 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 //Löscht den alten Inhalt Ini.EraseSection(IniSelRC); k := 0; for x := 0 to ColCount - 1 do for y := 0 to RowCount - 1 do begin Inc(k); Ini.WriteString(IniSelRC, 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] := ''; ColCount := 0; RowCount := 0; Ini := TIniFile.Create(IniFile); try sl := TStringList.Create; try Ini.ReadSection(IniSelRC, sl); for k := 0 to sl.Count - 1 do begin s := Ini.ReadString(IniSelRC, 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)); //Fügt Splaten und Zeilen bei Bedarf if ColCount < (StrToInt(xs) + 1) then ColCount := StrToInt(xs) + 1; if RowCount < (StrToInt(ys) + 1) then RowCount := StrToInt(ys) + 1; //Fügt Fixed-Stalten und -Zeilen bei Bedarf if (ColCount> 1) and (FixedCols = 0) then FixedCols := 1; if (RowCount > 1) and (FixedRows = 0) then FixedRows := 1; Cells[StrToInt(xs), StrToInt(ys)] := s; end; finally sl.Free; end; {} finally Ini.Free; end; end; end; |
AW: Stringgrid in INI file schreiben
ok..mit dieser änderung hab ichs hinbekommen das keine unnötigen leeren zeilen abgespeichert werden:
Delphi-Quellcode:
hilf mir bitte wie ich beim einlesen die nötigen columns erzeuge..ich kriegs nicht hin :F
begin
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini'); try for x := 2 to ColCount do Ini.WriteString('Sel', IntToStr(x-1), Cols[x-1].CommaText); finally Ini.Free; end; |
AW: Stringgrid in INI file schreiben
Achso, du hast das erste Beispiel genommen.
Ich würde da nicht groß fackeln und eine Extra-Sektion erstellen in der du die Anzahl Cols und Rows speicherst. |
AW: Stringgrid in INI file schreiben
Zitat:
Code:
[Sel]
ColCount=4 RowCount=4 FixedColCount=1 FixedRowCount=1 0=... 1=... 2=... 3=... |
AW: Stringgrid in INI file schreiben
Zitat:
|
AW: Stringgrid in INI file schreiben
Der erste Code könnte so aussehen:
Delphi-Quellcode:
const
IniSelRC = 'Sel1'; IniRowCount = 'RowCount'; IniColCount = 'ColCount'; IniFixedRows = 'FixRows'; IniFixedCols = 'FixCols'; var x, y: Integer; IniFile: String; Ini: TIniFile; begin IniFile := ChangeFileExt(ParamStr(0), '.ini'); with StringGrid1 do begin //Speichern Ini := TIniFile.Create(IniFile); try //Löscht den alten Inhalt Ini.EraseSection(IniSelRC); for x := 0 to ColCount do Ini.WriteString(IniSelRC, IntToStr(x), Cols[x].CommaText); Ini.WriteInteger(IniSelRC, IniRowCount, RowCount); Ini.WriteInteger(IniSelRC, IniColCount, ColCount); Ini.WriteInteger(IniSelRC, IniFixedRows, FixedRows); Ini.WriteInteger(IniSelRC, IniFixedCols, FixedCols); finally Ini.Free; end; //Löschen for x := 0 to ColCount do for y := 0 to RowCount do Cells[x, y] := ''; ColCount := 0; RowCount := 0; //Lesen Ini := TIniFile.Create(IniFile); try RowCount := Ini.ReadInteger(IniSelRC, IniRowCount, RowCount); ColCount := Ini.ReadInteger(IniSelRC, IniColCount, ColCount); FixedRows := Ini.ReadInteger(IniSelRC, IniFixedRows, FixedRows); FixedCols := Ini.ReadInteger(IniSelRC, IniFixedCols, FixedCols); for x := 0 to ColCount do Cols[x].CommaText := Ini.ReadString(IniSelRC, IntToStr(x), ''); finally Ini.Free; end; end; end; |
AW: Stringgrid in INI file schreiben
hab jetzt auf verschiedene weisen rumprobiert aber ich kriege immer ne fehlermeldung...beim lesen aus der ini:
Delphi-Quellcode:
procedure TForm2.btnreadClick(Sender: TObject);
const IniSelRC = 'Sel1'; IniRowCount = 'RowCount'; IniColCount = 'ColCount'; IniFixedRows = 'FixRows'; IniFixedCols = 'FixCols'; var x, y: Integer; IniFile: String; Ini: TIniFile; begin Ini := TIniFile.Create(IniFile); try RowCount := Ini.ReadInteger(IniSelRC, IniRowCount, RowCount); ColCount := Ini.ReadInteger(IniSelRC, IniColCount, ColCount); FixedRows := Ini.ReadInteger(IniSelRC, IniFixedRows, FixedRows); FixedCols := Ini.ReadInteger(IniSelRC, IniFixedCols, FixedCols); for x := 0 to ColCount do Cols[x].CommaText := Ini.ReadString(IniSelRC, IntToStr(x), ''); finally Ini.Free; end; end; end;
Delphi-Quellcode:
kein plan warum er den nicht erkennt :S
[DCC Fehler] source.pas(54): E2003 Undeklarierter Bezeichner: 'RowCount'
|
AW: Stringgrid in INI file schreiben
RowCount ist eine Eigenschaft von StringGrid. Du hast das
Delphi-Quellcode:
vergessen. In meinem Code steht:
With StringGrid1 do
Delphi-Quellcode:
Mit with kann man sich sparen StringGrid1 immer wieder zu schreiben. Ohne with würde das so aussehen:
begin
... with StringGrid1 do begin ... try ... Ini.WriteInteger(IniSelRC, IniRowCount, RowCount);
Delphi-Quellcode:
Das gleiche natürlich auch bei ColCount, Cells usw.
begin
... //with StringGrid1 do begin ... try ... Ini.WriteInteger(IniSelRC, IniRowCount, StringGrid1.RowCount); |
AW: Stringgrid in INI file schreiben
ok habs hinbekommen...schreibmethode:
Delphi-Quellcode:
ini sieht dann so aus:
//schreiben
procedure TForm2.btnwriteClick(Sender: TObject); const IniSelRC = 'Sel1'; IniRowCount = 'RowCount'; IniColCount = 'ColCount'; IniFixedRows = 'FixRows'; IniFixedCols = 'FixCols'; var x, y: Integer; IniFile: String; Ini: TIniFile; begin IniFile := ChangeFileExt(ParamStr(0), '.ini'); with strgrid do begin //Speichern Ini :=TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini'); try //Löscht den alten Inhalt Ini.EraseSection(IniSelRC); for x := 0 to ColCount do Ini.WriteString(IniSelRC, IntToStr(x), Cols[x].CommaText); Ini.WriteInteger(IniSelRC, IniRowCount, RowCount); Ini.WriteInteger(IniSelRC, IniColCount, ColCount); Ini.WriteInteger(IniSelRC, IniFixedRows, FixedRows); Ini.WriteInteger(IniSelRC, IniFixedCols, FixedCols); finally Ini.Free; end; end; end;
Delphi-Quellcode:
lesemethode:
[Sel1]
0=,, 1=,rhodan,10 2=,robin,20 3=,, RowCount=3 ColCount=3 FixRows=1 FixCols=1
Delphi-Quellcode:
passiert leider gar nichts.... hab grad nen blackout....:S
procedure TForm2.btnreadClick(Sender: TObject);
const IniSelRC = 'Sel1'; IniRowCount = 'RowCount'; IniColCount = 'ColCount'; IniFixedRows = 'FixRows'; IniFixedCols = 'FixCols'; var x, y: Integer; IniFile: String; Ini: TIniFile; begin IniFile := ChangeFileExt(ParamStr(0), '.ini'); with strgrid do begin Ini := TIniFile.Create(IniFile); try RowCount := Ini.ReadInteger(IniSelRC, IniRowCount, RowCount); ColCount := Ini.ReadInteger(IniSelRC, IniColCount, ColCount); FixedRows := Ini.ReadInteger(IniSelRC, IniFixedRows, FixedRows); FixedCols := Ini.ReadInteger(IniSelRC, IniFixedCols, FixedCols); for x := 0 to ColCount do Cols[x].CommaText := Ini.ReadString(IniSelRC, IntToStr(x), ''); finally Ini.Free; end; end; end; schreiben funktioniert..aber lesen nicht |
AW: Stringgrid in INI file schreiben
Delphi-Quellcode:
//schreiben
... begin IniFile := ChangeFileExt(ParamStr(0), '.ini'); //IniFile ist ein String mit dem IniPfad with strgrid do ... Ini :=TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini'); //hier hast du einen eigenen Pfad try ... end;
Delphi-Quellcode:
Du gibst verschiedene Pfade an, deshalb schreibt er in eine Ini und liest aus einer anderen.
//lesen
... begin IniFile := ChangeFileExt(ParamStr(0), '.ini'); //IniFile ist ein String mit dem IniPfad with strgrid do .. Ini := TIniFile.Create(IniFile); //hier benutzt du den String IniFile für dern Pfad try ... Das ist auch der Grund wieso man den Ini-Pfad, wenn man es auf verschiedene Prozeduren verteilt, am besten immer in eine Funktion packt. Dann kann man sich nicht verschreiben. Zum Beispiel so:
Delphi-Quellcode:
function IniFile: String
begin Result := ChangeFileExt(ParamStr(0), '.ini'); end; |
AW: Stringgrid in INI file schreiben
ahh....das hatte ich übersehen...danke!!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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