| 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 :
par
TCOMIWebBrowser m_OCXIntf;
|
et par
IWebBrowser2Disp m_OCXIntf;
|
Pour l'utiliser :
void __fastcall TForm1:: Button1Click (TObject * Sender)
{
CppWebBrowser1- > Navigate ((WideString)" c:\\mes documents\\index.htm " );
}
|
|
| 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);
|
où fichierHTML est un AnsiString qui a été initialisé avec une adresse.
|
| 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.
|
| 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 " );
vStyle.OlePropertySet (" OverflowX " ," hidden " );
vStyle.OlePropertySet (" OverflowY " ," hidden " );
vStyle.OlePropertySet (" OverflowX " ," auto " );
vStyle.OlePropertySet (" OverflowY " ," auto " );
vStyle.OlePropertySet (" OverflowX " ," " );
vStyle.OlePropertySet (" OverflowY " ," " );
}
|
|
| 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);
|
|
| 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
Browser- > ExecWB (OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT);
Browser- > ExecWB (OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT);
Browser- > ExecWB (OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT);
|
|
| 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);
|
|
| 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);
|
|
| 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);
|
|
| 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 " ));
}
}
}
|
|
| 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));
}
}
|
|
| 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);
}
}
|
|
| 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;
}
|
|
| 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;
}
|
|
| 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 : Borland Developer Network : How to post data using TCppWebBrowser in C++Builder
|
Consultez les autres F.A.Q.
|
|