如何在TRichEdit中以其余的蓝色下划线格式包括超链接文本的最后一个单词?

问题描述

我正在使用TRichEdit编辑文本。然后,我使用TJvRichEditToHtml将文本转换为HTML,然后通过Mailgun将其作为电子邮件的正文发送。我想在通过电子邮件发送的文本中包含超链接

this SO post和其他几个类似的代码之后,我包括了以下代码,用于在TRichEdit的插入点插入格式化的超链接。正如预期的那样,这将隐藏URL,并根据需要将链接文本显示为带蓝色下划线的文本。也就是说,如果我插入网址https://stackoverflow.com和文本this is a link,则HTML将包含 HYPERLINK "https://stackoverflow.com/"this is a link 并且“ Rich”文本框中的this is a link全部显示为蓝色并带有下划线。

在将正文发送到Mailgun之前,我先将HYPERLINK &quot;替换为<a href=",将&quot;替换为",以获得html <a href="https://stackoverflow.com/">this is a link

要确定链接文本的末尾,以便我可以替换</a>并正确关闭html超链接,我添加代码,在TRich中的超文本链接后附加了一个隐藏的文本标记ENDHYPERLINK。编辑,然后替换</a>。即替换前的html看起来像HYPERLINK &quot;https://stackoverflow.com/&quot;this is a link ENDHYPERLINK,替换后的html看起来像<a href="https://stackoverflow.com/">this is a link</a>

但是,当我在超链接之后添加此多余的文本时,尽管它在TRichEdit中是正确不可见的,但TRichEdit中链接文本的蓝色下划线会缩回,以使超链接文本的最后一个字不再格式化为蓝色下划线(无论超链接文本是多长时间或最后一个单词多长时间),即我得到this is a,蓝色的空格字符带有下划线,但没有单词link

有人可以帮我附加我的结尾令牌,但仍将所有显示的原始超链接文本格式化吗?

用于插入超链接代码-在添加我的结束令牌之前-该代码显示为确定。

procedure TForm1.InsertHyperLink(const HyperlinkText,HyperlinkURL: string);

var
  HyperlinkPrefix,FullHyperlink: string;
  Fmt: CHARFORMAT2;
  StartPos: Integer;

  begin
  if HyperlinkURL <> '' then
    begin
    HyperlinkPrefix := Format('HYPERLINK "%s"',[HyperlinkURL]);
    FullHyperlink := HyperlinkPrefix + HyperlinkText;
    end
  else
    begin
    FullHyperlink := HyperlinkText;
    end;

  StartPos := RichEdit1.SelStart;
  RichEdit1.SelText := FullHyperlink;
  RichEdit1.SelStart := StartPos;
  RichEdit1.SelLength := Length(FullHyperlink) ;
  FillChar(Fmt,SizeOf(Fmt),0);
  Fmt.cbSize := SizeOf(Fmt);
  Fmt.dwMask := CFM_LINK;
  Fmt.dwEffects := CFE_LINK;

  SendMessage(RichEdit1.Handle,EM_SETCHARFORMAT,SCF_SELECTION,LParaM(@Fmt));

  if HyperlinkURL <> '' then
    begin
    RichEdit1.SelStart := StartPos ;
    RichEdit1.SelLength := Length(HyperlinkPrefix);
    FillChar(Fmt,0);
    Fmt.cbSize := SizeOf(Fmt);
    Fmt.dwMask := CFM_HIDDEN;
    Fmt.dwEffects := CFE_HIDDEN;
    SendMessage(RichEdit1.Handle,LParaM(@Fmt));
    end;

  RichEdit1.SelStart := StartPos + Length(FullHyperlink) ;
  RichEdit1.SelLength := 0;

end;

用于插入超链接但还附加结束标记代码-这会丢失链接文本中最后一个单词的格式。

procedure TForm1.InsertHyperLink(const HyperlinkText,HyperlinkURL: string);

const
  TOKEN_LINK_END = ' ENDHYPERLINK';

var
  HyperlinkPrefix,LParaM(@Fmt));
    end;

  RichEdit1.SelStart := StartPos + Length(FullHyperlink) ;
  RichEdit1.SelLength := 0;

  ///////////////////////////////////////////////////////////////////////////////
  //  //Now add closing token as hidden text
  ///////////////////////////////////////////////////////////////////////////////
  StartPos := RichEdit1.SelStart ;
  RichEdit1.SelText := TOKEN_LINK_END;
  RichEdit1.SelStart := StartPos;
  RichEdit1.SelLength := Length(TOKEN_LINK_END);

  FillChar(Fmt,0);
  Fmt.cbSize := SizeOf(Fmt);
  Fmt.dwMask := CFM_HIDDEN;
  Fmt.dwEffects := CFE_HIDDEN;

  SendMessage(RichEdit1.Handle,LParaM(@Fmt));
end;

注意 这个问题不是关于能够单击TRichEdit中的链接并将其发送到网站,因此不是其他许多副本的重复(尽管我已经编写了重写WndProc的代码来做到这一点,即使我最后一个单词的格式不正确)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...