IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Plantage avec TwebBrowser


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Par défaut Plantage avec TwebBrowser
    Bonjour,

    Avec le TWebBrowser, j'ai un plantage sur l'appel de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Webbrowser1.OleObject.Document.links.Length
    ou de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WebBrowser1.OleObject.Document.Images.Length
    La compil passe bien, mais à l'éxécution, j'ai un "Violation d'accès à l'adresse 04590 et des brouettes, Lecture de l'adresse 00000000".

    En pazapa, l'appli pose le crayon.
    En lançant le .exe, j'ai un plantage au premier chargement d'une url, mais l'appli poursuit malgré tout. Ma page s'affiche, mais pas les liens, ni les images.

    Pour avoir l'affichage des liens, ou des images de la page n, que récupère dans un TListBox, je dois afficher la page n+1

    Quelqu'un voit-il la cause de mes soucis ?

    Par ailleurs, je vais utiliser la fonction PosEx, mais je dois sans doute compléter mes uses.
    Et je trouve aucun Posex dans l'aide Delphi (D6 perso).
    Cette aide est vraiment peu bavarde sur tout ce qui est "String"...ou je cherche pas au bon endroit ?

    Merci par avance pour vos infos.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Par défaut
    Et je poursuis avec ma liste de questions

    Là, je suis en train d'essayer de sauver une image d'une page, mais sans passer par une boite de dialogue.

    Ce topic
    http://www.developpez.net/forums/sho...egistrer+image
    parle d'une mystérieuse fonction UrlDownloadToFile pas claire pour moi.

    Je me pose aussi des questions sur cette mystérieuse propriété :
    OleObject.Document.Images du TWebBrowser, et je ne trouve pas cette propriété référencée quelque part...

    Merci pour votre aide.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 117
    Par défaut
    Au départ je pensais à ça, en me disant que c'était trop simple !!!!
    http://www.developpez.net/forums/sho...ghlight=urlmon

    et en fait, ça marche.

    Mais comme j'aimerais régler ce pb de plantage à la 1é url, je laisse le truc sans résolu.

  4. #4
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Bonjour,

    A mon avis ton problème d'exception vient du faite que ton appel à
    Webbrowser1.OleObject.Document.links.Length
    intervient trop tôt.

    fais plutôt l'appel a cette fonction une fois que le document à terminer de charger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
    //allons voir ce qui se passe sur Developpez.com
      WB.Navigate('http://www.developpez.com');
     
    //ERREUR APPEL TROP TOT ALORS EXCEPTION
    //GRRRR PAS BIEN
    //  Showmessage(IntToStr(WB.OleObject.Document.Images.Length)); 
    end;
     
    procedure TForm1.WBDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    begin
    //Ici l'appel est tranquille car le document est chargé et existe :p
      Showmessage(IntToStr(WB.OleObject.Document.Images.Length));
    end;
    J'obtiens donc 86 images sur developpez.com

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    tu devrais vérifier si le Document est chargé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // -----------------------------------------------------------------------------
    procedure WaitWebAssigned(const WebBrowser: TWebBrowser; TimeOut: Cardinal);
    var
       StartTime, PointTime(*, DiffTime*): Cardinal;
    begin
         try
            StartTime := GetTickCount();
            repeat
              Sleep(1); // Il laisse une Milliseconde Entière aux Autres Processus
              Application.ProcessMessages();
              PointTime := GetTickCount();
            // Continue tant que l'Objet est vide ou que le Délai Maximum soit écoulé
            until not VarIsEmpty(WebBrowser.OleObject.Document) or (PointTime >= StartTime+TimeOut);
     
            if not VarIsEmpty(WebBrowser.OleObject.Document) then begin
               StartTime := GetTickCount();
               repeat
                 Sleep(1); // Il laisse une Milliseconde Entière aux Autres Processus
                 Application.ProcessMessages();
                 PointTime := GetTickCount();
               until not VarIsEmpty(WebBrowser.OleObject.Document.Body) or (PointTime >= StartTime+TimeOut);
            end;
         except
            ShowMessage('L''Affichage HTML ne sera pas disponible avant quelques secondes !');
         end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    procedure WaitWebAssigned(const WebBrowser: TWebBrowser; TimeOut: Cardinal);
    var
    StartTime

    (...)
    Pourquoi réinventer la roue quand un évênement OnDocumentComplete existe

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Personnellement, avec des fichiers complexes, j'ai déjà des soucis avec le OnComplete, ayant fait sous Delphi un Bot qui test un site via IE, j'ai pu remarqué
    DocumentOnComplete indique que le HTML est entièrement téléchargé mais n'indique aucunement que l'ensemble des interfaces du Body ont été complètement instanciés, rappelons que les traitements du TWebBrowser sont asynchrones ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    les traitements du TWebBrowser sont asynchrones
    oui, c'est justement à cause de ca que l'erreur suivante est possible...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
      WB.Navigate('http://www.developpez.com');
     
    //puisque le TWebBrowser accède de façon asynchrone au document
    //la ligne suivante crée une erreur car le doc n'est pas tout à fais chargé
      Showmessage(IntToStr(WB.OleObject.Document.Images.Length)); <-- Erreur ici
    end;
    c'est pourquoi il existe le OnDocumentComplete qui permet de passe outre les problèmes liés à l'asynchroneen étant sur que le document est completement chargé!!.

    Noublions pas que TWebBrowser n'est qu'une encapsulation du control d'Internet Explorer (Shdocvw.dll)!

    bref le OnDocumentComplete te certifie que le document est chargé.

    ...DocumentOnComplete indique que le HTML est entièrement téléchargé mais n'indique aucunement que l'ensemble des interfaces du Body ont été complètement instanciés
    si la page est complexe genre avec des frames alors l'evenement est appele autant de fois qu'il a de documents (frames) et même dans pas mal de circonstance.

    si tu veux être sûr que ta page est chargé (et que c'est pas une frame interne par exemple), tu peux le vérifier avec le paramètre VAR: var URL: OleVariant

    je sais pas trop ce qu'on été tes problèmes lors de l'utilisation du TWebBrowser mais moi j'en ai jamais eu.
    J'ai beaucoup utilisé le control d'IE dans différents projets avec delphi et je n'est jamais rencontré les problèmes que tu évoques.

    tu peux me donner un exemple d'une des probleme que tu as rencontré ca m'intéresse.
    merci

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Je me souviens plus des problèmes, j'ai fait cette fonction dans le OnComplete et je n'ai plus eu de problèmes pour lire le InnerHTML (parsage du Body), je l'ai fait aussi pour afficher du HTML issu d'une BD, j'ouvrais la page "About:blank" et au lieu de mettre un gestionnaire sur OnComplete, je mettais cette boucle, et je modifiais le Body.InnerHTML directement ...

    Maintenant, les comportements étaient différents entre un programme compilé en D3 avec un import manuel du TWebBrowser tournant sur un W2K et un programme compilé en D7 utilisant l'unité fourni par Delphi, tournant sur un WXP, ... ayant fait un code pour les deux versions, j'ai eu des problèmes liés à la version de IE et à la version du Wrapper de l'ActiveX, ... sache que la même fonction plante sur l'un et pas sur l'autre, et vice-versa ..., mais as-tu testé de IE 4 jusqu'à IE 6 tous tes codes comme je l'ai fait, tu as des surprises et quelques sécurités inutilement dans certaines versions te sauvent des d'autres ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Fenêtre Enregistrer sous avec TWebBrowser
    Par Chriss dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/03/2006, 21h01
  2. Problème avec TWebBrowser et .exe
    Par secteur_52 dans le forum Composants VCL
    Réponses: 22
    Dernier message: 01/12/2005, 09h19
  3. Réponses: 9
    Dernier message: 17/03/2005, 17h02
  4. Plantage avec la fonction InvalidateRect
    Par SebCBien dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/01/2004, 20h32
  5. Pb de configuration postgre -> plantage avec DB error
    Par liv dans le forum Installation
    Réponses: 6
    Dernier message: 05/11/2003, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo