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

Composants VCL Delphi Discussion :

Comment modifier une page affichée dans un TWebBrowser ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut Comment modifier une page affichée dans un TWebBrowser ?
    Bonjour,

    J'ai besoin de modifier (convertir en XHTML en fait) une page affichée dans un WebBrowser. La conversion fonctionne bien (merci Tidy!) mais impossible de mettre à jour la page affichée. Apparemment, on ne peut pas écrire dans un WebBrowser.Document.

    Le mieux que j'aie réussi à faire jusqu'ici a été de faire une copie de la page affichée (avec IHTMLDocument2) et de modifier cette copie. Mais cela casse les liens du type href="..." ou src="..." qui font référence à une adresse relative à la page (les objets référencés sont normalement téléchargés avec la page dans les fichiers temporaires d'IE).

    J'ai donc le choix : soit il y a une solution pour modifier le source d'une page affichée dans un WebBrowser à la volée (donc le fichier HTML présent dans les fichiers temporaires d'IE) soit je modifie ma copie du document en insérant l'URL du site là où il faut pour rétablir les références aux objets (galère et je ne suis pas sûr que ça fonctionne...)

    Voici le code qui effectue la conversion sur la copie :

    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 TFNavigateur.ItemCorrigerPageClick(Sender: TObject);
    var
            V, vDocument, vMIMEType, vHTML: OleVariant;
    begin
            //Arrêt du WebBrowser par sécurité...
            WebBrowser1.Stop;
            // On chope le document affiché
            V:= WebBrowser1.Document;
            //puis le script du document (comme en JavaScript...)
            vDocument:= V.script.document;
            // le type MIME qui va bien pour IE
            vMIMEType:= 'text/html';
            // Conversion du document avec Tidy
            Tidy1.LoadConfigFile('\temp\tidyconfig'); //fichier de config pour tidy (Latin1...)
            Tidy1.ParseString(V.body.parentElement.outerHTML);
            vHTML:= Tidy1.XHTML;
            // Réouverture du document pour écriture
            vDocument.Open(vMIMEType);
            //on vire ce qui est déjà dedans
            vDocument.Clear;
            //et on y met la page convertie en XHTML
            vDocument.Write(vHTML);
            //la fermeture du document permet l'affichage dans le WebBrowser
            vDocument.Close;
    end;
    Si quelqu'un a une solution pour réécrire sur le Document du WebBrowser je suis preneur!

    Merci d'avance!

  2. #2
    Rédacteur

    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 450
    Points
    450
    Par défaut
    Salut,

    Avec l'implémentation des interfaces "IMoniker/IPersistMoniker"
    ce problème disparait.

    Voici l'explication (Igor Tandetnik le zeus du webbrowser_ctl) :

    http://groups.google.com/groups?hl=f...TNGP10.phx.gbl


    chaps
    Auteur de NSP (Navigateur Sécurisé Paprika)

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci pour la réponse mais je débute sous Delphi donc là je suis un peu perdu... Je vais chercher par moi même à implémenter ces deux interfaces mais tu n'aurais pas un exemple à me fournir ou au moins de la doc sur ces interfaces?

    En tout cas, me voilà rassuré, il y a bien une solution! Y'a plus qu'à!

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Oui bon, en fait de perdu je suis complètement paumé Apparemment l'implémentation a l'air d'être relativement simple à faire mais je n'y arraive pas! Si quelqu'un peut m'expliquer comment faire ou me donner un exemple d'implémentation d'IMoniker je lui en serais très reconnaissant!

  5. #5
    Rédacteur

    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 450
    Points
    450
    Par défaut
    Salut DeaminC !

    Avec le tag BASE c'est quand même plus facile...

    J'utilise TEmbeddedWB mais avec TWebbrowser c'est le même combat-

    Voici un exemple qui fonctionne (Path relatif au HREF du tag BASE) :

    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
    procedure TForm1.Button3Click(Sender: TObject);
    Const
    HTML_TEST ='<IMG SRC="foo.jpg">';
    var
    v: Variant;
    begin
      // Init Doc
      EmbeddedWB1.AssignDocument;
      // TEST
     (EmbeddedWB1.Document as IHTMLDocument2).clear;
      v := VarArrayCreate([0, 0], varVariant);
      v[0]:='<BASE href="C:\Program Files\Borland\Delphi7\Projects\WbIMoniker\">'+HTML_TEST+'</BASE>';
     (EmbeddedWB1.Document as IHTMLDocument2).Write(PSafeArray(TVarData(v).VArray));
     (EmbeddedWB1.Document as IHTMLDocument2).Close;
     end;
    Enjoy !

    chaps

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    CA MARCHE!!! Oui tu avais raison, l'utilisation de la balise <BASE> est quand même plus simple! Je voulais pas modifier le code de la page chargée mais c'est minime donc ça va.
    Merci encore pour ton aide, c'est super sympa!

  7. #7
    Rédacteur

    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 450
    Points
    450
    Par défaut WebBrowser : URL Relaive via IMoniker
    Salut,

    Pour le coté pédagogique (et pour le fun) voici l'autre méthode pour charger un document dans un webbrowser avec la maitrise du path des éléments du document :

    NB : TEmbeddedWB est utilisé mais c'est pareil avec TWebBrowser.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Type
     
    TMonikerSample = Class(TInterfacedObject,IMoniker)
      public
         // 2 méthodes implémentées Uniquement  **
        function BindToStorage(const bc: IBindCtx; const mkToLeft: IMoniker;
          const iid: TIID; out vObj): HResult; stdcall;   // **
        function GetDisplayName(const bc: IBindCtx; const mkToLeft: IMoniker;
          out pszDisplayName: POleStr): HResult; stdcall; // **
        // Les autres methodes (des interfaces IStream,IPersist) ne sont pas implémentées elles renvoient E_NotImpl;
        function BindToObject(const bc: IBindCtx; const mkToLeft: IMoniker;
          const iidResult: TIID; out vResult): HResult; stdcall;
        function Reduce(const bc: IBindCtx; dwReduceHowFar: Longint;
       ...
    end;
     
     
    implementation
     
    uses UrlMon, // IMoniker
          MSHtml;
     
    function TMonikerSample.GetDisplayName(const bc: IBindCtx;
      const mkToLeft: IMoniker; out pszDisplayName: POleStr): HResult;
    begin
      // Chemin relatif
      pszDisplayName:=StringToOleStr('C:\Program Files\Borland\Delphi7\Projects\WbIMoniker\');
      Result:=S_OK;
    end;
     
    function TMonikerSample.BindToStorage(const bc: IBindCtx;
      const mkToLeft: IMoniker; const iid: TIID; out vObj): HResult;
    Const
     HTML_TEXT ='<IMG SRC="foo.jpg">'; // test
    var
      sl : TStringList;
      sa: TStreamAdapter;
      M: TMemoryStream;
      pcb : Longint;
    begin
      sl:=TStringList.Create;   // pour remplir le stream en 1 coup ...
      sl.Text:=HTML_TEXT;
      M:= TMemoryStream.Create;
      sl.SaveToStream(M);  // Stream init
      M.Seek(0,0); // repositionnement dans le flux
      sa:=TStreamAdapter.Create(M); // IStream
      // Retour de IStream vers le Webbrowser
      IStream(vObj):=(sa as IStream);
      Result:=S_OK;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
    apm : IPersistMoniker;
    begin
      if not Assigned(EmbeddedWB1.Document) then EmbeddedWB1.AssignDocument;
     // Load via IMoniker perso implémenté dans TMonikerSample...
      if ((EmbeddedWB1.Document as IPersistMoniker).Load(TRUE,(TMonikerSample.Create as IMOniker),nil,0)=S_OK)
       then
      begin
      end;
    end;
    enjoy

    chaps
    http://chapsandchips.chez.tiscali.fr

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci pour l'info, effectivement ça pourra me servir si j'ai des problèmes de traitement avec la balise <BASE>. En effet j'envisage des traitements XML (notamment avec XPath) et j'aurai peut-être des problèmes sur les références relatives.

    Merci encore pour ton aide, c'était vraiment bloquant comme problème!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/07/2009, 17h03
  2. [HTML] HTML Comment imbriquer une page HTML dans une autre page
    Par Gerard du Bouchonnois dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 15/06/2006, 17h11
  3. [XHTML11] Comment insérer une page externe dans une page ?
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/03/2005, 19h43
  4. Comment affciher une page web dans ma feuille MDI
    Par callo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2005, 17h23

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