Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как получить определенную часть текста из TRichEdit?

01.01.2007

Иногда бывает необходимо полудить только часть текста из 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;

Взято из https://forum.sources.ru