Здравствуйте, maslan.
1. попробуйте заменить fnd := RichEdit1.FindText('!MATRIX!', fnd+1, Length(RichEdit1.Text), []);
на fnd := RichEdit1.FindText('!MATRIX!', fnd+1, Length(RichEdit1.Lines.Text), [stMatchCase]);
Должно работать
2. Зачем изобретать велосипед??
Если заглянуть в реализацию TCustomRichEdit.FindText,то можно увидеть то же самое,то есть что поиск реализован с помощью
SendMessage(Handle, EM_FINDTEXT, Flags, LongInt(@Find)) :
function TCustomRichEdit.FindText(const SearchStr: string;
StartPos, Length: Integer; Options: TSearchTypes): Integer;
var
Find: TFindText;
Flags: Integer;
begin
with Find.chrg do
begin
cpMin := StartPos;
cpMax := cpMin + Length;
end;
Flags := 0;
if stWholeWord in Options then Flags := Flags or FT_WHOLEWORD;
if stMatchCase in Options then Flags := Flags or FT_MATCHCASE;
Find.lpstrText := PChar(SearchStr);
Result := SendMessage(Handle, EM_FINDTEXT, Flags, LongInt(@Find));
end;
Соответственно указатель передаётся так: LongInt(@Find)