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

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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...