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

WinDev Discussion :

ActiveX "shell.Explorer" et la propriété ObjectForScripting [WD11]


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut ActiveX "shell.Explorer" et la propriété ObjectForScripting
    Bonjour,

    Voici ce que permet un site suivant sa documentation:

    « Les informations concernant la pièce peuvent être communiquées
    du site vers votre application. Pour utiliser cette fonctionnalité, vous
    devez implémenter un "WebBrowser" dans votre application qui supporte
    "javascript window.external object".

    Chaque pièce affichée sur le site possède un bouton "Transfert".

    Lorsque le clic souris survient sur le bouton, les informations concernant
    la pièce sont incrites dans une chaine XML et passée en argument à:

    window.external.TransfertXML(XMLchaine)

    TransfertXML est la procédure de votre application qui reçoit les informations
    XML de la pièce en paramètre. »


    Le code suivant en C# exécute parfaitement ce qui est décrit ci-dessus:

    namespace MonExecutable
    {
    [ComVisible(true)]
    public partial class FORM1 : Form
    {
    public FORM1(string pUrl)
    {
    InitializeComponent(); // Initialisation de la fenêtre FORM1
    WebBrowser1.ObjectForScripting = this; // En wlangage ???
    WebBrowser1.Navigate(pUrl); // En wlangage correspond à WebBrowser1>>Navigate(pUrl)
    }

    public void TransferXML(string XMLchaine) // Procédure déclenchée par le bouton "Transfer" du site...
    {
    MessageBox.Show(XMLchaine); // Affichage du XML de la pièce...
    }
    }
    }


    Maintenant, comment implémenter ce code en WLANGAGE: WebBrowser1.ObjectForScripting = this; ?
    Cette routine est-elle réalisable sous Windev par l'ActiveX "Shell.Explorer" ou par une autre méthode ?
    Ou est-ce tout simplement irréalisable sous Windev ?


    Merci

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    bonjour,

    j'ai bien l'impression que la propriété ObjectForScripting ne soit pas accessible dans l'activeX WebBrowser (d'ailleurs elle n'est pas proposée) mais seulement dans le controle dotnet WebBrowser ( System.Windows.Forms (dans System.Windows.Forms.dll));

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    bonjour,

    mais seulement dans le controle dotnet WebBrowser ( System.Windows.Forms (dans System.Windows.Forms.dll));

    Ami calmant, J.P
    D'ailleurs, J'ai pensé utiliser l'option du menu windev "Utiliser un assemblage .NET dans ce projet"

    J'ai ainsi la possibilté d'utiliser ceci:
    oWebBrowser est un WebBrowser
    oWebBrowser:ObjectForScripting = Mafenêtre..Nom (dans c# le .this réfère à la fenêtre)
    oWebBrowser:Navigate(pUrl)

    Le problème:
    Quel champ utilisé ? Le champ ActiveX ? Le champ HTML ?
    Comment associer l'objet (le contrôle) oWebBrowser à un champ windev pour le voir dans ma fenêtre ?

    Qu'en pensez-vous ?

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Bonjour,

    j'arrive à peu près à faire ce que tu veux faire mais c'est plutôt l'usine à gaz et je suis pas sur qu'en WD11 tu arrives à tout faire (j'utilise WD16)

    alors voici les différentes étapes :

    1 - intégration du Control Dotnet WebBrowser dans une fenêtre windev :
    j'utilise un conteneur de type Champ fenêtre interne, (si quelqu'un a mieux ?)
    il faut intégrer les assemblages dotnet MSCorLib, System, System.Drawing et System.Windows.Forms

    voici le code pour initialiser le control WebBrowser dans le conteneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    iHdle2 est un entier système
    // WebBrowser -> Contrôle Dotnet 
    oWebBrowser est un WebBrowser
    // Conteneur est un champ fenêtre interne
    // on adapte le WebBrowser à la taille du champ Conteneur
    AncrageWebBrowser est un Point(Conteneur..X,Conteneur..Y)
    tailleWebBrower est une Size(Conteneur..Largeur,Conteneur..Hauteur)
    oWebBrowser:Set_Location(AncrageWebBrowser)
    oWebBrowser:Set_Size(tailleWebBrower)
    // Le champ conteneur devient le parent du WebBrowser
    iHdle2=AppelDLL32("User32.dll","SetParent",oWebBrowser.get_Handle(),Handle(Conteneur))
    2 - Création d'un assemblage Dotnet pour la méthode à appeler dans le script

    Je n'arrive pas à utiliser du code WLangage pour le script appelé car je ne sais pas créer un objet COM visible en Windev (quelqu'un sait-il ?) donc je crée un assemblage dotnet dans windev.

    Projet Assemblage Dotnet
    Nouvelle classe : MaClasse
    Nouvelle procédure dans cette classe : Affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PROCEDURE Affichage(LaChaine est une chaîne)
    Info(LaChaine)
    générer l'assemblage avec comme options(très important) dans propriétés avancées.
    - Oui, l'assemblage .net doit être accessible par COM
    - Créer un assemblage .net à nom fort
    - fichier snk regarder ici comment faire : assemblage .net à nom fort

    Rajouter l'assemblage généré (.dll) dans votre projet.

    Rajouter ce code dans votre projet après par exemple le code d'initialisation du WebBrowser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MaClasse1 est un MaClasse
    // MaClasse1 est la classe de l'assemblage qui contient la méthode Affichage
    oWebBrowser:ObjectForScripting = MaClasse1
    oWebBrowser:DocumentText = "<html><head><script>" + ...
    "function test(message) { alert(message); }" + ...
    "</script></head><body><button " + ...
    "onclick=""window.external.Affichage('coucou')"">" + ...
    "Appeler Code Client à partir du JavaScript</button>" + ...
    "</body></html>"
    //oWebBrowser:Navigate("http://google.fr")
    et voili , voilou

    vous affichez maintenant dans votre conteneur la page qui contient le bouton "Appeler Code Client à partir du JavaScript". Lorsque vous cliquez sur le bouton, une fenêtre s'ouvre avec "coucou" à l'intérieur.

    Tout ça pour ça

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par jurassic pork Voir le message

    Ami calmant, J.P
    Mon cher AMI, vous m'avez effectivement calmé
    Ça faisait plus de 3 semaines que je "bizounais" sur ce problème !

    À l'aide de votre exemple, j'ai finalement pu réussir à implémenter le code windev nécessaire à mes besoins...
    En plus d'ajouter de nouvelles connaissances à mon expérience...

    Merci beaucoup !

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Moi aussi, j'ai appris des choses.

    Je peux apporter ma contribution "théorique" à cette magistrale discussion, pour ajouter l'accès à un objet Automation, en lieu et place de l'assemblage .NET.

    Citation Envoyé par jurassic pork Voir le message

    2 - Création d'un assemblage Dotnet pour la méthode à appeler dans le script

    Je n'arrive pas à utiliser du code WLangage pour le script appelé car je ne sais pas créer un objet COM visible en Windev (quelqu'un sait-il ?) donc je crée un assemblage dotnet dans windev.

    Rajouter ce code dans votre projet après par exemple le code d'initialisation du WebBrowser
    L'idée est d'utiliser notre bon vieux compagnon, j'ai nommé le contrôle ActiveX ScriptControl.

    Avec l'ActiveX ScriptControl, on peut définir des procédures VBScript (Sub et Function) et y faire appel comme si c'était des méthodes grâce à un objet automation fourni par la méthode CodeObject() de l'ActiveX ScriptControl.

    Je n'utilise que WD12, donc je ne peux pas tester l'utilisation du contrôle .NET.
    Voilà l'idée générale, en espérant que Alain__B et jurassic pork puisse l'adapter.

    Code WLangage : 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
     
     
    sScriptVBS est une chaîne = [
    	Dim sChaine
     
    	Sub Affichage(LaChaine)
    		sChaine = LaChaine
    		MsgBox sChaine
    	End Sub
    ]
     
    oScript est un objet Automation "MSScriptControl.ScriptControl"
     
    oScript>>Language("VBScript")
    oScript>>AddCode(sScriptVBS)
    oScript>>Timeout(-1)	//pas de timeout
     
    // objet automation avec une méthode Affichage(LaChaine)
    oMonObjet est un objet Automation dynamique
    oMonObjet=oScript>>CodeObject()
     
    oWebBrowser:ObjectForScripting = oMonObjet
     
    oWebBrowser:DocumentText = "<html><head><script>" + ...
    "function test(message) { alert(message); }" + ...
    "</script></head><body><button " + ...
    "onclick=""window.external.Affichage('coucou')"">" + ...
    "Appeler Code Client à partir du JavaScript</button>" + ...
    "</body></html>"

    Dans le VBScript, il y a la variable globale (au script) sChaine.

    Exemple de code pour récupérer la valeur de cette variable globale au VBScript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Info(oScript>>Eval("sChaine"))

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    bonjour,

    Dommage JBO mais cela n'a pas l'air de fonctionner :

    j'ai une exception (sans indication de l'erreur) sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    oWebBrowser:ObjectForScripting = oMonObjet
    le CodeObject a pas l'air de convenir au oWebBrowser:ObjectForScripting

    je me demande si le "ObjectForScripting" doit toujours être une classe.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,
    et merci jurassic pork pour avoir essayé de mettre en oeuvre ma proposition ainsi que pour l'information en retour.

    Citation Envoyé par jurassic pork Voir le message

    Dommage JBO mais cela n'a pas l'air de fonctionner :

    j'ai une exception (sans indication de l'erreur) sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    oWebBrowser:ObjectForScripting = oMonObjet
    le CodeObject a pas l'air de convenir au oWebBrowser:ObjectForScripting

    je me demande si le "ObjectForScripting" doit toujours être une classe.
    Intuitivement, je dirai que ObjectForScripting ne prend pas en charge un objet Automation.

    Pour aller au bout du sujet, à la lecture de ta solution, je me demande comment l'application WinDev va récupérer la chaîne envoyée par le navigateur à la classe .NET.

    Hé hé hé... C'est une question pour ceux qui aiment se casser la tête.
    _

  9. #9
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Bonjour JBO,

    il ne récupère pas la chaîne car il n'en a pas besoin

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Citation Envoyé par jurassic pork Voir le message

    il ne récupère pas la chaîne car il n'en a pas besoin
    Euh... tu dis ça pour rire, j'espère.

    Parce que mettre en place une telle solution "patchwork", pour au final de pas exploiter le XML récupéré...
    _

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    je me demande si le "ObjectForScripting" doit toujours être une classe.

    Ami calmant, J.P
    J'ai l'impression que oui...
    Car dans la presque totalité de mes recherches la syntaxe utilisée était la suivante:
    WebBrowser.ObjectForScripting = this.
    Et le "this" est en fait l'objet Form, la fenêtre (la classe).
    Pour ce qui est du site sur lequel je travaille, le bouton "Transfert" vise une méthode "TransferXML(string XMLchaine)" d'une classe

    Donc j'ai créé une DLL avec visual studio don le contenu est la classe suivante:

    [ComVisible(true)]
    public class ABClasse
    {
    public string m_ChaineXML;

    public ABClasse()
    {
    m_ChaineXML = " ";
    }

    ~ABClasse()
    {
    }

    public void TransferXML(string XMLchaine)
    {
    m_ChaineXML = pChaineXML;
    }
    }

    Je l'ai ajouté à mon projet windev (Utiliser un assemblage .NET):
    Puis...

    MaClasse est une ABClasse
    oWebBrowser.ObjectForScripting = MaClasse

    J'ai ensuite mis ce TimerSys(ABTimer,25) dans ma fenêtre:
    cXML est une chaîne = MaClasse:m_ChaineXML
    SI cXML <> " " ALORS // Le bouton "Transfert" vient d'être cliqué...
    // Traitement de la chaine XML...

    // Remise à vide du membre: m_ChaineXML
    MaClasse:TransferXML(" ")
    FIN

    Et Bingo ! ça marche...:D

    PS: Pour le container je n'ai pas utilisé de fenêtre interne.
    J'ai utilisé la fenêtre et le "Drawing" s'est effectué aux bonnes coordonnées.
    j'ai placé un activeX "bidon" avec ancrage.
    Et dans le code de modification du format de la fenêtre... je redessine mon WebBrowser à l'aide des coordonnées de l'activeX.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/09/2011, 09h10
  2. Réponses: 13
    Dernier message: 14/02/2006, 17h45

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