Einzelnen Beitrag anzeigen

Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TReplaceDialog - Wie geht das ???

  Alt 20. Mai 2006, 15:53
So, hier mal ein kleines Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Length(RichEdit1.SelText) > 0 then
    ReplaceDialog1.FindText := RichEdit1.SelText; // Markierter Text als FindText

  ReplaceDialog1.Execute; // ReplaceDialog anzeigen
end;

procedure TForm1.ReplaceDialog1Find(Sender: TObject); // OnFind
var s, sub: string;
begin
  RichEdit1.SetFocus;

  if RichEdit1.SelLength > 0 then
    RichEdit1.SelStart := RichEdit1.SelStart +1; // ergänzt, sonst wurde der erste Buchstabe übersprungen

  if frMatchCase in ReplaceDialog1.Options then
  begin
    s := RichEdit1.Lines.Text; // Groß-/Kleinschreibung beachten
    sub := ReplaceDialog1.FindText;
  end
  else
  begin
    s := AnsiUpperCase(RichEdit1.Lines.Text); // nicht beachten
    sub := AnsiUpperCase(ReplaceDialog1.FindText);
  end;

                                   // hier dann SelStart+1 anstatt +2
  RichEdit1.SelStart := PosEx(sub, s, RichEdit1.SelStart+1) -1; // Suche an aktueller Position beginnen
  RichEdit1.SelLength := Length(ReplaceDialog1.FindText); // Text markieren

  if RichEdit1.SelStart = RichEdit1.GetTextLen then // Ende erreicht?
  begin
    ShowMessage('Textende erreicht!');
    RichEdit1.SelStart := 0; // zum Anfang gehen
  end;
end;

procedure TForm1.ReplaceDialog1Replace(Sender: TObject); // OnReplace
var Flags: TReplaceFlags;
begin
  if frReplaceAll in ReplaceDialog1.Options then
  begin
    if frMatchCase in ReplaceDialog1.Options then
      Flags := [] // Groß-/Kleinschreibung beachten
    else
      Flags := [rfIgnoreCase]; // nicht beachten

    RichEdit1.Lines.Text := StringReplace(RichEdit1.Lines.Text,
                                          ReplaceDialog1.FindText, // alles ersetzen
                                          ReplaceDialog1.ReplaceText,
                                          [rfReplaceAll]+Flags);
    ShowMessage('Alles ersetzt!');
  end
  else
  begin
    if (not (frMatchCase in ReplaceDialog1.Options) // nicht Groß-/Kleinschreibung beachten
        and (AnsiUpperCase(RichEdit1.SelText) = AnsiUpperCase(ReplaceDialog1.FindText)))
      or (RichEdit1.SelText = ReplaceDialog1.FindText) then //oder Texte identisch
      RichEdit1.SelText:=ReplaceDialog1.ReplaceText; // markierten Text ersetzen

    ReplaceDialog1Find(Sender); // nächstes Vorkommen suchen und markieren
  end;
end;
Das einzige was noch nicht drin ist, ist die Beachtung von Groß-/Kleinschreibung.
Kannst du aber mit:
if frMatchCase in ReplaceDialog1.Options then ganz schnell noch einbauen.
//Edit: ist eingebaut!

MfG
Martin
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat