W poprzednim poście wyraziłem się nieprecyzyjnie. Można przechwycić komunikat o błędzie skryptu, ale niewiele można z tym zrobić. Z problemem zetknąłem się przy tworzeniu programu
Babilon. obszedłem go jednak w dość nietypowy sposób. Po pojawieniu się błędu skryptu program po prostu przywołuje okno właściwości ładowanej strony, co pozwala stronie na dalsze ładowanie, o ile skrypt tego nie zablokuje.
By okno błędów skryptów nie pojawiało się trzeba ustawić właściwość Silent kontrolki na true;
- Kod: Zaznacz cały
WebBrowser1->Silent = true;
WebBrowser1->Navigate(L "about:blank");
W celu przechwycenia komunikatu o błędzie skryptu trzeba umieścić na formularzu komponent
TApplicationEvents i utworzyć zdarzenie
OnException. W zdarzeniu umieszczamy taki kod:
void __fastcall TEdytorMainForm::ApplicationEvents1Exception(TObject *Sender,
Exception *E)
{
if(E->Message == "Invalid floating point operation")
{
Timer1->Enabled = true;
WebBrowser1->ExecWB(Shdocvw_tlb::OLECMDID::OLECMDID_PROPERTIES,
Shdocvw_tlb::OLECMDEXECOPT::OLECMDEXECOPT_DODEFAULT);
Application->ProcessMessages();
}
}
Potrzebny jest jeszcze komponent
Timer1 z właściwością
Interval = 25. W zdarzeniu
OnTimer tego zegara program będzie przechwytywał okno właściwości strony i zamykał je:
void __fastcall TEdytorMainForm::WBTimerTimer(TObject *Sender)
{
HWND hWnd = FindWindow(NULL, L"Właściwości");
if(hWnd)
{
<span class="posthilit">SendMessage</span>(hWnd, WM_CLOSE, 0, 0);
Timer1->Enabled = false;
}
}
Zdaję sobie sprawę, że to kiepskie rozwiązanie, ale to najlepsze co na razie udało mi się wymyślić.