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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Choisir la version d'internet de fonctionnement de Webbrowser


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Choisir la version d'internet de fonctionnement de Webbrowser
    Bonjour à tous

    J'ai un problème pour faire fonctionner le Webbrowser pour certain site internet.

    J'ai trouvé ceci sur http://stackoverflow.com/questions/6...ion-at-runtime

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     TIEMode = (iemUnknown, iemIE7, iemIE8, iemIE9, iemIE10);
     // iemUnknown, don't use this as parameter, return result only
     // iemIE10: To run a WebBrowser control in IE10 Standards Mode
     // iemIE9: To run a WebBrowser control in IE9 Standards Mode
     // iemIE8: To run a WebBrowser control in IE8 Standards Mode
     // iemIE7: To run in IE7 Standards Mode
     
    function embeddedWebbrowserMode(bSet : Boolean; Mode: TIEMode; AppName: string = '') : LongInt;
    const
      REG_KEY = 'Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION';
     
    var
      Reg: TRegistry;
      Value: LongInt;
      i : LongInt;
     
    begin
      Result:=0;
      if( bSet ) and ( Mode = iemUnknown ) then
       Exit;
     
      if AppName = '' then
        AppName := ExtractFileName(Application.ExeName);
     
      if( bSet ) then
       case Mode of
         iemIE7 :  Value := 7000;
         iemIE8 : Value := 8888;
         iemIE9 : Value:=9999;
         else Value:=10001; // IE10 standards mode
       end
      else Value:=0; 
     
      Reg:=nil;
      try
       Reg := TRegistry.Create();
       Reg.RootKey := HKEY_CURRENT_USER;
        if( Reg.OpenKey(REG_KEY, True) ) then
        begin
          if( bSet ) then
           begin
            Reg.WriteInteger(AppName, Value);
            Result:=Value;
           end
          else Value:=Reg.ReadInteger( AppName );
          Reg.CloseKey;
        end;
      except;
      end;
     
      if( Assigned( Reg )) then
       FreeAndNil(Reg);
     
      if( NOT bSet ) and ( Value > 0 ) then
      begin
       i:=Value div 1000;
       if( i >= 7 ) and ( i <= 10 ) then
        begin
            case i of
             7000  : Result:=Byte(iemIE7);
             8888  : Result:=Byte(iemIE8);
             9999  : Result:=Byte(iemIE9);
             10001 : Result:=Byte(iemIE10);
              else begin
                    if( i >=10 ) then
                     Result:=Byte(iemIE10);
                   end;
            end;
        end;
      end;
    end;
     
    function setEmbeddedWebbrowserMode(Mode: TIEMode; AppName: string = '') : boolean;
    begin
     Result:=( embeddedWebbrowserMode(TRUE, Mode, AppName ) > 0 ); 
    end;
     
    function getEmbeddedWebbrowserMode( AppName: string = '' ) : TIEMode;
    begin
     Result:= TIEMode( Byte( embeddedWebbrowserMode(FALSE, iemUnknown, AppName ))); 
    end;
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    initialization
     setEmbeddedWebbrowserMode( iemIE9 );
    J'ai bien tenter de le faire fonctionner, mais sans succès. Ce n'est pas surprenant, j'y comprend pas grand chose...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Ça va juste ajouter le nom de ton appli à une clef de la base de registre pour dire à IE quelle version il doit émuler pour elle (pour l'utilisateur courant), ou lire cette version.

    Un commentaire dans le fil cité soulève que l'appli doit pê être redémarrée pour que le changement soit pris en compte.

    Ensuite, si ne fonctionne toujours pas, teste la valeur de retour, utilise la fonction get... pour voir ce qu'elle retourne.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    J'utilise le code suivant pour indiquer la bonne version d'émulation du TWebBrowser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    // Renvoie la version d'IE
    function TForm1.GetIEVersion:string;
    var
       Registry: TRegistry;
       resultat : String;
     begin
       Registry := TRegistry.Create(KEY_READ);
       resultat := '';
       try
         Registry.RootKey := HKEY_LOCAL_MACHINE;
     
         // False car nous ne voulons pas la créer si elle n'existe pas
         Registry.OpenKey('SOFTWARE\Microsoft\Internet Explorer', False);
     
         Resultat := Registry.ReadString('svcVersion');
       finally
         Registry.Free;
       end;
       result := resultat;
    end;
     
    // Vérifie si monAppli est déjà référencée dans la clé de registre
    function TForm1.VerifMonAppliIEEmulation(monAppli :String):boolean;
    var
       Registry: TRegistry;
     begin
       Registry := TRegistry.Create(KEY_READ);
       try
         Registry.RootKey := HKEY_CURRENT_USER;
     
         // False car nous ne voulons pas la créer si elle n'existe pas
         Registry.OpenKey('Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION', False);
         Result := Registry.ValueExists(monAppli);
       finally
         Registry.Free;
       end;
    end;
     
    // Référencement de monAppli dans la clé de registre qui va bien
    procedure TForm1.SetIEEmulation;
    var
      versionIE, monAppli : string;
      Registry: TRegistry;
    begin
     
      monAppli := ExtractFileName(Application.ExeName);
     
      if VerifMonAppliIEEmulation(monAppli) = false then
      begin
        versionIE := RWord(GetIEVersion,1,'.');
        Registry := TRegistry.Create(KEY_WRITE);
         try
           Registry.RootKey := HKEY_CURRENT_USER;
           Registry.OpenKey('Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION', True);
           if versionIE = '11'  then
           begin
             Registry.writeInteger(monAppli, 11000);
           end
           else
           begin
             if versionIE = '10'  then
             begin
               Registry.writeInteger(monAppli, 10000);
             end
             else
             begin
               if versionIE = '9'  then
               begin
                 Registry.writeInteger(monAppli, 9000);
               end
               else
               begin
                 if versionIE = '8'  then
                 begin
                   Registry.writeInteger(monAppli, 8000);
                 end
                 else
                 begin
                   Registry.writeInteger(monAppli, 7000);
                 end;
               end;
             end;
           end;
         finally
           Registry.Free;
         end;
      end;
     
    end;
    Ensuite, j'invoque SetIEEmulation dans le OnCreate de la fichier principale.

    Ce code fonctionne et, par rapport au code proposé, prend en compte aussi IE 11 mais je ne me souviens plus où j'avais trouvé l'information.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    j'avais tenté une réponse hier, mais le serveurs s'était bloqué et du coup ma réponse s'est perdue du coup je résume

    ce qui me gène c'est l'utilisation de la base de registre pour ce genre de chose
    1- tout d'abord parce que qui dit modification de la base de registre dit droits administrateur
    2- ensuite parce que, dépendant de la clé utilisée HKLM ou HKCU (oui les 2 sont utilisables) pour la première la version de l'OS 64 ou 32 bits sera importante
    3- qui dit modification de la base de registre demande à ce que le programme soit redémarré pour prise en compte, alors que cette modification n'est de fait nécessaire qu'une seule fois
    4- enfin, (point important), il faut savoir que s'il y a une indication de la version dans la page HTML c'est celle-ci qui sera pris en compte !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai retrouvé où j'avais trouvé l'information. C'était à partir de l'aide d'Embarcadero (http://docwiki.embarcadero.com/Libra...Vw.TWebBrowser) qui mentionne le lien suivant : https://msdn.microsoft.com/en-us/lib...wser_emulation.

    Dans mon exemple de code, c'est la clé HKCU qui est utilisée : donc pas de droit administrateur spécifique à avoir. De plus, avant de faire la modification, on vérifie si celle ci n'est pas déjà faite et enfin, il n'y a pas besoin de redémarrer le programme. Par contre, il est vrai que je n'ai utilisé ce code que dans une application Windows 32 bits. Je n'ai pas fait d'essai en 64 bits.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Merci à tous

    Des champions !!!

    En passant la fonction Rword dans les routines suggérées n'est pas une fonction standard de Delphi. [RREX peut-être ?]

    Dans ce cas précis, c'est la portion à gauche du point dans la chaine.

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bien vu pour la fonction RWord . Elle fait partie de fonctions que j'avais trouvées utiles en Rexx et que j'avais réécrites en Delphi. Cela fait un moment et je les utilise toujours. Le code que j'ai fourni est tiré d'une de mes applis, j'avais rapidement nettoyé le code et j'ai laissé par erreur cette fonction non standard.
    Dans cet exemple, la fonction renvoie le premier mot de la chaîne de caractères passée en paramètre en prenant comme séparateur le point.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo