Delphi - база знаний

       

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



Взято с Исходников.ru



Содержание раздела