| 
 Как получить определённую часть текста из RichEditИногда бывает необходимо полудить только часть
    текста из RichEdit не выделяя его, то есть не
    используя свойство SelText. Ниже представлен код,
    который позволяет сделать это. {Переопределяем неправильное объявление TTextRange
    в RichEdit.pas} TTextRange = record
 chrg:
    TCharRange;
 lpstrText:
    PAnsiChar;
 end;
 
 
 function REGetTextRange(RichEdit: TRichEdit;
 BeginPos,
    MaxLength: Integer): string;
 {RichEdit - RichEdit control
 BeginPos - абсолютное значение первого символа
 MaxLength - максимально число получаемых символов}
 var
 TextRange: TTextRange;
 begin
 if MaxLength>0 then
 begin
 SetLength(Result, MaxLength);
 with TextRange do
 begin
 chrg.cpMin := BeginPos;
 chrg.cpMax := BeginPos+MaxLength;
 lpstrText := PChar(Result);
 end;
 SetLength(Result, SendMessage(RichEdit.Handle, EM_GETTEXTRANGE,
    0,
 longint(@TextRange)));
 end
 else Result:='';
 end;
 
 Следующую функцию можно использовать для
    получения слова, над которым находится курсор
    мышки:
 
 function RECharIndexByPos(RichEdit: TRichEdit; X, Y: Integer): Integer;
 { функция возвращает абсолютное положение
    символа для данных координат курсора}
 
 var
 P: TPoint;
 begin
 P := Point(X, Y);
 Result := SendMessage(RichEdit.Handle, EM_CHARFROMPOS, 0, longint(@P));
 end;
 
 function REExtractWordFromPos(RichEdit:
    TRichEdit;  X,  Y:  Integer):=
 string;
 { X, Y - координаты в rich edit }
 {возвращает слово в текущих координатах курсора}
 
 var
 BegPos, EndPos: Integer;
 begin
 BegPos := RECharIndexByPos(RichEdit, X,  Y);
 if (BegPos < 0)  or
 (SendMessage(RichEdit.Handle,EM_FINDWORDBREAK,WB_CLASSIFY,BegPos) and
 (WBF_BREAKLINE
    or WBF_ISWHITE) <> 0 )      then
 begin
 result:='';
 exit;
 end;
 
 if SendMessage(RichEdit.Handle, EM_FINDWORDBREAK,WB_CLASSIFY,BegPos-1) and
 (WBF_BREAKLINE or
    WBF_ISWHITE)  =  0  then
 BegPos:=SendMessage(RichEdit.Handle,
    EM_FINDWORDBREAK,
 WB_MOVEWORDLEFT,
    BegPos);
 EndPos:=SendMessage(RichEdit.Handle,EM_FINDWORDBREAK,WB_MOVEWORDRIGHT,BegPos);
 Result:=TrimRight(REGetTextRange(RichEdit, BegPos, EndPos - BegPos));
 end;
     |