Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur in Funktion umwandeln? (https://www.delphipraxis.net/39843-prozedur-funktion-umwandeln.html)

Opa Knack 8. Feb 2005 11:31


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:
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;
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:

Delphi-Quellcode:
for i := 0 to (Memo1.Lines.Count - 1) do
  FileReplaceString(Memo1.Lines[i],'Text 1','Text 2');
Auch das klappt noch.

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

toms 8. Feb 2005 11:58

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.

Minz 8. Feb 2005 12:37

Re: Prozedur in Funktion umwandeln?
 
Du könntest es auch als Prozedur lassen und mit

Delphi-Quellcode:
procedure FileReplaceString(const FileName, searchstring, replacestring: string; var anzahl: integer);
und innerhalb der Prozedur kannst du anzahl hochzählen.

Sharky 8. Feb 2005 12:43

Re: Prozedur in Funktion umwandeln?
 
Zitat:

Zitat von Minz
Du könntest es auch als Prozedur lassen und mit....

Hai Minz,

das Problem ist ja das StringReplace in seiner Procedure ihm nicht sagt wie oft der String in der Datei ersetzt wurde.

Opa Knack 8. Feb 2005 12:58

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

Minz 8. Feb 2005 14:29

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.

Binärbaum 9. Feb 2005 04:11

Re: Prozedur in Funktion umwandeln?
 
Zitat:

Zitat von Minz
Dann müsstest du deine Prozedur allerdings so umschreiben, dass StringReplace so oft durchgeführt wird, bis der alte Text nicht mehr gefunden wird.

Dann kann man sich doch gleich eine eigene Funktion oder Prozedur schreiben, die die Funktionalität von StringReplace ersetzt und dabei zählt, wie oft eine Ersetzung durchgeführt wurde.

MfG
Binärbaum

toms 9. Feb 2005 05:24

Re: Prozedur in Funktion umwandeln?
 
Zitat:

Zitat von Binärbaum
Dann kann man sich doch gleich eine eigene Funktion oder Prozedur schreiben, die die Funktionalität von StringReplace ersetzt und dabei zählt, wie oft eine Ersetzung durchgeführt wurde.

Genau!

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 20:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz