【发布时间】:2016-10-18 00:42:47
【问题描述】:
我有一个电子邮件客户端,它允许用户更改字体、字体大小、粗体、斜体等。
我遇到的问题是,当我尝试向上或向下更改选择的字体大小时,我得到一个 “EVariantTypeCastError”,并显示“无法将 Null 类型的变体转换为 OleStr 类型”的消息。 TextRange.queryCommandValue('FONTSIZE') 会引发此异常。
procedure TForm1.act_FontIncreaseExecute(Sender: TObject);
var
Selection: IHTMLSelectionObject;
HtmlPage: IHTMLDocument2;
TextRange: IHTMLTxtRange;
Parent: IHTMLElement2;
s: string;
i, mode: Integer;
begin
HtmlPage := self.HtmlEditor.Document as IHTMLDocument2;
Selection := HtmlPage.Selection;
TextRange := Selection.createRange as IHTMLTxtRange;
if (TextRange <> nil) then
begin
s := TextRange.queryCommandValue('FONTSIZE');
val(s, i, mode);
if mode = 0 then
HtmlPage.execCommand('FONTSIZE', False, inttostr(i + 1))
end;
end;
这是增加所选字体大小的正确方法吗?
编辑 1:
示例 HTML:
<HTML><HEAD></HEAD>
<BODY>
<P>
<SPAN style='FONT-SIZE: 7pt;'>
Test Text
</SPAN>
</P>
</BODY></HTML>
看起来问题出在 FONT-SIZE 样式上。当它被取出时,不会抛出异常。我的最终目标是能够从 Outlook 复制和粘贴,这是一个精简的示例。当我使用其他样式(例如颜色:红色)时,不会引发异常。所以看起来它只是 FONT-SIZE 有问题。
编辑 2
异常堆栈跟踪
【问题讨论】:
-
Query/Exec 的参数是 Olevariant。 FontSize 不会总是返回一个整数,在你的情况下它似乎什么都不返回(null)。但是我无法重现您的错误,您可以编辑问题并包含一段重现错误的 html 吗?
-
感谢您的帮助,我会用示例更新问题
-
FONTSIZE命令指的是围绕文本范围的FONT标记:例如<FONT size=1>Test Text</FONT>。在您的 HTML 示例中,您需要处理样式属性/元素。 -
@kobik 谢谢你的帮助。当我将跨度切换为字体并将属性更改为您提到的大小时,我不再遇到异常。此 HTML 是直接从 Outlook 签名粘贴的。 Outlook 签名是否有理由将 FONT-SIZE 放在一个跨度中?从 Word 复制时也遇到同样的错误
-
html5 不支持 FONT 标签。 Outlook/Word 使用 CSS,这是现代 HTML 中的首选方式。
标签: delphi twebbrowser