Как получить определённую часть текста из RichEdit Иногда бывает…

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

Понравилась статья? Поделиться с друзьями: