Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Memo durchsuchen (https://www.delphipraxis.net/157039-memo-durchsuchen.html)

smart 26. Dez 2010 10:08

Memo durchsuchen
 
Ich suche eine ganz einfache Suchfunktion die einen Text in einem Memo durchsucht aber auch dopelte vorkommende Wörter markiert.
Delphi-Quellcode:
var
  I, J, PosReturn, SkipChars: Integer;
begin
  for I := 0 to Memo1.Lines.Count do
  begin
    PosReturn := Pos(FindDialog1.FindText,Memo1.Lines[I]);
    if PosReturn <> 0 then {gefunden!}
    begin
      Skipchars := 0;
      for J := 0 to I - 1 do
        Skipchars := Skipchars + Length(Memo1.Lines[J]);
      SkipChars := SkipChars + (I*2);
      SkipChars := SkipChars + PosReturn - 1;

      Memo1.SetFocus;
      Memo1.SelStart := SkipChars;
      Memo1.SelLength := Length(FindDialog1.FindText);
      Break;
    end;
  end;
Habe hier mal was gefunden. sucht aber leider keine doppelten Wörter raus :-(

mkinzler 26. Dez 2010 10:10

AW: Memo durchsuchen
 
Schau dir mal PosEx() an

himitsu 26. Dez 2010 10:55

AW: Memo durchsuchen
 
Zitat:

Delphi-Quellcode:
for I := 0 to Memo1.Lines.Count do

Du meinst bestimmt -1 :angle:

Delphi-Quellcode:
var
  I, PosReturn, SkipChars: Integer;
begin
  Skipchars := 0;
  for I := 0 to Memo1.Lines.Count - 1 do
  begin
    PosReturn := Pos(FindDialog1.FindText, Memo1.Lines[I]);
    if PosReturn <> 0 then
    begin
      Memo1.SetFocus;
      Memo1.SelStart := SkipChars + PosReturn - 1;
      Memo1.SelLength := Length(FindDialog1.FindText);
      Break;
    end;
    //Inc(Skipchars, Length(Memo1.Lines[J]) + Length(sLineBreak);
    Inc(Skipchars, Length(Memo1.Lines[J]) + Length(Memo1.Lines.LineBreak);
  end;
Delphi-Quellcode:
var
  PosReturn: Integer;
begin
  PosReturn := Pos(FindDialog1.FindText, Memo1.Text);
  if PosReturn <> 0 then
  begin
    Memo1.SetFocus;
    Memo1.SelStart := PosReturn - 1;
    Memo1.SelLength := Length(FindDialog1.FindText);
  end;
end;
Und bezüglich des Weitersuchens ist es über .Text einfacher, da man sich dort nur eine Startposition merken/besorgen muß.
Nei der zeilenweisen Behandlung muß diese Position ja erstmal in Zeile+Spalte zerlegt werden, oder man merkt sich die Anzahl der vorherrigen Funde und muß dann jesemal komplett neu suchen und beim gewünschten Fund abbrechen.

Delphi-Quellcode:
var
  PosReturn: Integer;
begin
  if SucheVonVorn then
    PosReturn := Pos(FindDialog1.FindText, Memo1.Text)
  else
    PosReturn := PosEx(FindDialog1.FindText, Memo1.Text,
      Memo1.SelStart + Memo1.SelLength - 1);
  if PosReturn <> 0 then
  begin
    Memo1.SetFocus;
    Memo1.SelStart := PosReturn - 1;
    Memo1.SelLength := Length(FindDialog1.FindText);
  end;
end;
PS: Nicht mehrfach inder Schleife auf Memo1.Text und niemals auf Memo1.Lines.Text zugreifen ... wenn, dann Memo1.Text vorher in eine Stringvariable kopieren und Diese verwenden.

sx2008 26. Dez 2010 11:38

AW: Memo durchsuchen
 
Ein TMemo kann nur einen best. Bereich markiert darstellen.
Man könnte auf ein TRichEdit ausweichen und alle gefundenen Textstellen unterstreichen oder auch farblich hevorheben.

smart 26. Dez 2010 12:04

AW: Memo durchsuchen
 
Vielen Dank, für die ausgibigen Tipps. War sehr lehreich! Danke.


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