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
- 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 ?
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;
Code c++ : | Sélectionner tout |
1 2 | // Interface d'OCX par défaut TCOMIWebBrowser m_OCXIntf; |
Code c++ : | Sélectionner tout |
// Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf;
Code c++ : | Sélectionner tout |
1 2 | // Interface d'OCX par défaut IWebBrowser2Disp m_OCXIntf; |
Code c++ : | Sélectionner tout |
1 2 3 4 | void __fastcall TForm1::Button1Click(TObject *Sender) { CppWebBrowser1->Navigate((WideString)"c:\\mes documents\\index.htm"); } |
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); |
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); } |
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; } |
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",""); } |
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);
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); |
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);
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);
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); |
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")); } } } |
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)); } } |
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); } } |
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; } |
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; } |
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; } |
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"); } |
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); |
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); } |
Code c++ : | Sélectionner tout |
WebPostData(CppWebBrowser1,"http://www.site.com/page.html","pseudo=monpseudo&pass=monpass&submit=ok");
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 çaLes 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 © 2024 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.