FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
- Comment afficher une page construite dans son application ?
- Comment récupérer le contenu affiché dans mon objet TWebBrowser ?
- Comment appeler la boîte de dialogue Enregistrer sous ?
- Comment lister les liens présents dans une page ?
- Comment obtenir la liste et les propriétés des images contenues dans la page ?
- Comment déterminer le nombre de frames dans la page ?
- Comment afficher la fenêtre de mise en page ?
- Comment imprimer le document ?
- Comment annuler l'ouverture d'un popup ?
- Comment cacher les scrollbars ?
- Comment sélectionner tout le document en vue de le copier dans le presse-papier ?
- Comment afficher la fenêtre de propriété du document ?
- Comment récupérer la source complète d'une page ?
- Comment mettre en gras une sélection de texte dans le TWebBrowser ?
Le protocole About vous permet d'envoyer une chaîne de caractères dans votre composant TWebBrowser. Très pratique, ce protocole peut être utilisé pour construire des pages dans votre application et les afficher sans avoir à les enregistrer au préalable. Cette technique est utilisable pour de courts documents.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | procedure TMyForm.MyButtonClick(Sender: TObject); var Flags, TargetFrameName, PostData, Headers: OleVariant; sHTML: String; begin sHTML := { votre code HTML }; MyWebBrowser.Navigate('about:' + sHTML, Flags, TargetFrameName, PostData, Headers); end; |
Si le document que vous voulez afficher est trop important pour être passé par URL (> 2 ko), vous devrez utiliser une autre technique. Celle-ci utilise l'une des interfaces proposées par le composant TWebBrowser pour lui indiquer de charger le code source de la page depuis un flux de données (stream) :
Code delphi : | 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 | uses Classes, Forms, ShDocVw, ActiveX; procedure LoadHTML(AWebBrowser: TWebBrowser; const HTMLCode: string); var ss: TStringStream; sa: TStreamAdapter; begin // Il est nécessaire de réinitialiser la page avec un appel à Navigate AWebBrowser.Navigate('about:blank'); // Il faut attendre que le navigateur soit prêt while AWebBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages; if Assigned(AWebBrowser.Document) then begin // On crée un flux ss:= TStringStream.Create(HTMLCode); try // et un adaptateur IStream sa:= TStreamAdapter.Create(ss); // Ne pas libérer // On appelle la méthode de chargement du WebBrowser (AWebBrowser.Document as IPersistStreamInit).Load(sa); finally // On libère le flux ss.Free; end; end; end; |
Il est possible de récupérer le contenu au format HTML (ou texte) de la page affichée dans le TWebbrowser :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | {Pour récupérer le contenu du body dans un TMemo : } MyMemo.Text := MyWebBrowser.OleObject.Document.Body.InnerHTML; {Pour récupérer le texte du document dans un TMemo : } MyMemo.Text := MyWebBrowser.OleObject.Document.Body.InnerText; |
Pour afficher cette fenêtre et enregistrer la page que vous affichez sur votre disque dur, il suffit d'utiliser la méthode ExecWB qui 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 delphi : | Sélectionner tout |
webbrowser1.ExecWB(OLECMDID_SAVEAS , OLECMDEXECOPT_DODEFAULT);
Il est possible d'obtenir la liste des liens qui sont dans le document. La propriété Webbrowser.OleObject.Document.links.length vous indique le nombre de liens présents dans votre document et la propriété Webbrowser.OleObject.Document.links.item(i) contient les liens.
Exemple : récupérer la liste des liens dans un TMemo :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 | var i : Integer; begin for i:=0 to MyWebbrowser.OleObject.Document.Links.Length-1 do MyMemo.Lines.Add(MyWebbrowser.OleObject.Document.Links.Item(i)); end; |
Le nombre d'images contenu dans la page affichée est stocké dans la variable
Code delphi : | Sélectionner tout |
Webbrowser1.OleObject.Document.Images.Length
Pour chaque image il est possible d'obtenir la Hauteur, la largeur, l'URL de l'image, le poids de l'image et le texte de l'info bulle.
- Largeur : WebBrowser1.OleObject.Document.Images.Item(i).Width;
- Hauteur : Webbrowser1.OleObject.Document.Images.Item(i).Height;
- Poids : Webbrowser1.OleObject.Document.Images.Item(i).FileSize;
- Info Bulle : Webbrowser1.OleObject.Document.Images.Item(i).Href;
Exemple :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | procedure TIexplore.ToolButton5Click(Sender: TObject); var i: Word; Largeur, Hauteur: Integer; Infobulle, Poids, URLImage: string; begin for i := 0 to WebBrowser1.OleObject.Document.Images.Length - 1 do begin Largeur := WebBrowser1.OleObject.Document.Images.Item(i).Width; Hauteur := WebBrowser1.OleObject.Document.Images.Item(i).Height; Poids := WebBrowser1.OleObject.Document.Images.Item(i).FileSize; URLImage := WebBrowser1.OleObject.Document.Images.Item(i).Href; Infobulle := WebBrowser1.OleObject.Document.Images.Item(i).alt; ListBox1.Items.Add(Format('%s : %d x %d Pixels; %s octets; %s', [URLImage, Largeur, Hauteur, poids, InfoBulle])); end; end; |
Certaines pages beb sont divisées en frames. Pour savoir le nombre de frames présentes dans votre navigateur, il vous suffit d'interroger la propriété WebBrowser.OleObject.Document.frames.length :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | var nombreframes: integer; begin nombreframes := MyWebBrowser.OleObject.Document.Frames.Length; end; |
Pour afficher cette fenêtre il suffit d'utiliser la méthode ExecWB qui 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 delphi : | Sélectionner tout |
Webbrowser1.ExecWB(OLECMDID_PAGESETUP , OLECMDEXECOPT_DODEFAULT);
Pour imprimer le document avec Internet Explorer 4 ou supérieur, vous devez utiliser la propriété ControlInterface pour accéder à l'interface du composant WebBrowser (cette interface permet à un contrôleur Automation d'accéder aux propriétés, méthodes et événements du navigateur web).
Dans cet exemple, l'impression du document complet sera envoyée sans que la boîte de dialogue d'impression n'apparaisse. Pour afficher la boîte de dialogue, il faut remplacer OLECMDEXECOPT_DONTPROMPTUSER par OLECMDEXECOPT_PROMPTUSER.
Code delphi : | Sélectionner tout |
1 2 3 4 5 | var vaIn, vaOut: OleVariant; begin MyWebBrowser.ControlInterface.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut); end; |
Avec Internet Explorer 3, vous devez utiliser la méthode suivante :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | procedure PrintIE; var CmdTarget : IOleCommandTarget; vaIn, vaOut: OleVariant; begin if MyWebBrowser.Document <> nil then try MyWebBrowser.Document.QueryInterface(IOleCommandTarget, CmdTarget); if CmdTarget <> nil then try CmdTarget.Exec( PGuid(nil), OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut); finally CmdTarget.Release; end; except {Rien } end; end; |
Si vous utilisez Delphi 2 ou 3, vous devez remplacer PGuid(nil) par PGuid(nil)^.
Lorsque vous intégrez dans votre application l'objet TWebBrowser 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 TWebBrowser pour affecter la valeur True à la variable Cancel.
Code delphi : | Sélectionner tout |
1 2 3 4 | procedure TMyForm.MyWebBrowserNewWindow2(Sender: TObject; var ppDisp: IDispatch; var Cancel: WordBool); begin Cancel := True; end; |
Selon la taille des pages affichées, les scroolbars apparaissent automatiquement.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | {Pour cacher les scrollbars : } MyWebBrowser.OleObject.Document.Body.Style.OverflowX := 'hidden'; MyWebBrowser.OleObject.Document.Body.Style.OverflowY := 'hidden'; {Pour réafficher les scroolbars : } MyWebBrowser.OleObject.Document.Body.Style.OverflowX := ''; MyWebBrowser.OleObject.Document.Body.Style.OverflowY := ''; |
Il suffit d'utiliser la méthode ExecWB qui permet d'utiliser l'interface IOleCommandTarget pour transmettre une commande au contrôle navigateur Web, et de lui passer le paramètre suivant :
OLECMDID_SELECTALL pour sélectionner tout
OLECMDID_COPY pour effectuer la copie vers le presse papier
Code delphi : | Sélectionner tout |
1 2 3 4 5 | // Sélectionner tout webbrowser1.ExecWB(OLECMDID_SELECTALL , OLECMDEXECOPT_DODEFAULT); // Copier Webbrowser1.ExecWB(OLECMDID_COPY , OLECMDEXECOPT_DODEFAULT); |
Dans internet Explorer, lorsque l'on appel le menu contextuel sur la page, l'option propriété permet d'afficher la fenêtre suivante :
Pour afficher cette fenêtre il suffit d'utiliser la méthode ExecWB qui 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 delphi : | Sélectionner tout |
Webbrowser1.ExecWB(OLECMDID_PROPERTIES , OLECMDEXECOPT_DODEFAULT);
Afin d'analyser le contenu d'une page web, il peut être intéressant de récupérer l'intégralité de ses sources, en-tête HTML compris. Il y a pour cela deux méthodes.
La première, la plus simple, emploie l'interface IHTMLDocument3 :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | procedure RecupererContenu1(CurrentWB: TWebBrowser; var Code: String); begin // recuperation du code entier Code := (CurrentWB.Document as IHTMLDocument3).documentElement.outerhtml; end; |
Il y a donc une autre méthode pour récupérer la source complète d'un document. Elle est plus longue, et utilise un flux de données.
Voici une fonction qui renverra une String contenant la source complète de la page.
Code delphi : | 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 | function RecupererContenu2(WB: TWebBrowser): String; var PersistStream: IPersistStreamInit; Stream: IStream; StrStream: TStringStream; begin // S'il n'y a pas de document assigné pour le TWebBrowser if not Assigned(WB.Document) then begin Result := ''; Exit; end; // TWebBrowser.Document implémente les fonctionnalités de l'interface // IPersitStream. On en demande l'accès ici. PersistStream := WB.Document as IPersistStreamInit; // Création d'un flux de caractères (vide au départ) StrStream := TStringStream.Create(''); try // On crée une instance de TStreamAdapter en demandant les // fonctionnalités de l'interface IStream. Ce sera notre "pont" entre // le stream de caractères et le document HTML. Stream := TStreamAdapter.Create(StrStream, soReference) as IStream; // Essai de sauvegarde du document dans le stream qui vient d'être créé if Failed(PersistStream.Save(Stream, True)) then Result := '' else begin // Si ça s'est bien passé, on remet le stream de caractères au début StrStream.Position := 0; // Et on renvoie ce qu'il contient Result := StrStream.Read(StrStream.Size); end; finally StrStream.Free; end; end; |
Code delphi : | Sélectionner tout |
1 2 3 4 | procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Text := RecupererContenu(WebBrowser1); end; |
Vous pouvez aussi récupérer uniquement le code de la zone "body" de la page en cours.
- IHTMLDocument se trouve dans MSHTML.pas
- IPersistStreamInit se trouve dans ActiveX.pas
- IStream se trouve dans IStreams
Passer le TwebBrowser en mode édition :
Code : | Sélectionner tout |
1 2 3 4 | procedure TWebBrowserHelper.ActiveEdition(Activer: Boolean); begin (Document as IHTMLDocument2).designMode := IfThen(Activer, 'on', 'off'); end; |
Code : | 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 | procedure TWebBrowserHelper.SetSelectionGras; var elemstrong : IHTMLElement; styl : IHTMLStyle; Sel : IHTMLSelectionObject; range: IHTMLTxtRange; Doc : IHTMLDocument2; begin Doc := (Document as IHTMLDocument2); Sel := Doc.selection; if Assigned(Sel) then begin if (Sel.type_ = 'Text') then begin range := Sel.createRange as IHTMLTxtRange; elemstrong := Doc.createElement('strong'); elemstrong.style.fontWeight := 'bold'; elemstrong.innerText := Range.text; Sel.clear; range.pasteHTML(elemstrong.outerHTML); end; end; end; |
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.