IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Interface > Composants > Le composant TCppWebBrowser
        Quelles sont les solutions pour avoir un composant navigateur web ?
        Comment passer une AnsiString à la méthode Navigate de TCppWebBrowser ?
        Comment afficher une page web construite dans l'application ?
        Comment interdire aux popups de s'ouvrir ?
        Comment contrôler l'affichage des barres de défilement ?
        Comment imprimer le document ?
        Comment sélectionner le document et le copier dans le presse-papier ?
        Comment afficher la boite de dialogue de mise en page ?
        Comment afficher la boite de dialogue de propriétés d'une page ?
        Comment afficher la boite de dialogue enregistrer sous ?
        Comment lister les frames d'une page ?
        Comment lister les liens d'une page ?
        Comment lister les images d'une page, ainsi que leurs propriétés ?
        Comment récupérer le corps d'une page web affichée ?
        Comment récupérer le source HTML d'une page affichée dans un TCppWebBrowser ?
        Comment remplir les champs d'un formulaire et le soumettre ?
        Comment POSTer des données ?



Quelles sont les solutions pour avoir un composant navigateur web ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Deux possibilités se présentent :
  • Allez dans l'onglet Internet de la palette de composants. Si vous avez un composant TCppWebBrowser, c'est celui-ci.
  • Sinon, faites Composants | Importer un contrôle ActiveX. Sélectionnez Microsoft Internet Controls dans la liste et cliquez sur Installer. Choisissez Dans un nouveau paquet et tapez ici quelque chose comme par exemple CppWebBrowser_bpk. Tapez une description (je vous conseille de la commencer par un underscore _ pour repérer vos paquets de ceux installés par défaut, les _ étant placés au début des listes). Validez. Validez à nouveau à la demande d'installation. Après un certain temps, C++Builder vous signale que le composant TCppWebBrowser a été installé. Vous pouvez trouver le composant dans l'onglet ActiveX de la palette de composants. Si vous avez des erreurs lors de l'installation du composant, il vous faudra modifier SHDocVw_OCX.h comme suit :

// Interface d'OCX par défaut TCOMIWebBrowser m_OCXIntf;
par

// Interface d'OCX par défaut
TCOMIWebBrowser m_OCXIntf;
et

// Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf;
par

// Interface d'OCX par défaut
IWebBrowser2Disp m_OCXIntf;
Pour l'utiliser :

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CppWebBrowser1->Navigate((WideString)"c:\\mes documents\\index.htm");
}

Comment passer une AnsiString à la méthode Navigate de TCppWebBrowser ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Il est probable que vous obteniez l'erreur "Impossible de convertir AnsiString en wchar_t*" ou "Impossible de convertir char* en wchar_t*". Vous pouvez convertir votre AnsiString vers un WideString utilisable par le composant en suivant la syntaxe suivante :

WideString Url = fichierHTML;
CppWebBrowser1->Navigate(Url);
fichierHTML est un AnsiString qui a été initialisé avec une adresse.


Comment afficher une page web construite dans l'application ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Il faut utiliser la méthode Navigate d'un composant TCppWebBrowser avec le protocole about. Ce protocole permet de passer le code HTML directement au lieu de passer l'adresse d'un fichier.

void TForm1::Button1Click(TObject *Sender)
{
  WideString source = "about:" + Memo1->Lines->Text;
  CppWebBrowser1->Navigate(source, 0, 0, 0, 0);
}
Dans cet exemple, nous affichons la page web dont le code HTML est tapé dans un TMemo.


Comment interdire aux popups de s'ouvrir ?
Créé le 25/04/2005[haut]
auteur : Atlantis
Lorsque vous intégrez dans votre application l'objet TCppWebBrowser pour naviguer sur Internet, il arrive souvent d'avoir des fenêtres Popup qui s'ouvrent automatiquement. Pour annuler l'ouverture d'Internet Explorer dans ce cas là, vous devez écrire une procédure pour l'évènement OnNewWindow2 de votre TCppWebBrowser pour affecter la valeur TRUE à la variable Cancel.

void __fastcall TForm1::BrowserNewWindow2(TObject *Sender,
      LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel)
{
   *Cancel = TRUE;
}

Comment contrôler l'affichage des barres de défilement ?
Créé le 25/04/2005[haut]
auteurs : Atlantis, Greybird
Suivant la taille que vous donnerez à votre TCppWebBrowser, la navigation peut nécessiter des barres de défilement.

