2016-10-18 277 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)