如何在丰富的编辑中找到带下划线的文本?

时间:2010-12-19 18:09:37

标签: delphi delphi-2010 richedit-control

如果下面的格式有点偏离,请道歉。

尝试从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 个答案:

答案 0 :(得分:3)

你知道你可以让富编辑控件自动检测URL,对吧?控件将自动突出显示超链接,并在单击此类超链接时向您发送消息。 VCL包装器不提供此功能,但可以通过联系底层Windows API轻松启用此功能。例如,详细信息可在此处找到:

如果我没记错的话,上面的Scalabium代码片段中有一个相当微妙的错误,但借助优秀的MSDN文档,我相信你会找到它。

更新

是的,我确实记得错了。 Scalabium代码中的错误被讨论here

更新2

幸运的是,似乎Scalabium上的错误已得到纠正。