15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Как получить определённую часть текста из 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;