问题描述
我正在使用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 "
替换为<a href="
,将"
替换为"
,以获得html <a href="https://stackoverflow.com/">this is a link
要确定链接文本的末尾,以便我可以替换</a>
并正确关闭html超链接,我添加了代码,在TRich中的超文本链接后附加了一个隐藏的文本标记ENDHYPERLINK
。编辑,然后替换</a>
。即替换前的html看起来像HYPERLINK "https://stackoverflow.com/"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 (将#修改为@)