Autor |
Beitrag |
the-kecks
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 18:17
hi,
ich habe mit meinem programm ein ini file in eine stringlist geladen (ganz)
dann suche ich einen wert aus der stringlist mit pos() und ersetze ihn ggf. durch einen anderen...dann möchte ich die stringlist mit dem ersetzten wert per mystringlist.SaveToFile('C:\test.ini'); wieder in der ini datei speichern. das funzt aber net so ganz
wisst ihr wie ich die ganze ini datei mit der stringlist überschreibe? (bei txt files klappt das ja wunderbar)
mfg
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.03.09 18:24
Das sollte eigentlich so gehen, nur ein fester Pfad oder relative Pfadangaben (ohne Pfad) sind natürlich böse.
Wie sieht der Code denn in Wirklichkeit bei dir aus, vor allem was die Pfadangabe angeht?
Außerdem: Wozu eine StringList, einen Wert ändern geht mit TIniFile doch sehr sehr viel einfacher.
|
|
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Mi 11.03.09 18:48
Was genau meinst du mit "geht nicht ganz"? Dir fehlen die Schlüssel, richtig?
Also statt:
blabla="wert"
steht nur
"wert"
in der .ini?
Du kannst IniFiles auch mit der Unit Inifiles schreiben, prinzipiell ähnlich wie du in die Registry schreibst. Sollte in deinem Fall sauberer sein und das beschriebene Problem als Nebeneffekt beheben.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 18:59
1. ich arbeite mit absoluten pfaden (vorher aus einem ShellListview rausgesucht)
2. bei mir speichert es nichts...
mein code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var inifile : TStringlist; begin inifile:=TStringList.Create; Inifile.loadfromfile(Unit2.Dateipfad); for i:=0 to inifile.count do if pos(antwort, inifile[i]) >0 then begin inifile[i]:=StringReplace(inifile[i], antwort, new, [rfReplaceAll]); inifile.SaveToFile(Unit2.Dateipfad); end; end; end; |
mfg
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Mi 11.03.09 19:06
Hast du Groß-/Kleinschreibung bedacht? Ggf. mit LowerCase umwandeln.
Prüf doch mal, ob er den String wirklich findet, ob er also überhaupt etwas ersetzt und speichert.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 19:33
groß-/kleinschreibung ist net wichtig...ggf. kann man ja bei stringreplace(inifile[i], 'bla', 'bla2', [rfIgnoreCase]); einsetzen
PS: der findet das suchwort nur dann wenn es das letzte wort der datei ist...
mfg
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 11.03.09 19:38
Moin!
Du solltest die Stringliste erst speichern, wenn die Schleife ganz durchgelaufen ist.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Mi 11.03.09 19:49
Zitat: | groß-/kleinschreibung ist net wichtig... |
Doch, laut deinem Source schon. Pos ist case sensitive.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 19:52
ja aber ich habe groß-/kleinschr. beachtet. werde es dann wenn das prob gelöst ist lowercase einfügen.
mfg
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 11.03.09 20:06
TIniFile löscht aber keine Einträge, wenn man das nicht explizit befiehlt. Wäre es nicht besser, eine einfache TStringlist zu nehmen und die einfach nur als Ini abzuspeichern (wenn es denn unbedingt Ini sein muss)?
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 20:08
@DeddyH
genau das tue ich doch -.-
edit:
@Narses
geht leider auch nicht
mfg
Zuletzt bearbeitet von the-kecks am Mi 11.03.09 20:16, insgesamt 2-mal bearbeitet
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 11.03.09 20:16
 Was ich auch immer lese
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 11.03.09 20:20
Hallo,
Fall du nicht mit Sections arbeitest, wirst du spätestens mit denen Probleme bekommen, solange du mit StringLists.
DeddyH hat folgendes geschrieben : | TIniFile löscht aber keine Einträge, wenn man das nicht explizit befiehlt. |
Das ist doch ein Vorteil der IniFile, oder?
DeddyH hat folgendes geschrieben : | Wäre es nicht besser, eine einfache TStringlist zu nehmen und die einfach nur als Ini abzuspeichern |
Na, was jetzt - ich dachte, die IniFile wäre besser?
Ich bin unbedingt der Meinung, dass eine IniFile die bessere Wahl wäre. Den Code könntest du im Großen und ganzen so lassen - wahrscheinlich musst du nur eine zweite Schleife für die Sections einfügen.
Probier's doch wenigstens mal!
Grüße,
Yogu
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 20:23
habs schon probiert...bin gescheitert
außerdem soll mein programm jede x-belibige ini durchsuchen...nach einem wort ohne angabe der section oder so und da bietet sich pos nunmal an.
hat denn jmd eine idee wieso ich net speichern kann?
mfg
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 11.03.09 20:24
the-kecks hat folgendes geschrieben: | wisst ihr wie ich die ganze ini datei mit der stringlist überschreibe? |
Von daher war ich der Meinung, dass TIniFile für sein Anliegen nicht das Mittel der Wahl ist.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 11.03.09 20:37
Hmm, wenn du wirklich willst, dass sowohl Sections als auch Namen wie natürlich die Werte durchsucht und ersetzt werden, ist die StringList geeigneter.
Zum Debugging: Ist der Vergleich überhaupt einmal wahr? Wird der Text entsprechend geändert? Wie sieht die IniFile.Text aus? Ist es wirklich erwünscht, dass du nach jeder Ersetzung neu speicherst? (Das wird jetzt wohl nicht der Fehler sein, ist aber trotzdem sehr wahrscheinlich ein riesiger Performancefresser).
DeddyH hat folgendes geschrieben : | the-kecks hat folgendes geschrieben: | wisst ihr wie ich die ganze ini datei mit der stringlist überschreibe? |
Von daher war ich der Meinung, dass TIniFile für sein Anliegen nicht das Mittel der Wahl ist. |
Was heißt Überschreiben? Eine IniFile bearbeitet die Datei einfach direkt - was für Ersetzungen perfekt ist. Die veränderten Werte werden überschrieben, die anderen so gelassen, wie sie sind. Nichts anderes macht the-kecks' Code.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 20:54
Yogu hat folgendes geschrieben : | Hmm, wenn du wirklich willst, dass sowohl Sections als auch Namen wie natürlich die Werte durchsucht und ersetzt werden, ist die StringList geeigneter.
Zum Debugging: Ist der Vergleich überhaupt einmal wahr? Wird der Text entsprechend geändert? Wie sieht die IniFile.Text aus? Ist es wirklich erwünscht, dass du nach jeder Ersetzung neu speicherst? (Das wird jetzt wohl nicht der Fehler sein, ist aber trotzdem sehr wahrscheinlich ein riesiger Performancefresser). |
also ich ahbe ja schon geschrieben, das einzige was er findet wenn ich danach suche ist der letzte wert also:
[bla1]
blub=blub2
[bla2]
bluuub=bluuub2
bluuuub=diesesWortWirdGefunden
beim rest findet er nix...also wie kann ich die ini datei so laden dass der alle werte in allen sections nach dem wort duruchsucht ung ggf. durch ein anders (in einem editfeld eingebenes) wort ersetzt?
beim bisheriger code steht ja oben...
mit txt dateien funzt es mit dem gleichen code (also auch in stringlist geladen) wunderbar
PS: das mit dem abspeichern hab ich schon aus der schleife genommen das macht der dann als letztes
mfg
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 11.03.09 20:54
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 11.03.09 21:06
DeddyH hat folgendes geschrieben : | Lies mal richtig. |
Meinst du die fehlende EListIndexOutOfBounds?
Sonst würde ich sagen: Wag dich mal von einer Textdatei langsam an eine Ini-artige an, und schaue, wo der Fehler liegt. Und noch was: Lass mal das Pos weg und ersetze nur, das ist zwar langsamer aber der Fehler könnte im Pos liegen.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Mi 11.03.09 21:54
wie soll ich das denn ohne pos machen? dann kann ich doch gar net in der stringlist suchen...
edit: hab mal ein bissle rumprobiert und es liegt an pos() -.-
wie soll ich das wort jetzt suchen?
mfg
Zuletzt bearbeitet von the-kecks am Mi 11.03.09 22:03, insgesamt 1-mal bearbeitet
|
|