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.