Как получить определённую часть текста из RichEdit?

Previous  Top  Next

    
 

 

Иногда бывает необходимо полудить только часть текста из 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;

 

©Drkb::00565

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