![]() |
Prozedur in Funktion umwandeln?
Hallo,
ich möchte mit folgendem Code mehrere Dateien nach einem Suchstring durchforsten und bei Vorhandensein eben diesen ersetzen:
Delphi-Quellcode:
Das klappt auch sehr gut. Jetzt habe ich nur ein Problem: Ich spreche diese Prozedur mit einer Schleife an, die alle in einem Memofeld vorhandenen Dateinamen abklappert:
procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var fs: TFileStream; S: string; begin fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone); try SetLength(S, fs.Size); fs.ReadBuffer(S[1], fs.Size); finally fs.Free; end; S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]); fs := TFileStream.Create(FileName, fmCreate); try fs.WriteBuffer(S[1], Length(S)); finally fs.Free; end; end;
Delphi-Quellcode:
Auch das klappt noch.
for i := 0 to (Memo1.Lines.Count - 1) do
FileReplaceString(Memo1.Lines[i],'Text 1','Text 2'); Nun möchte ich aber nach Abhandlung dieser Schleife erfahren, wie häufig ein Ersetzen durchgeführt wurde, und wie häufig der Text nicht gefunden wurde. Und genau da bin ich mit meinem Latein am Ende. Da die Prozedur keine Funktion ist und ich keinen Rückgabewert erhalte, wird's nicht unbedingt einfacher, und ich habe im Moment keine Ahnung, wie ich daraus eine Funktion machen könnte. Kann mir jemand einen Tipp geben? Danke Opa |
Re: Prozedur in Funktion umwandeln?
Du müsstest zuerst mal eine StringReplace() Routine nehmen, welche die Anzahl ersetzten Strings zurückgibt. Dann ist der Rest nicht mehr schwierig.
|
Re: Prozedur in Funktion umwandeln?
Du könntest es auch als Prozedur lassen und mit
Delphi-Quellcode:
und innerhalb der Prozedur kannst du anzahl hochzählen.
procedure FileReplaceString(const FileName, searchstring, replacestring: string; var anzahl: integer);
|
Re: Prozedur in Funktion umwandeln?
Zitat:
das Problem ist ja das StringReplace in seiner Procedure ihm nicht sagt wie oft der String in der Datei ersetzt wurde. |
Re: Prozedur in Funktion umwandeln?
Hallo,
ich habe mir auch schon gedacht, dass ich einfach in der Prozedur hochzähle, nur komme ich nicht dahinter, wo ich das dann einbinden sollte. Ich bekomme entweder zurückgeliefert, wie häufig die Prozedur aufgerufen wurde, oder irgendwelche Werte, mit denen ich überhaupt nichts anfangen kann. An welcher Stelle könnte ich das denn einbinden? Danke Opa |
Re: Prozedur in Funktion umwandeln?
achso sorry, hab ich überlesen,
also du könntest den Flag rfReplaceAll weglassen. Dann müsstest du deine Prozedur allerdings so umschreiben, dass StringReplace so oft durchgeführt wird, bis der alte Text nicht mehr gefunden wird. Obwohl dann könntest du bei der Gelegenheit auch eine Funktion draus machen. |
Re: Prozedur in Funktion umwandeln?
Zitat:
MfG Binärbaum |
Re: Prozedur in Funktion umwandeln?
Zitat:
Delphi-Quellcode:
function ReplaceStr(s, OldSubStr, NewSubStr: string; var Count: Integer): string;
var i: integer; OldSubLen, TotalLength: integer; begin Result := ''; Count := 0; if s <> '' then begin OldSubLen := Length(OldSubStr); TotalLength := Length(s); i := 1; while i <= TotalLength do begin if (i <= TotalLength - OldSubLen) and (Copy(s, i, OldSubLen) = OldSubStr) then begin Inc(Count); Result := Result + NewSubStr; Inc(i, OldSubLen); end else begin Result := Result + s[i]; Inc(i); end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 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 by Thomas Breitkreuz