CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - WebBrowser1 problem z oknem od błędów JS
Strona 1 z 1

WebBrowser1 problem z oknem od błędów JS

Nowy postNapisane: wtorek, 7 grudnia 2010, 21:36
przez Darek_C++
Witam ponownie,
niektóre strony wczytane do WebBrowser1 zresztą do IE powodują wyskakiwanie onka komunikatu błędu np:

Obrazek

Czy jest jakiś Wam znany sposób by wyskakiwanie tego okna wyłączyć z poziomu programu ?

Niestety klikniecie w Nie nie powoduje, że okno przestaje się pojawiać :(

Re: WebBrowser1 problem z oknem od błędów JS

Nowy postNapisane: wtorek, 7 grudnia 2010, 22:10
przez Cyfrowy Baron
Kontrolka WebBrowser nie obsługuje błędów skryptów. Swego czasu szukałem jakichś informacji na temat obsługi tych błędów, ale niestety nic nigdzie o tym nie ma.

Re: WebBrowser1 problem z oknem od błędów JS

Nowy postNapisane: środa, 8 grudnia 2010, 11:45
przez Cyfrowy Baron
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:

KOD cpp:     UKRYJ  
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:

KOD cpp:     UKRYJ  
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ć.