我有一个电子邮件客户端,允许用户更改字体,字体大小,粗体,斜体等。
我遇到的问题是当我尝试向上或向下更改选择的字体大小时,我得到一个“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复制和粘贴,这是一个精简的例子。当我使用其他样式,如color:red,则不会抛出任何异常。所以它看起来只是FONT-SIZE的问题。
修改2
异常堆栈跟踪
答案 0 :(得分:3)
这是增加字体大小的正确方法吗? 选择?
.queryCommandValue('FONTSIZE')
指的是文本范围周围的FONT
标记(字体大小为1-7):例如
<FONT size=1>Test Text</FONT>
在您的HTML示例中,没有FONT
标记。您需要处理周围FONT-SIZE
的{{1}} 样式属性(CSS)。
e.g。 (没有错误检查以简化示例):
SPAN
这将显示if (TextRange <> nil) then
begin
...
ShowMessage(TextRange.parentElement.style.fontSize);
end;
。
您的具体异常原因由@whosrdaddy answer解释(7pt
因我解释的原因返回null)
答案 1 :(得分:1)
正如您所发现的,在某些情况下,查询将返回NULL
,然后Val()
命令将失败。
解决方案很简单,当你得到null时假定标准字体大小:
procedure TForm1.FontIncreaseExecute;
var
Selection: IHTMLSelectionObject;
HtmlPage: IHTMLDocument2;
TextRange: IHTMLTxtRange;
s: OleVariant;
i, mode: Integer;
begin
HtmlPage := WebBrowser1.Document as IHTMLDocument2;
Selection := HtmlPage.Selection;
TextRange := Selection.createRange as IHTMLTxtRange;
if (TextRange <> nil) then
begin
s := TextRange.queryCommandValue('FONTSIZE');
if VarisNull(s) then
s := 0; // fall back to standard font size
Val(s, i, mode);
if mode = 0 then
HtmlPage.execCommand('FONTSIZE', False, inttostr(i + 1))
end;
end;