FAQ C++ BuilderConsultez toutes les FAQ

Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010  Ajouter une question

 

Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.

L'équipe C++ Builder de Developpez.

Commentez cette FAQ : Commentez


SommaireInterface bisComposantsLe composant TCppWebBrowser (17)
précédent sommaire suivant
 

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 :


Code c++ : Sélectionner tout
// Interface d'OCX par défaut TCOMIWebBrowser m_OCXIntf;
par

Code c++ : Sélectionner tout
1
2
// Interface d'OCX par défaut 
TCOMIWebBrowser m_OCXIntf;
et

Code c++ : Sélectionner tout
// Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf;
par

Code c++ : Sélectionner tout
1
2
// Interface d'OCX par défaut 
IWebBrowser2Disp m_OCXIntf;
Pour l'utiliser :

Code c++ : Sélectionner tout
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender) 
{ 
  CppWebBrowser1->Navigate((WideString)"c:\\mes documents\\index.htm"); 
}

Mis à jour le 1er septembre 2004 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 :

Code c++ : Sélectionner tout
1
2
WideString Url = fichierHTML; 
CppWebBrowser1->Navigate(Url);
fichierHTML est un AnsiString qui a été initialisé avec une adresse.

Mis à jour le 1er septembre 2004 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.

Code c++ : Sélectionner tout
1
2
3
4
5
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.

Mis à jour le 1er septembre 2004 Geronimo

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.

Code c++ : Sélectionner tout
1
2
3
4
5
void __fastcall TForm1::BrowserNewWindow2(TObject *Sender, 
      LPDISPATCH *ppDisp, VARIANT_BOOL *Cancel) 
{ 
   *Cancel = TRUE; 
}

Mis à jour le 25 avril 2005 atlantis

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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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",""); 
}

Mis à jour le 25 avril 2005 atlantis 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.

Code c++ : Sélectionner tout
Browser->ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER);

Mis à jour le 25 avril 2005 Greybird

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


Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
// 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);

Mis à jour le 25 avril 2005 atlantis Greybird

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.

Code c++ : Sélectionner tout
Browser->ExecWB(OLECMDID_PAGESETUP, OLECMDEXECOPT_DODEFAULT);

Mis à jour le 25 avril 2005 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.

Code c++ : Sélectionner tout
Browser->ExecWB(OLECMDID_PROPERTIES, OLECMDEXECOPT_DODEFAULT);

Mis à jour le 25 avril 2005 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.

Code c++ : Sélectionner tout
Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);

Pour spécifier un nom de fichier par défaut, il faut quelque peu modifier le code :

Code c++ : Sélectionner tout
1
2
3
Variant pIn; 
pIn = "nom_page.html"; 
Browser->ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_PROMPTUSER, pIn);

Mis à jour le 25 avril 2005 atlantis

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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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")); 
      } 
   } 
}

Mis à jour le 25 avril 2005 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 VariantvDocument) donne l'accès à cette liste.

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

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
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)); 
   } 
}

Mis à jour le 25 avril 2005 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 VariantvDocument) 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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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); 
   } 
}

Mis à jour le 25 avril 2005 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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
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; 
}

Mis à jour le 25 avril 2005 Greybird

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.

Code c++ : Sélectionner tout
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
#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.

Code c++ : Sélectionner tout
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
#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; 
}

Mis à jour le 25 avril 2005 Greybird Neilos

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 VariantvForm).
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 appelant sa méthode Submit.

À 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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
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"); 
}

Mis à jour le 21 juin 2006 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 :

Code c++ : Sélectionner tout
1
2
private: 
   void WebPostData(TCppWebBrowser *CppWebBrowser, String sURL, String sPostData);
Dans le .cpp :

Code c++ : Sélectionner tout
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
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 :

Code c++ : Sélectionner tout
WebPostData(CppWebBrowser1,"http://www.site.com/page.html","pseudo=monpseudo&pass=monpass&submit=ok");

Mis à jour le 21 juin 2006 Greybird

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2020 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.