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