AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Prozedur in Funktion umwandeln?

Ein Thema von Opa Knack · begonnen am 8. Feb 2005 · letzter Beitrag vom 9. Feb 2005
Antwort Antwort
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 11:31
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 11:58
Du müsstest zuerst mal eine StringReplace() Routine nehmen, welche die Anzahl ersetzten Strings zurückgibt. Dann ist der Rest nicht mehr schwierig.
Thomas
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#3

Re: Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 12:37
Du könntest es auch als Prozedur lassen und mit

procedure FileReplaceString(const FileName, searchstring, replacestring: string; var anzahl: integer); und innerhalb der Prozedur kannst du anzahl hochzählen.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 12:43
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#5

Re: Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 12:58
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
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#6

Re: Prozedur in Funktion umwandeln?

  Alt 8. Feb 2005, 14:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Prozedur in Funktion umwandeln?

  Alt 9. Feb 2005, 04:11
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: Prozedur in Funktion umwandeln?

  Alt 9. Feb 2005, 05:24
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;
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 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