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