Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringReplace-Problem (https://www.delphipraxis.net/102736-stringreplace-problem.html)

Tommy1988 3. Nov 2007 16:01


StringReplace-Problem
 
Mein Problem ist es einen einfach String zu ersetzen.

Mein Code:
Delphi-Quellcode:
// Aktuelles Formular: Form2
s := Form1.Memo1.Text;
s := StringReplace(s,FindText.Text, ReplaceText.Text, []);
Normalerweise müsste doch jetzt Memo1 auf Form1 auf FindText.Text durchsucht werden?

Das klappt aber nicht :?

Apollonius 3. Nov 2007 16:04

Re: StringReplace-Problem
 
Du musst s natürlich auch wieder Memo1.Text zuweisen, sonst steht der veränderte Text nur im Speicher und nicht auf dem BIldschirm.

Tommy1988 3. Nov 2007 16:06

Re: StringReplace-Problem
 
Naja. ich mein, hier stehts halt so
http://www.dsdt.info/referenz/vcl_fcl/strings.php

Was genau ist denn falsch damit ich es in Zukunft verstehe?

Apollonius 3. Nov 2007 16:09

Re: StringReplace-Problem
 
Was da auf dsdt.info steht, ist schon richtig. Überlege dir doch mal was du tust:
1. Den Inhalt des Memos in eine Variable kopieren
2. Diese Variable verändern (wie genau, ist hier egal)

Aber: Den veränderten String musst du auch wieder ins Memo schreiben, sonst ist er eben nur im Speicher.

Tommy1988 3. Nov 2007 16:15

Re: StringReplace-Problem
 
Delphi-Quellcode:
Form1.Memo1.SelStart :=
Form1.Memo1.SelStart + Form1.Memo1.SelLength-1;
Form1.Memo1.SelLength := Length(FindText.Text);
Das bewirkt schonmal garnix.. der markiert immer irgentwas.. aber nicht das was FindText.Text beinhaltet

Apollonius 3. Nov 2007 16:18

Re: StringReplace-Problem
 
Willst du einen Text durchsuchen oder dort bestimmte Ausdrücke ersetzen?

Dax 3. Nov 2007 16:18

Re: StringReplace-Problem
 
Delphi-Quellcode:
Form1.Memo1.SelStart := Pos('meins', Form1.Memo1.Text);
Form1.Memo1.SelLength := Length('meins');

Muetze1 3. Nov 2007 16:20

Re: StringReplace-Problem
 
Memo1.Text ist die falsche Eigenschaft. Nutze statt dessen Memo1.Lines.Text.

Und setze bei StringReplace rfReplaceAll

Tommy1988 3. Nov 2007 16:46

Re: StringReplace-Problem
 
Wie muss ich da shir jetzt verstehen?
Delphi-Quellcode:
Form1.Memo1.SelStart := Pos('meins', Form1.Memo1.Text) - 1; // Markierung anfang
Form1.Memo1.SelLength := Length('meins'); // Markierung ende
ABER: wie speichere ich den markierten Text in eine Variable damit ich diesen via StringReplace ersetzen kann?

DeddyH 3. Nov 2007 16:47

Re: StringReplace-Problem
 
Du brauchst keine Variable, schau mal unter Memo.SelText.

Tommy1988 3. Nov 2007 17:12

Re: StringReplace-Problem
 
Moment.. ohne nachzugucken überlege ich mal..

"SelText." SelectedText denk ich mal, heißt es.

Ich gucke aber trotzdem noch einmal in das Manuell..

Tommy1988 3. Nov 2007 18:09

Re: StringReplace-Problem
 
Folgender maßen habe ich alles gehandhabt:
Delphi-Quellcode:
procedure TForm5.btn2Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin
Form1.Memo1.SelStart := Pos(FindText.Text,
Form1.Memo1.Lines.Text)-1;
Form1.Memo1.SelLength := Length(FindText.Text);
Form1.Memo1.SelText := StringReplace(Form1.Memo1.SelText,
FindText.Text, ReplaceText.Text, [rfIgnoreCase]);
end
else
begin
Form1.Memo1.SelStart := Pos(FindText.Text,
Form1.Memo1.Lines.Text)-1;
Form1.Memo1.SelLength := Length(FindText.Text);
Form1.Memo1.SelText := StringReplace(Form1.Memo1.SelText,
FindText.Text, ReplaceText.Text, []);
end;
Was die CheckBox zusagen hat, ist ja klar. Er beachtet auch die Groß- und Kleinschrebung völlig korrekt, was wiederum nicht so richtig klappt ist
Delphi-Quellcode:
[rfReplaceAll, rfIgnoreCase
"rfReplaceAll": er ersetzt nur das erst gefundene, nicht alle.

Muetze1 3. Nov 2007 18:20

Re: StringReplace-Problem
 
1. Wenn ich sehe, dass hier von TForm5 auf die globale Variable Form1 zugegriffen wird, wird mir schon ganz anders. Aber das soll erstmal nicht unser Problem sein.
2. Das rfReplaceAll nur das erste Vorkommen ersetzt, glaube ich nicht. Wenn du das Suchen & Ersetzen nur auf den selektierten Text anwendest und dieser nur ein einmaliges Vorkommen hat, ist es doch irgendwie logisch, oder?
3. Du baust doch hier anscheinend einen Suchen & Ersetzen Dialog. Warum findet denn der Suchen Dialog nicht den Text und markiert ihn? Dann sollte die Routine unten das Ersetzen durchführen und wenn dann noch "Alle Vorkommen ersetzen" vom Nutzer ausgewählt ist, dann kann der Suchen-Dialog weiter suchen bis er nichts mehr findet. Das er hier markiert und ersetzt ist irgendwie recht merkwürdig.
4. Ich sehe nirgendwo in deinem Code wo und wie du rfReplaceAll angibst.
5. Schonmal den Debugger benutzt und dir den Inhalt der Variablen angeschaut?
6. Warum benennst du die Elemente nicht einfach mal nutzbar? Dann müssten wir nicht den Code anschauen was CheckBox1 macht, sondern wüssten beim Lesen von ckbIgnoreCase sofort, was die CheckBox bewirkt.
7. Warum soviel doppelter Code?

Delphi-Quellcode:
procedure TForm5.btn2Click(Sender: TObject);
var
  lFlags: TReplaceFlags;
begin
  lFlags := [];

  if ckbIgnoreCase.Checked then
    Include(lFlags, rfIgnoreCase);
  if ckbReplaceAll.Checked then
    Include(lFlags, rfReplaceAll);

  Form1.Memo1.Lines.Text := StringReplace(Form1.Memo1.Lines.Text, FindText.Text, ReplaceText.Text, lFlags);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 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-2025 by Thomas Breitkreuz