AGB  ·  Datenschutz  ·  Impressum  







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

Wort gefunden und markiert!

Ein Thema von Chakvour · begonnen am 17. Feb 2010 · letzter Beitrag vom 17. Feb 2013
Antwort Antwort
Benutzerbild von arc
arc

Registriert seit: 6. Nov 2009
Ort: Elbflorenz
62 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Wort gefunden und markiert!

  Alt 17. Feb 2013, 18:17
Lieber spät als nie, ich habe besagte Funktion auch entdeckt und festgestellt, daß das was da passiert sehr seltsam ist.

Typische Version im Netz:

Delphi-Quellcode:
function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean;
var
  StartPos, Position, Endpos: Integer;
begin
  StartPos := 0;
  with RichEdit do
  begin
    Endpos := Length(RichEdit.Text);
    Lines.BeginUpdate;
    while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do
    begin
      Endpos := Length(RichEdit.Text) - startpos;
      Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]);
      Inc(StartPos, Length(SearchText));
      SetFocus;
      SelStart := Position;
      SelLength := Length(SearchText);
    end;
    Lines.EndUpdate;
  end;
end;
Da ist einiges daneben.
- FindText wird stets doppelt ausgeführt
- Endpos ist keine absolute Position sondern eine relative Textlänge!
- die Funktion gibts nichts zurück
- Inc(StartPos, Length(SearchText)); ist selten dämlich, da FindText die Position des gefundenen Strings zurückliefert, ab da einfach weitersuchen

Das Resultat: Der Code funktioniert zwar, braucht aber EWIG. Meine Variante:

Delphi-Quellcode:
procedure RE_SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string);
var StartPos, Position, RemainingLength, WordCount, TextSize, SearchSize: Integer;
begin
  if SearchText = 'then Exit;
  
  with RichEdit do
  begin
    Lines.BeginUpdate;

    // reset colors...
    SelStart:=0;
    SelLength:=Length(RichEdit.Text) - 1;
    SelAttributes.Color:=$000000;

    WordCount:=0;
    StartPos:=0;
    TextSize:=Length(RichEdit.Text);
    SearchSize:=Length(SearchText);
    RemainingLength:=TextSize;
    Position:=FindText(SearchText, StartPos, RemainingLength, []);

    if Position <> -1 then
    repeat
      // selects the word and changes color
      SelStart:=Position;
      SelLength:=SearchSize;
      SelAttributes.Color:=$0000FF;
      inc(WordCount);

      // changes startpos to after the current word
      StartPos:=Position + SearchSize;
      // Remaining Text to search for
      RemainingLength:=TextSize - StartPos;
      // find again...
      Position:=FindText(SearchText, StartPos, RemainingLength, []);
    until Position = -1;

    SelLength:=0; // reset selection...
    Lines.EndUpdate;
  end;
  ShowMessage(SearchText + ' found ' + IntToStr(WordCount) + ' times.');
end;
Diese Prozedur ändert die Farbe aller gefundenen Wörter rot und zählt die Anzahl der Fundstellen mit. Ich habe versucht soweit es geht auf Laufzeit zu optimieren. stMatchCase brauche ich nicht. Die Funktion ist bereits recht speziell, aber läßt sich mit wenigen Handgriffen wieder verallgemeinern.

Aufruf z.B. so
Delphi-Quellcode:
  RE_SearchForText_AndSelect(
    RichEdit1,
    InputBox('Find', 'Find What:', '')
  );
Hauptunterschied ist StartPos:=Position + Length(SearchText); statt Inc(StartPos, Length(SearchText)); der Rest ist Geschmacksache. Ich hoffe es hilft dem einen oder anderen.

Viel Spaß!
Angehängte Grafiken
Dateityp: png Bild1.png (34,6 KB, 24x aufgerufen)

Geändert von arc (17. Feb 2013 um 18:22 Uhr)
  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 17:12 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