CPPWebBrowser -> OnDocumentComplete -> Problem



  • Hallo,

    ich nutze die CPPWebBrowser Komponente und nutze das OnDocumentComplete Ereignis um zu ermitteln ob eine Internetseite fertig geladen wurde.

    Nun steht in der Online Hilfe:

    "Bei einem Dokument ohne Frames tritt das Ereignis nur einmal auf. Bei Dokumenten mit mehreren Frames wird es zuerst für jeden Frame und dann noch einmal nach dem Laden des gesamten Dokuments ausgelöst."

    Wenn meine Seite die ich Aufrufe Frames hat, kann ich somit mein Programm nicht korrekt ausführen lassen. Weiter steht in der Hilfe:

    "pDisp enthält die Automatisierungsschnittstelle des Frames oder Browsers der obersten Ebene. Bei einem Dokument ohne Frames ist dies die Schnittstelle des Browsers. Bei Dokumenten mit mehreren Frames gibt der Parameter die Schnittstelle des jeweiligen Frames an. Eine Ausnahme ist das letzte Auftreten des Ereignisses, bei dem der Parameter die Schnittstelle des Browsers enthält."

    Anscheinend gibt es wohl doch eine Möglichkeit um bei Frames herauszufinden ob der letzte Frame geladen wurde, leider kann ich dieses nicht umsetzen. Hat jemand eine Idee?

    Marcel



  • Wie wär's wenn du im DocumentComplete die Busy-Property abfragst? Wenn die true ist sollte das ja eigentlich bedeuten, dass noch Frames geladen werden.



  • Hallo,

    ich bin gerade dabei einige Versuche zu machen. Mein Ziel ist es eine Website zu laden. Diese möchte ich danach 10 Sekunden lang sehen. Danch möchte ich eine Leere Seite anzeigen und diese 5 Sekunden lang einblenden, bis ich meine gewünschte Website erneut für 10 Sekunden anzeigen lasse.

    Leider zeigt der meine Gewünschte Website immer nur beim ersten Schleifendurchlauf für 10 Sekunden an. Danach wird immer nur geladen und die gewünschte Seite wird vielleicht 700milli Sekunden angezeigt.

    Hier mein Quellcode:

    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
      status = 0;
    
      while (status == 0)
      {
         // Gewünschte Seite laden
         Application->ProcessMessages();
         WebBrowser->Navigate(WideString(MyUrl));
         while(WebBrowser->Busy)
            Application->ProcessMessages();
         Application->ProcessMessages();
    
         // 10 SekundenWarten
         Application->ProcessMessages();
         Sleep(10000);
         Application->ProcessMessages();
    
         // Jetzt eine leere Seite anzeigen
         WebBrowser->Navigate(WideString("\1:blank"));
         while(WebBrowser->Busy)
            Application->ProcessMessages();
         Application->ProcessMessages();
    
         // 5 Sekunden warten
         Application->ProcessMessages();
         Sleep(5000);
         Application->ProcessMessages();
      }
    }
    

    Wer hat eine Idee wieso nicht das passiert was ich will?

    Marcel



  • int page = 0;
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      String URL;
      switch (page)
      {
        case 0 :
          URL = myURL;
          break;
        case 1 :
          URL = "\1:blank";
      }
      WebBrowser->Navigate(WideString(URL));
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::WebBrowserDocumentComplete(TObject *Sender,
          LPDISPATCH pDisp, Variant *URL)
    {
      if (!WebBrowser->Busy)
      {
        (page == 0) ? delay(10000) : delay(5000); // delay() siehe FAQ
        page ^= 1;  // zwischen 0 und 1 wechseln
        Button1->Click();
      }
    }
    //---------------------------------------------------------------------------
    


  • Hallo Jansen,

    erstmal danke für dein Beispiel. Ich habe festgestellt, das dies nicht bei mit Internetseiten mit Frames läuft. Hättest du eine Idee, wie ich den Quellcode umändern müsste?

    Marcel



  • Um welche Seiten geht es denn? Ich habe das mit http://www.bytesandmore.de/rad/ getestet und da funktioniert es einwandfrei.



  • Hi,

    hier die Seite eines Internet Shops wo ich neulich mal bestellt hatte. Da ist nen Frame drinnen und da wird was von anderen Servern geladen:

    http://www.tinte-direkt.de

    Hiermit habe ich Probleme.

    Marcel



  • Kann ich nicht nachvollziehen, auch die Seite funktioniert hier mit o.g. Code problemlos.

    Übrigens solltest du statt des Sleep (auch in der delay-Funktion) lieber einen Timer benutzen, das verbessert die Ansprechbarkeit in den "Ruhephasen".


Anmelden zum Antworten