Webbrowser1newwindow2 - ouverture de la nouvelle fenêtre dans notre appli

Contenu du snippet

Plus d'ouverture d'IE. Ouverture multiple de son appli, apparaissant à chaque fois dans la barre des taches, donc plus de fermeture de toutes les "fenêtres" si on ferme la première.

Après une recherche fébrile sur tous les sites in the www, je n'avais pas trouvé de réponse satisfaisante au problème évoqué plus haut.

J'ai donc retroussé les manches, et je tiens enfin la solution. Si vous la trouvez ailleurs, signalez-le moi, j'attaque le Prozac aussitôt ;)

Autant dire que c'est une exclusivité DelphiFr.com...

Merci à leobaillard et à mike255 qui m'ont stimulé à travers les questions-réponses échangées sur ce forum.

Vous remarquerez l'utilisation de l'évènement "TWebBrowser.OnStatusTextChange".

Je vous cite l'aide en ligne de Delphi :

"N'utilisez pas cet événement. Il est inclus dans l'interface TWebBrowser car l'interface IWebBrowser2 est partagée avec Internet Explorer. OnStatusTextChange se produit quand le texte affiché dans la barre d'état d'Internet Explorer change."

Comprenne qui pourra...

Vous noterez au passage que vous disposez ainsi des informations qui s'affichent normalement dans la Barre d'état d'Internet Explorer (URL pointées par la souris, entre autres...)


Mise à jour du code :

Suite à une observation pertinente de DelphiCool, me faisant remarquer que le code ne fonctionnait pas dans le cas d'un clic droit pour ouvrir une nouvelle fenêtre (je ne comprends pas comment ça m'avait échappé, mais c'est vrai que ce n'était pas le but initial...), j'ai modifié la procedure "WebBrowser1StatusTextChange()".

J'y vérifie maintenant que "Text" est une url valide.

Source / Exemple :


var STUrl: String;      // l'URL pointée par la souris
    PathAppli: String;  // répertoire de l'appli
    NameAppli: String;  // nom de l'appli

procedure TForm1.FormCreate(Sender: TObject);
var Param: String;
begin
  Param := ParamStr(1); // URL éventuellement passée en paramètre  
  if Param = EmptyStr then  // si pas de paramètre...
    WebBrowser1.GoHome      // page d'accueil
  else                      // si URL en paramètre...
  begin    
    WebBrowser1.Navigate(
    Param,    // adresse URL
    EmptyParam,
    EmptyParam,
    EmptyParam,
    EmptyParam);
  end;
  PathAppli := ExtractFilePath(Application.ExeName);
  NameAppli := ExtractFileName(Application.ExeName);
end;

procedure TForm1.WebBrowser1StatusTextChange(Sender: TObject;
  const Text: WideString);
var IsUrl: Boolean;
begin
  IsUrl := (Pos('http://', Text) = 1);  // contrôle que Text = URL valide
  StatusBar1.Panels[2].Text := Text;    // affichage de Text
  if IsUrl then                         // si Text = URL valide...
    STUrl := Text;                      // on récupère cette URL
end;

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
  Cancel := True; // annule l'ouverture dans IE
  ShellExecute(   // ouverture dans nouvelle instance de notre appli !
  Handle,
  'Open',
  PChar(PathAppli + '\' + NameAppli),
  PChar(STUrl) ,  // url transmise en paramètre
  '',
  SW_SHOWNORMAL);
end;

Conclusion :


J'avais laissé en standby le "développement" d'un Navigateur utilisant WebBrowser. Je pense que je vais le reprendre afin de partager avec vous quelques astuces.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.