| Autor |
Beitrag |
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.03.09 21:00
Wenn nix gefunden wird, dann ersetzt StringReplace natürlich auch nix, deshalb kannst du dir das Pos vorher schenken, es ist nur unnötig mehr Aufwand.
Trotzdem sollte es vom Ergebnis her keinen Unterschied machen.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 11.03.09 21:23
Das Pos macht insofern einen Unterschied, dass nichts auf die Platte geschrieben werden muss, wenn nichts geändert wurde.
Die Schleife kannst du dir übrigens sparen. Ersetzen kannst du die gesamte Liste über IniFile.Text := StringReplace(IniFile.Text, Antwort, New, [rfReplaceAll]);.
|
|
tif
      
Beiträge: 46
Erhaltene Danke: 1
Winxxx
TP, BP, Delphi 1 - 2009
|
Verfasst: Do 12.03.09 06:43
Hallo
obwohl die Lösung von Delphifan sicherlich die schickste ist, nochmal mein Senf zur Eingangsfrage
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; |
Das erste was mir auffällt ist diese Zeile
Delphi-Quelltext 1:
| for i:=0 to inifile.count do |
Das ist der Standard Delphi - Listenfehler, diese Schleife läuft nie zu Ende durch sondern schmeißt im letzten Durchlauf eine Exception. Hier war ja schon mal von einer EListIndexOutOfBounds die Rede.
Jedenfalls, solche Schleifen müssen immer nur bis count-1 laufen.
Dann, aber das wurde auch schon gesagt, wird BEI JEDEM TREFFER die bis dahin bearbeitete Stringliste gespeichert
Delphi-Quelltext 1: 2: 3: 4: 5:
| if pos(antwort, inifile[i]) >0 then begin inifile[i]:=StringReplace(inifile[i], antwort, new, [rfReplaceAll]); inifile.SaveToFile(Unit2.Dateipfad); end; |
Das müßte zwar klappen, weil in Inifile ja schon die gesamte Liste 'drin ist. Wird eben mehrfach gespeichert bei jedem Treffer.
Schöner und performanter wäre aber erst bearbeiten, dann speichern.
Vorschlag
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var inifile : TStringlist; begin inifile:=TStringList.Create; Inifile.loadfromfile(Unit2.Dateipfad); for i:=0 to inifile.count - 1 do inifile[i]:=StringReplace(inifile[i], antwort, new, [rfReplaceAll]);
inifile.SaveToFile(Unit2.Dateipfad); end; |
Oder eben
Delphi-Quelltext 1:
| IniFile.Text := StringReplace(IniFile.Text, Antwort, New, [rfReplaceAll]);. |
Der gefällt mir sehr gut.
Viel Erfolg.
Tino
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 12.03.09 06:46
Wobei da aber immer noch das Problem ist, dass jedes Vorkommen des Textes einfach überall ersetzt wird. Auch wenn das nur ein Teil eines Wortes ist (zum Beispiel).
Sinnvoller wäre eigentlich wirklich eher nur Werte oder Namen von Werten etc. zu überprüfen, je nach Wunsch.
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Do 12.03.09 16:08
@tif
genauso sieht mein code im moment aus(pos geht jetzt). gibt es vll eine alternative zu stringreplace? (könnte ja sein dass es dann klappt)
mfg
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Do 12.03.09 18:28
inifile[i], Unit2.Dateipfad 
|
|
tif
      
Beiträge: 46
Erhaltene Danke: 1
Winxxx
TP, BP, Delphi 1 - 2009
|
Verfasst: Fr 13.03.09 05:52
Hallo,
kannst du ein Beispiel posten, was steht in der ini und was soll ersetzt werden ?
Macht der code gar nichts, oder ist das ini file zum schluß z.B. leer ?
Wie wird das ganze aufgerufen, also wo wird z.B. antwort und new gesetzt ? Steht da wirklich das richtige drin?
Wie ist das mit [rpIgnoreCase] (ich meine, in der deutschen Delphi - Hilfe ist das gerade verkehrt beschrieben) ?
StringReplace sollte schon funktionieren.
Hast du mal debuggt ? Steht in inifile[i] das erwartete, wenn die Schleife durchlaufen wird?
Was heißt 'Pos funtioniert jetzt' ?
Viel Erfolg
Tino
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Fr 13.03.09 15:08
in der ini steht genau das gleiche wie vorher...der code sollte soweit richtig sein, denn fast der selbe code funzt bei txt dateien wunderbar.
es liegt entweder am stringreplace oder am savtofile. habt ihr vll eine ahnung wie ich die stringlist auch anders in der ini speichern kann (ohne section angabe o. ä.)?
mfg
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Fr 13.03.09 15:14
the-kecks hat folgendes geschrieben : | | in der ini steht genau das gleiche wie vorher...der code sollte soweit richtig sein, denn fast der selbe code funzt bei txt dateien wunderbar. |
Du meinst, es liegt am Aufbau einer INI-Datei? Oder an der Dateiendung? Eine INI-Datei ist doch eigentlich eine Textdatei, eben mit einer erweitert definierten Syntax. Wie oben schon einmal geschrieben: Erstelle eine einfache Textdatei, und füge langsam Sections oder andere INI-speziefische Elemente hinzu, bis deine Methode fehlschlägt. Ich kann mir aber nicht vorstellen, wo da das Problem sein sollte.
the-kecks hat folgendes geschrieben : | | es liegt entweder am stringreplace oder am savtofile. |
Ob es am SaveToFile liegt, lässt sich ganz einfach herausfinden: Lasse dir den Inhalt von IniFile.Text ausgeben. Stimmt das auch nicht, liegt es nicht am Speichern.
(Also, ich verstehe das schon noch richtig - du verwendest immernoch TStringList, oder?)
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: Fr 13.03.09 16:08
ja ic hverwende noch tstringlist. werde das mal ausprobieren mit aufbau der sections usw.
muss jetzt aber leider bis morgen weg. werde dann morgen meine ergebnisse posten
mfg
|
|
the-kecks 
      
Beiträge: 157
Erhaltene Danke: 1
Windows Vista Home Premium 64Bit
Delphi 7 Ent.
|
Verfasst: So 15.03.09 17:20
sry, dass ich erst so spät schreibe...war gestern so müde (habe kaum geschlafen)
nunja...ich weiß jetzt wo der fehler lag. es hing nicht mit dem code im allgemeinen zusammen sondern mit einer vorhergehenden konstruktion in meinem programm -.-
also der code der hier gepostet wurde funzt einwandfrei! Wer einmal das gleiche problem haben sollte dem würde ich den code von tif empfehlen
danke an alle!
edit:
bevor ich einen neuen thread aufmachen muss: Ich habe da noch einen bug gefunden. Sobald eine txt/ini datei in meinem porgamm mehr als 1kb groß ist wird kein suchwort mehr gefunden - hat sich auch erledigt!
mfg
|
|