Si la façon dont elles apparaissent ne vous convient pas, vous pouvez contrôler comment elles sont affichées, au moyen du code ci-dessous.

Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vBody = vDocument.OlePropertyGet("Body");
   Variant vStyle = vBody.OlePropertyGet("Style");

   // Pour cacher les barres de défilement
   vStyle.OlePropertySet("OverflowX","hidden");
   vStyle.OlePropertySet("OverflowY","hidden");

   // Pour ne montrer que les barres de défilements nécessaires
   vStyle.OlePropertySet("OverflowX","auto");
   vStyle.OlePropertySet("OverflowY","auto");

   // Pour remettre la valeur par défaut
   // Les deux barres de défilement sont visibles et éventuellement grisées si non nécessaires
   vStyle.OlePropertySet("OverflowX","");
   vStyle.OlePropertySet("OverflowY","");
}

Comment imprimer le document ?
Créé le 25/04/2005[haut]
auteur : Greybird
Pour imprimer le document, il suffit d'utiliser la méthode ExecWB.

Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer le paramètre OLECMDID_PROPERTIES.

Pour afficher la boîte de dialogue d'impression, le second paramètre de ExecWB devra être OLECMDEXECOPT_PROMPTUSER. Dans le cas contraire, ce sera OLECMDEXECOPT_DONTPROMPTUSER.

Browser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER);

Comment sélectionner le document et le copier dans le presse-papier ?
Créé le 25/04/2005[haut]
auteurs : Greybird, Atlantis
Pour sélectionner le document et le copier dans le presse-papier, il suffit d'utiliser la méthode ExecWB.

Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer les paramètres suivants :
  • OLECMDID_SELECTALL : sélectionne tout le document
  • OLECMDID_COPY : copie la sélection dans le presse-papier
  • OLECMDID_CLEARSELECTION : désélectionne tout

// Sélectionner tout
Browser->ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);

// Copier la sélection dans le presse-papier
Browser->ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT);

// Désélectionner tout
Browser->ExecWB(OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT);

Comment afficher la boite de dialogue de mise en page ?
Créé le 25/04/2005[haut]
auteur : Atlantis
Pour afficher la fenêtre que vous voyez ci-dessous, il suffit d'utiliser la méthode ExecWB.

Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer le paramètre OLECMDID_PAGESETUP.

Browser->ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT);

Comment afficher la boite de dialogue de propriétés d'une page ?
Créé le 25/04/2005[haut]
auteur : Atlantis
Pour afficher la fenêtre que vous voyez ci-dessous, et qui est accessible sous IE notamment par le menu Propriétés du menu contextuel, il suffit d'utiliser la méthode ExecWB.

Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer le paramètre OLECMDID_PROPERTIES.

Browser->ExecWB(OLECMDID_PROPERTIES, OLECMDEXECOPT_DODEFAULT);

Comment afficher la boite de dialogue enregistrer sous ?
Créé le 25/04/2005[haut]
auteur : Atlantis
Pour afficher la fenêtre que vous voyez ci-dessous, et enregistrer la page que vous affichez sur votre disque dur, il suffit d'utiliser la méthode ExecWB.

Cette méthode permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer le paramètre OLECMDID_SAVEAS.

Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);
Pour spécifier un nom de fichier par défaut, il faut quelque peu modifier le code :

Variant pIn;
pIn = "nom_page.html";
Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_PROMPTUSER, pIn);

Comment lister les frames d'une page ?
Créé le 25/04/2005[haut]
auteur : Greybird
Il est possible d'obtenir la liste des frames (ou iframes) qui sont présentes dans la page web. La propriété Frames du Document présente cette liste.

Chaque frame, par sa propriété Document, nous permet de récupérer l'URL de la frame.

Le code ci-dessous présente la liste des frames dans un TListBox.

Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vFrames = vDocument.OlePropertyGet("Frames");
   Variant vFramesCount = vFrames.OlePropertyGet("Length");
   for (int i = 0 ; i < vFramesCount ; i++)
   {
      Variant vFrame = vFrames.OleFunction("Item",i);
      Variant vFrameDocument = vFrame.OlePropertyGet("Document");
      if (((IDispatch *)vFrameDocument) != NULL)
      {
         ListBox1->Items->Add(vFrameDocument.OlePropertyGet("URL"));
      }
   }
}

Comment lister les liens d'une page ?
Créé le 25/04/2005[haut]
auteur : Greybird
Il est possible d'obtenir la liste des liens qui sont présents dans la page web. La propriété Links du document (représenté par le Variant vDocument) donne l'accès à cette liste.

