在TWebBrowser选择

时间:2016-10-18 00:42:48

标签: delphi twebbrowser

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

我遇到的问题是当我尝试向上或向下更改选择的字体大小时,我得到一个“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

异常堆栈跟踪

Exception Stack Trace

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;