2016-10-18 2 views
1

나는 리터의 시도가의 글꼴 크기를 변경할 때 사용자가 굵게, 기울임 등설정 글꼴 크기

문제 리터 데이 글꼴, 글꼴 크기를 변경할 수있는 이메일 클라이언트가 선택 중 하나를 위 또는 아래로 "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

+1

Query/Exec에 대한 논의는 Olevariant입니다. FontSize는 항상 정수를 반환하지는 않습니다. 귀하의 경우에는 아무것도 반환하지 않는 것 같습니다 (null). 그러나 나는 당신의 오류를 재현 할 수 없다, 당신은 질문을 편집하고 오류를 재현하는 HTML 조각을 포함 할 수 있습니까? – whosrdaddy

+0

도움을 주셔서 감사합니다. 예제로 질문을 업데이트하겠습니다. – MattLaza

+1

'FONTSIZE' 명령은 텍스트 범위를 둘러싸고있는'FONT' 태그를 참조합니다 : 예. ' 테스트 문안'. HTML 예제에서 style 속성/요소를 처리해야합니다. – kobik

답변

1

당신은 어떤 경우에 쿼리가 NULL를 반환하고 Val() 명령이 실패합니다 발견한다.

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이이 경우 도움이되지 않도록 예외를 throw합니다. try except 문을 사용해야합니다. 이 경우 null 인 이유는 무엇입니까? – MattLaza

+0

@MattLaza : 그럼 여기에 게시 한 코드를 사용하지 않습니다. 귀하의 응용 프로그램을 디버깅하고 스택 추적을 제공하십시오 ... – whosrdaddy

+0

나는 분명히 내가 제공 한 코드를 사용하고 있습니다. 또한 스택 추적의 스크린 샷을 첨부했습니다. System.Variants – MattLaza

3

이가 선택의 글꼴의 크기를 증가 할 수있는 올바른 방법입니다 :

이 솔루션은 널 (null)을 얻을 때, 표준 글꼴 크기를 가정 간단하다?

.queryCommandValue('FONTSIZE')

텍스트 범위 (1-7 폰트 크기) 주변 FONT 태그를 말한다 : 예를 들면

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

HTML 예제에는 FONT 태그가 없습니다. FONT-SIZE주위의 스타일 속성 (CSS) SPAN을 처리해야합니다.

(예제를 단순화하기 위해 오류를 검사하지 않음) : 7pt이 표시됩니다. 귀하의 예외 원인은 @whosrdaddy에 의해 설명됩니다. answer (queryCommandValue은 내가 설명한 이유 때문에 null을 반환합니다)

관련 문제