Le code ci-dessous présente la liste des liens dans un TListBox.

Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vLinks = vDocument.OlePropertyGet("Links");
   Variant vLinksCount = vLinks.OlePropertyGet("Length");
   for (int i = 0 ; i < vLinksCount ; i++)
   {
      ListBox1->Items->Add(vLinks.OleFunction("Item",i));
   }
}

Comment lister les images d'une page, ainsi que leurs propriétés ?
Créé le 25/04/2005[haut]
auteur : Greybird
Il est possible d'obtenir la liste des images qui sont présentes dans la page web. La propriété Images du document (représenté par le Variant vDocument) donne l'accès à cette liste. Elle nous permet pour chaque image de récupérer l'URL source, mais aussi d'autres propriétés telles que la taille ou le poids de l'image.

Le code ci-dessous présente la liste des images et de certaines de leurs propriétés dans un TListBox.

Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vImages = vDocument.OlePropertyGet("Images");
   Variant vImagesCount = vImages.OlePropertyGet("Length");
   for (int i = 0 ; i < vImagesCount ; i++)
   {
      Variant vImage = vImages.OleFunction("Item",i);
      Variant vImageURL = vImage.OlePropertyGet("Src");
      Variant vImageWidth = vImage.OlePropertyGet("Width");
      Variant vImageHeight = vImage.OlePropertyGet("Height");
      Variant vImageWeight = vImage.OlePropertyGet("FileSize");
      Variant vImageAlt = vImage.OlePropertyGet("Alt");

      AnsiString aInfoImage = Format("%s : %d x %d Pixels; %d octets; %s",
         ARRAYOFCONST((vImageURL,(int)vImageWidth,(int)vImageHeight,(int)vImageWeight,vImageAlt)));
      ListBox1->Items->Add(aInfoImage);
   }
}

Comment récupérer le corps d'une page web affichée ?
Créé le 25/04/2005[haut]
auteur : Greybird
Il est possible de récupérer le contenu du corps (body) d'un page web affichée dans un objet TCppWebBrowser, nommé ici Browser, sous deux formes, HTML ou textuelle.

Le code suivant place ces chacune de ces formes dans des AnsiString.

AnsiString aContenuText = "";
AnsiString aContenuHTML = "";
Variant vDocument = Browser->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vBody = vDocument.OlePropertyGet("Body");
   Variant vContenuText = vBody.OlePropertyGet("InnerText");
   Variant vContenuHTML = vBody.OlePropertyGet("InnerHTML");
   aContenuText = vContenuText;
   aContenuHTML = vContenuHTML;
}

Comment récupérer le source HTML d'une page affichée dans un TCppWebBrowser ?
Mise à jour le 10/12/2007[haut]
auteurs : Greybird, Neilos
Pour récupérer le code source d'une page web, vous pouvez utiliser l'une des deux fonctions dont le code est donné ci-après.
L'appel à ces fonction doit s'assurer que le document est bien complètement chargé. Pour cela, il est conseillé de l'appeller dans la méthode OnDocumentComplete. Attention, consulter l'aide au signet OnNavigateComplete2, OnDocumentComplete, exemple pour savoir comment gérer cet évènement dans le cas d'une page web multi-frames.

A noter qu'en cas d'erreur, ces fonctions renvoient une exception de type EOleSysError, qu'il vous faudra traiter, le catch n'étant là que pour faire le ménage.

La première fonction utilise l'interface IHTMLDocument3, disponible uniquement à partir de Internet Explorer 5.

#include <mshtml.h>
...
AnsiString __fastcall GetSource (TCppWebBrowser * browser)
{
   IHTMLDocument3 *html = NULL;
   IHTMLElement *element = NULL;
   BSTR string = L"";

   try
   {
      if (browser->Document != NULL)
      {
         OleCheck(browser->Document->QueryInterface(IID_IHTMLDocument3,(LPVOID*)&html));
         OleCheck(html->get_documentElement(&element));
         OleCheck(element->get_outerHTML(&string));
      }
   }
   catch (EOleSysError &eOSE)
   {
      if (element != NULL)
      {
         element->Release();
      }
      if (html != NULL)
      {
         html->Release();
      }
      throw eOSE;
   }
   return (AnsiString) string;
}
La seconde fonction fonctionne sur les versions antérieures, mais nécessite plus de travail, et utilise l'interface IHTMLDocument2, ainsi qu'un flux de données.

