IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 124, nombre de questions : 929, dernière mise à jour : 31 décembre 2023  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.

SommaireInterface utilisateurComposantsLe composant TWebBrowser (14)
précédent sommaire suivant
 

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;

Mis à jour le 17 octobre 2013 atlantis Pierre Castelain

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;

Mis à jour le 21 janvier 2014 atlantis


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);

Mis à jour le 21 janvier 2014 atlantis

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;

Mis à jour le 17 octobre 2013 atlantis

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;

Mis à jour le 21 janvier 2014 atlantis

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;

Mis à jour le 17 octobre 2013 atlantis


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);

Mis à jour le 21 janvier 2014 atlantis

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)^.

Mis à jour le 17 octobre 2013 atlantis

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;

Mis à jour le 17 octobre 2013 atlantis

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 := '';

Mis à jour le 17 octobre 2013 atlantis

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);

Mis à jour le 21 janvier 2014 atlantis

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);

Mis à jour le 21 janvier 2014 atlantis

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;
L'interface IHTMLDocument3 n'est disponible qu'à partir de la version 5 d'Internet Explorer.

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;
Ce code peut s'employer comme suit (dans le OnClick d'un bouton nommé Button1 ; Memo1 est un TMemo posé sur la fiche par exemple) :
Code delphi : Sélectionner tout
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Memo1.Lines.Text := RecupererContenu(WebBrowser1); 
end;
Un clic sur Button1 ajoutera la source complète de la page en cours dans votre Memo.
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

Mis à jour le 21 janvier 2014 Bestiol phenixauthor Pierre Castelain

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;
puis utiliser le code suivant :
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;

Mis à jour le 9 octobre 2023 Papy214

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