Содержание материала

 Иногда бывает необходимо полудить только часть текста из RichEdit не выделяя его, то есть не используя свойство SelText. Ниже представлен код, который позволяет сделать это.

Code:

{Переопределяем неправильное объявление 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;

 


Следующую функцию можно использовать для получения слова, над которым находится курсор мышки:

Code:

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 < 0or

  (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;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить