Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Text ersetzen (https://www.delphipraxis.net/96589-text-ersetzen.html)

axmarq 27. Jul 2007 07:40


Text ersetzen
 
Hallo,

ich möchte gerne bestimmten Text, den ich aus einem Textfile lade ersetzen und in einem neuen Textfile speichern.
Dafür habe ich zwei Memofelder, 4 Buttons und folgenden Code eingefügt:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('C:\Test.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.text:=StringReplace(Memo1.text,'RFU','RFU_CON',[rfReplaceAll, rfIgnoreCase]);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Lines.SavetoFile('C:\Test2.txt');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;
Wie kann ich nun verhindern, dass nicht der komplette übereinstimmende Text ersetzt wird.
Ich möchte zum Beipiel, dass in einer Zeile nur das erste Wort geprüft wird und dort ersetzt. Wenn das Wort an dritter Stelle vorkommt, möchte ich kein Ersetzen durchführen.

Hat jemand einen Tipp?

Danke und Gruß,
axmarq

DeddyH 27. Jul 2007 07:46

Re: Text ersetzen
 
Hallo, anstatt das StringReplace auf den kompletten Text loszulassen, könntest Du das Memo zeilenweise durchgehen (for i := 0 to Memo.Lines.Count - 1), schauen, ob der gesuchte Text am Zeilenanfang steht (if Pos(Suchtext, Memo.Lines[i] = 1) und dann ggf. mit StringReplace(ohne rfReplaceAll) den Text ersetzen.

s-off 27. Jul 2007 08:17

Re: Text ersetzen
 
Hallo,
Zitat:

Zitat von axmarq
ich möchte gerne bestimmten Text, den ich aus einem Textfile lade ersetzen und in einem neuen Textfile speichern.

Du benutzt die beiden Memos aber nur für Testzwecke und ersetzt die dann anschliessend durch eine Stringlist, oder?

Edit:
Zu Deiner eigentlichen Frage:

Basierend auf dem Vorschlag von DeddyH könntest Du Dir eine eigene StringReplace-Funktion schreiben, an welche Du dann noch die zu überprüfende Textposition übergibst.

axmarq 27. Jul 2007 18:27

Re: Text ersetzen
 
Hallo,

vielen Dank für Eure Antworten. Zunächst mal zu s-off: Wo liegt der Vorteil, wenn ich eine Stringlist nehme?

Zu DeddyH: Ich habe mal versucht Deine Idee umzusetzen. Bin aber leider gescheitert. Habe den Code jetzt mal so umgeändert.

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
for i := 0 to Memo1.Lines.Count - 1 do begin
   if Pos('RFU', Memo1.Lines[i] = 1) then
   StringReplace(Memo1.text,'RFU','RFU_CON',[rfIgnoreCase]);
end;
Ich weiß nicht wie ich jetzt den StringReplace einbaue und wie ich die if-Schleife verwende :roll:

Könnt Ihr einem Anfänger nochmal mit Rat und Tat zur Seite stehen.

Danke und Gruß,
axmarq

Klaus01 27. Jul 2007 18:35

Re: Text ersetzen
 
Delphi-Quellcode:
for i := 0 to Memo1.Lines.Count - 1 do begin
  if Pos('RFU', Memo1.Lines[i] = 1) then
    Memo1.lines[i]:=StringReplace(Memo1.lines[i],'RFU','RFU_CON',[rfIgnoreCase]);
end;
So sollte es ungefähr funktionieren.
Weil, Du willst ja nur den Text in der Zeile ersetzen wo er denn auch aufgetaucht ist.

Und, if-Schleifen gibt es nicht.

Grüße
Klaus

DeddyH 27. Jul 2007 18:36

Re: Text ersetzen
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
  Memo2.Clear;
  Memo2.Lines.BeginUpdate;
  for i := 0 to Memo1.Lines.Count - 1 do
    if Pos('rfu',AnsiLowerCase(Memo1.Lines[i])) = 1 then
      Memo2.Lines.Add(StringReplace(Memo1.Lines[i],'rfu','RFU_CON',[rfIgnoreCase]))
    else
      Memo2.Lines.Add(Memo1.Lines[i]);
  Memo2.Lines.EndUpdate;
end;

s-off 27. Jul 2007 18:55

Re: Text ersetzen
 
Der Vorteil ist der, dass Du alles, was Du jetzt mit Deinen beiden Memos anstellst, auch in einer Stringliste abhandeln kannst.

DeddyH 27. Jul 2007 19:00

Re: Text ersetzen
 
Und wenn er das gar nicht will? Wenn ich das richtig verstanden habe, will er eine Datei laden, den Text ersetzen und dann unter anderem Namen abspeichern. Die Memos dienen da wohl als eine Art Preview. :)

axmarq 27. Jul 2007 19:33

Re: Text ersetzen
 
Hallo Zusammen,

vielen Dank für die zahlreichen Antworten. Auch für den Hinweis mit der Stringlist. Vielleicht kann ich das ja irgendwann verwenden. In diesem Fall soll es tatsächlich als Vorschau dienen.

Ich habe den Code von DeddyH verwendet und es funzt prima. Perfekt! :lol:
Vielleicht kannst Du mir aber noch erklären wofür AnsiLowerCase steht. Ich wills schließlich auch verstehen.

Vielen Dank nochmal.
axmarq


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 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