#include <mshtml.h>
...
AnsiString __fastcall GetSource (TCppWebBrowser * browser)
{
   AnsiString Source = "";
   IHTMLDocument2 *html = NULL;
   IPersistStreamInit *spPsi = NULL;
   IStream *spStream = NULL;
   try
   {
      if (browser->Document != NULL)
      {
         OleCheck(browser->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&html));
         IPersistStreamInit *spPsi = NULL;
         OleCheck(html->QueryInterface(IID_IPersistStreamInit, (LPVOID*)&spPsi));
         if (spPsi != NULL)
         {
            OleCheck(CreateStreamOnHGlobal(NULL, true, &spStream));
            if(spStream != NULL)
            {
               __int64 nSize = 0;
               STATSTG ss;
               LARGE_INTEGER nMove;

               nMove.QuadPart = 0;
               OleCheck(spPsi->Save(spStream, true));
               OleCheck(spStream->Seek(nMove, STREAM_SEEK_SET, (ULARGE_INTEGER*)&nSize));
               OleCheck(spStream->Stat(&ss, STATFLAG_NONAME));

               nSize = ss.cbSize.QuadPart;
               Source.SetLength(nSize);
               OleCheck(spStream->Read((void *)Source.data(), nSize, (ULONG*)&nSize));

               spStream->Release();
               spStream = NULL;
            }
            spPsi->Release();
            spPsi = NULL;
         }
         html->Release();
         html = NULL;
      }
   }
   catch (EOleSysError &eOSE)
   {
      if (spStream != NULL)
      {
         spStream->Release();
      }
      if (spPsi != NULL)
      {
         spPsi->Release();
      }
      if (html != NULL)
      {
         html->Release();
      }
      throw eOSE;
   }
   return Source;
}

Comment remplir les champs d'un formulaire et le soumettre ?
Créé le 21/06/2006[haut]
auteur : Greybird
Il est possible de remplir les champs d'un formulaire et de soumettre ce dernier.

La propriété Forms du document (représenté par le Variant vDocument) donne accès à l'ensemble des formulaires de la page.
Il est alors possible de récupérer l'ensemble du contenu de ce formulaire, via la propriété All du formulaire (représenté par le Variant vForm).
On récupère alors les champs du formulaire, et on positionne leur propriété Value.
Il ne reste alors plus qu'à soumettre le formulaire en appellant sa méthode Submit.

A noter que la récupération du formulaire et des champs se fait au moyen de la propriété NamedItem qui permet de rechercher des tags HTML par leur propriété name.

Le code suivant montre comment remplir les champs login et password d'un formulaire nommé connection, puis de soumettre le formulaire.

Variant vDocument = brwInt->ControlInterface->Document;
if (((IDispatch *)vDocument) != NULL)
{
   Variant vForms = vDocument.OlePropertyGet("Forms");
   Variant vForm = vForms.OleFunction("NamedItem","connection");
   Variant vContent = vForm.OlePropertyGet("All");
   Variant vLoginField = vContent.OleFunction("NamedItem","login");
   Variant vPassField = vContent.OleFunction("NamedItem","password");
   vLoginField.OlePropertySet("Value","UnLogin");
   vPassField.OlePropertySet("Value","UnMotDePasse");
   vForm.OleProcedure("Submit");
}

Comment POSTer des données ?
Créé le 21/06/2006[haut]
auteur : Greybird
Il est possible de poster des données vers une page web avec le composant TCppWebBrowser, mais ce n'est absolument pas trivial. Le code ci-dessous est une version corrigée d'un article sur le portail Borland Developper Network, dont l'explication est hors du périmètre de cette question.

Dans le .h :

private:
   void WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData);
Dans le .cpp :

void TForm1::WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData)
{
   BSTR bstrHeaders = NULL;
   TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
   LPSAFEARRAY psa;
   LPCTSTR cszPostData = sPostData.c_str();
   UINT cElems = lstrlen(cszPostData);
   LPSTR pPostData;
   LPVARIANT pvPostData;

   bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n");
   if (!bstrHeaders)
   {
      Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
      return;
   }

   V_VT(&vHeaders) = VT_BSTR;
   V_BSTR(&vHeaders) = bstrHeaders;

   pvPostData = vPostData;

   if(pvPostData)
   {
      VariantInit(pvPostData);

      psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
      if(!psa)
      {
         return;
      }

      SafeArrayAccessData(psa, (LPVOID*)&pPostData);
      memcpy(pPostData, cszPostData, cElems);
      SafeArrayUnaccessData(psa);

      V_VT(pvPostData) = VT_ARRAY | VT_UI1;
      V_ARRAY(pvPostData) = psa;
   }

   CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
Pour l'appeler :

   WebPostData(CppWebBrowser1,"http://www.site.com/page.html","pseudo=monpseudo&pass=monpass&submit=ok");
lien : en Borland Developer Network : How to post data using TCppWebBrowser in C++Builder


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.