如果下面的格式有点偏离,请道歉。
尝试从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;
答案 0 :(得分:3)
你知道你可以让富编辑控件自动检测URL,对吧?控件将自动突出显示超链接,并在单击此类超链接时向您发送消息。 VCL包装器不提供此功能,但可以通过联系底层Windows API轻松启用此功能。例如,详细信息可在此处找到:
如果我没记错的话,上面的Scalabium代码片段中有一个相当微妙的错误,但借助优秀的MSDN文档,我相信你会找到它。
是的,我确实记得错了。 Scalabium代码中的错误被讨论here。
幸运的是,似乎Scalabium上的错误已得到纠正。