2016-10-18 56 views
1

我有一个电子邮件客户端,它允许用户更改字体,字体大小,我有粗体,斜体等设置字体大小

问题l为当升尝试改变的字体大小选择向上或向下我得到一个“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复制和粘贴,这是一个简单的例子。当我使用其他样式,如颜色:红色,则不会抛出异常。所以它看起来就像它刚刚出现的字体大小一样。

编辑2

异常堆栈跟踪

Exception Stack Trace

+1

Query/Exec的支出是Olevariant。 FontSize不会总是返回一个整数,在你的情况下它似乎没有返回任何东西(null)。但是,我无法重现您的错误,您是否可以编辑问题并包含一段能够重现错误的HTML? – whosrdaddy

+0

感谢您的帮助,我会用示例更新问题 – MattLaza

+1

'FONTSIZE'命令是指文本范围周围的'FONT'标记:例如, '测试文本'。在你的HTML例子中,你需要处理style属性/元素。 – kobik

回答

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; 
+0

感谢您的帮助。 queryCommandValue引发异常,所以VarisNull在这种情况下不起作用。我不得不使用除了语句的尝试。任何想法为什么它在这种情况下为空? – MattLaza

+0

@MattLaza:那么你不使用你在这里发布的代码。调试你的应用程序,并提供一个堆栈跟踪... – whosrdaddy

+0

我绝对使用我提供的代码。我还附上了堆栈跟踪的截图。你可以看到在System.Variants – MattLaza

3

这是正确的做法,以增加字体的大小为 选择?

.queryCommandValue('FONTSIZE')指周围文本范围(字体大小1-7)的FONT标记:例如

<FONT size=1>Test Text</FONT> 

在您的HTML示例中没有FONT标记。您需要处理周围SPAN的属性(CSS)FONT-SIZE样式

例如(无错误检查以简化示例):

if (TextRange <> nil) then 
begin 
    ... 
    ShowMessage(TextRange.parentElement.style.fontSize); 
end; 

这将显示7pt。 您的具体异常原因解释为@whosrdaddy answerqueryCommandValue由于我解释的原因返回null)