Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nur ganze Wörter finden (https://www.delphipraxis.net/27344-nur-ganze-woerter-finden.html)

Luckie 8. Aug 2004 18:13


Nur ganze Wörter finden
 
Ich habe hier eine Funktion die einen SubString in einem String sucht und den Index des ersten Zeichens zurückgibt:
Delphi-Quellcode:
function Find(StartPos: Integer; const Text, Word: string; WholeWordsOnly:
  Boolean = False): Integer;
var
  Index: Integer;
begin
  if WholeWordsOnly then
  begin
    Index := (PosEx(AnsiUppercase(Word), AnsiUpperCase(Text), StartPos)) - 1;
    if Text[Index + length(Word) + 1] in WordDelimiter then
      result := Index
    else
      result := -1;
  end
  else
    result := (PosEx(AnsiUppercase(Word), AnsiUpperCase(Text), StartPos)) - 1;
end;
Nun wollte ich sie so erweitern, dass man optional nur nach ganzen Wörten suchen kann. Leider ist da irgendwo noch ein Bug drinne. Er bricht einfach mitten drinne ab und findet keine Wörter mehr, obwohl noch ganze Wörter zu finden wären.

Einsetzten wollte ich das hier:
Delphi-Quellcode:
function HighlightWords(RichEdit: TRichEdit; Words: TStrings; FontStyle:
  TFontStyles;
  Color: TColor): Cardinal;
var
  i: Integer;
  LastWordPos: Integer;
  HighLightedWords: Cardinal;
begin
  LastWordPos := 0;
  HighLightedWords := 0;
  RichEdit.Lines.BeginUpdate;
  for i := 0 to Words.Count - 1 do
  begin
    while LastWordPos <> 1 do
    begin
      LastWordPos := Find(LastWordPos, RichEdit.Text, Words[i]);
      writeln(Words[i] + ': ' + IntToStr(LastWordPos));
      RichEdit.SelStart := LastWordPos;
      RichEdit.SelLength := length(Words[i]);
      RichEdit.SelAttributes.Color := Color;
      RichEdit.SelAttributes.Style := FontStyle;
      LastWordPos := LastWordPos + 2;
      Inc(HighLightedWords);
    end;
    LastWordPos := 0;
  end;
  RichEdit.SelStart := 0;
  RichEdit.Lines.EndUpdate;
  result := HighLightedWords;
end;
Jetzt weiß ich nicht, ob der Fehler in Find oder HighLightWord liegt. Wenn sich da bitte jemand erbarmen könnte und auch mal einen Blick draufwerfen könnte. Ich beschäftige mich schon mehrere Tage damit und sehe den Wald vor lauter Bäumen schon nicht mehr. :roll:

Union 8. Aug 2004 20:05

Re: Nur ganze Wörter finden
 
Ich habe Deinen Source übernommen und er funktioniert. Nur das Writeln habe ich deaktiviert. Poste doch mal den Inhalt des Textes und den der Stringlist (Words).

Luckie 8. Aug 2004 22:11

Re: Nur ganze Wörter finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Probier es mal mit dem Text im Anhang. Bei mir markiert er 26 Wörter. Das letzet "and" findet er im 8. Vers und bei den "rhe"s findet er nur das im Titel. Ach so, in der Liste habe ich zum Testen "and" und "the".
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Add('and');
    sl.Add('the');
    ShowMessage(IntToStr(HighlightWords(RichEdit1, sl, [fsBold, fsUnderline],
      clRed)) + ' Wörter markiert');
  finally
    FreeAndNil(sl);
  end;
end;

Union 8. Aug 2004 22:35

Re: Nur ganze Wörter finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Probier es mal mit dem Text im Anhang. Bei mir markiert er 26 Wörter. Das letzet "and" findet er im 8. Vers und bei den "rhe"s findet er nur das im Titel. Ach so, in der Liste habe ich zum Testen "and" und "the".

Exakt gleich. Ich dachte das finden wir vielleicht im chat schneller, aber der geht bei mir nicht -> Fehler auf Seite.

[edit]
Zwischenergebnis: Debugger beim 26. Wort angehalten und siehe da: der Text ist abgeschnitten. Es hört auf mit schrecklichen Effekten, s. Screenshot vom Debugger.

Luckie 8. Aug 2004 22:36

Re: Nur ganze Wörter finden
 
Was heißt exakt gleich? Findet er alle bei dir oder wie?

Union 8. Aug 2004 22:45

Re: Nur ganze Wörter finden
 
Zitat:

Zitat von Luckie
Was heißt exakt gleich? Findet er alle bei dir oder wie?

Nein, siehe mein edit des letzten Postings.

Luckie 8. Aug 2004 22:48

Re: Nur ganze Wörter finden
 
Ja beim 26. bricht er bei mir auch ab. Das was der Debugger anzeigt, ist nicht weiterer tragisch. Es ist ein Text im RTF Format, der Debugger zeigt eben die Steierzeichen mit an, da er nir PlainText kann.

Komisch. Ich werde das moregn noch mal mit einem anderen Text probieren. Aber warum macht er es bei diesem Text nicht? :gruebel: :evil:

Union 8. Aug 2004 23:08

Re: Nur ganze Wörter finden
 
Zitat:

Zitat von Luckie
Ja beim 26. bricht er bei mir auch ab. Das was der Debugger anzeigt, ist nicht weiterer tragisch. Es ist ein Text im RTF Format, der Debugger zeigt eben die Steierzeichen mit an, da er nir PlainText kann.

Komisch. Ich werde das moregn noch mal mit einem anderen Text probieren. Aber warum macht er es bei diesem Text nicht? :gruebel: :evil:

Wegen der Steuerzeichen. Vergiss erst mal Deine Funktion für ne Weile, denn so gehts (97 Wörter Markiert):
Delphi-Quellcode:
 LastWordPos := RichEdit.FindText(Words[i],LastWordPos,Length(Richedit.Text) - LastWordPos, [stWholeWord]);
In der Hilfe steht extra, daß man nicht so vorgehen soll wie Dein Ansatz, wegen der Steuerzeichen.

Dani 8. Aug 2004 23:36

Re: Nur ganze Wörter finden
 
Edit: Kommando zurück, wenn man so nach ganzen Wörtern sucht klappts nicht... :oops:

S2B 8. Aug 2004 23:50

Re: Nur ganze Wörter finden
 
Die Funktion ist in der Unit StrUtils! :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz