2012-01-04 2 views
4

J'ai créé un TEventObject pour fournir les événements OnMouseDown et OnMouseMove pour TWebBrowser. Les événements fonctionnent parfaitement lorsque vous déplacez la souris et lorsque vous cliquez dans le navigateur Web, mais lorsque je fais défiler ou que je clique sur la barre de défilement verticale du navigateur, une exception EZeroDivide apparaît. EurekaLog signale une exception EZeroDivide dans d2d1.dll. J'ai essayé de piéger l'exception, mais rien que j'ai essayé semble fonctionner:TEventObject et WebBrowser

function TEventObject.Invoke(DispID: integer; const IID: TGUID; LocaleID: integer; Flags: Word; var Params; 
    VarResult, ExcepInfo, ArgErr: Pointer): HResult; 
begin 
    try 
    if (DispID = DISPID_VALUE) then 
    begin 
     if Assigned(FOnEvent) then 
     FOnEvent; 
     Result := S_OK; 
    end 
    else 
    begin 
     FOnEvent := nil; 
     Result := E_NOTIMPL; 
    end; 
    except 
    on EZeroDivide do 
    begin 
     FOnEvent := nil; 
     Result := E_NOTIMPL; 
    end; 
    end; 
end; 

Ma question est ce que je peux empêcher l'exception d'une certaine manière ou peut mousedown sur la barre de défilement vertical TWebBrowser être détecté pour empêcher l'exception? Cette exception est difficile à résoudre car je ne connais pas grand chose à TEventObject et je ne comprends pas pourquoi l'exception n'apparaît qu'en cliquant ou en faisant glisser la barre de défilement verticale. Je peux fournir plus d'informations si nécessaire. Compilateur Delphi 2010.

[Modifier] Voir ce post: http://www.codenewsfast.com/cnf/article/0/waArticleBookmark.7401953 Une application de démonstration très simple est disponible à l'adresse: http://dl.dropbox.com/u/2167512/bugs/ie9/ie9_bug.zip

Cela évite le bug:

Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,exOverflow, exUnderflow, exPrecision]); 
+0

d2d1.dll est une partie de MS Direct2D – OnTheFly

+0

possible en double http://gastonx.net/?p=10: D – TLama

+0

Ja, das ist gut! :-P – kobik

Répondre

2

essayer pour désactiver les exceptions FPU:

System.Set8087CW($133F); 

Dans les versions les plus récentes de Delphi:

Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]); 
+0

Merci beaucoup. SetExceptionMask empêche l'exception ... Voir ma modification. Peut-il y avoir des effets secondaires de cela? – Bill

+0

Oui et tous dans toute l'application. – TLama

+0

J'ai eu une longue discussion [http://stackoverflow.com/questions/8200581/twebbrowser-crashes-with-embedded-youtube-clips] sur ce problème. ma conclusion est qu'il n'y a pas d'effets secondaires. – kobik