Как найти подчеркнутый текст в расширенном редактировании? - PullRequest
0 голосов
/ 19 декабря 2010

Извините, если форматирование ниже немного отключено.

Попытка получить подчеркнутый текст из элемента управления Richedit, чтобы определить, является ли гиперссылка при нажатии.

Этот код работал в Delphi 2007и ниже.Я знаю, что есть структура TCharFormat2, и кодировка символов, возможно, изменилась.

Хотя мне не повезло изменить их.

Любая помощь очень ценится.Спасибо.

----------------------------------------
function GetUnderlinedText( ARichEdit: TRichEdit; CharIdx: Integer ): String;  
var  
  i: Integer;  
  CharFormat: TCharFormat;    
  SelStart: Integer;  
begin  
  CharFormat.cbSize := SizeOf( TCharFormat );  
  CharFormat.dwMask := CFM_UNDERLINE;  

  ARichEdit.SelStart := CharIdx;  
  SendMessage( ARichEdit.Handle, EM_GETCHARFORMAT, 1, Integer( @CharFormat ) );  

  //------- If not underlined return empty str. ------------  
  if (CharFormat.dwEffects and CFE_UNDERLINE)=0 then  
  begin  
    Result := '';  
    Exit;  
  end;  

  //--------- Find Beginning of Underlined Text ------------  
  i := CharIdx;  
  while (i>0) do  
  begin  
    ARichEdit.SelStart := i;

    //------------ Check for New Line Char -----------------
    if( ARichEdit.Text[i]=#10 ) then
     Break;

    SendMessage( ARichEdit.Handle, EM_GETCHARFORMAT, 1, Integer( @CharFormat ) );

    //----------- Test if Character was Underlined ---------
    if (CharFormat.dwEffects and CFE_UNDERLINE)=0 then
    begin
      Break;
    end;

    Dec( i );
  end;

  //------------ Find Length of Underlined Text ------------  
  SelStart := i;  
  i:=1;  
  while (SelStart+i &< Length( ARichEdit.Text ) ) do //subtract the & from line   
  begin  
    ARichEdit.SelStart := SelStart + i;

    //------------ Check for New Line Char -----------------
    if( ARichEdit.Text[SelStart+i]=#10 ) then 
     Break;

    SendMessage( ARichEdit.Handle, EM_GETCHARFORMAT, 1, Integer( @CharFormat ) );

    //----------- Test if Character was Underlined ---------
    if (CharFormat.dwEffects and CFE_UNDERLINE)=0 then
    begin
      Break;
    end;

    Inc( i );
  end;

  ARichEdit.SelStart := SelStart;  
  ARichEdit.SelLength := i;

  Result := Trim(ARichEdit.SelText);

  ShowMessage( Result ); //Seems to be showing only part of the underlined text  
end;    

1 Ответ

3 голосов
/ 20 декабря 2010

Вы знаете, что вы можете заставить элемент управления rich edit автоматически определять URL, верно?Элемент управления автоматически выделит гиперссылки и отправит вам сообщение при нажатии на такую ​​гиперссылку.Эта функциональность не предоставляется оболочкой VCL, но ее легко включить, обратившись к базовому API Windows.Подробности можно найти, например, здесь:

Если я правильно помню, в приведенном выше фрагменте кода Scalabium есть довольно тонкая ошибка, но спомощь отличной документации MSDN, я уверен, вы найдете ее.

Обновление

Да, я правильно помню.Ошибки в коде Scalabium обсуждаются здесь .

Обновление 2

К счастью, похоже, что ошибки в Scalabium были исправлены.

...