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

VB.NET Discussion :

Echange d'information VB.NET vers VB6 avec evenement


Sujet :

VB.NET

  1. #21
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    J'ai réussi à réaliser en plus de l'interface que "rv26t" ma présenté dans un autre poste de rajouter une interface IEvenAlarme qui ce trouve dans mon ddl vb.net, qui implémente une classe CEvenAlarme dans VB6 et qui est déclarer et instancié dans le VB6. Cette interface est ensuite lié à la première interface ce qui me permet dans mon programme vb.net d'exécuter des procédures pour réaliser des changements de variable dans les contrôles utilisateurs de mon VB6 directement dans les Events qui se trouve dans mon vb.net.

    Avantage, plus de scrutation et un meilleur contrôle du partage d'information.

    Je vous met la solution :

    Programme VB6, déclaration et instanciation :
    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
    Option Explicit
     
     
    ' Importation et déclaration de l'objet de type classe "interfaceAlarme" qui contient toute les procédures via l'interface IAlarmes.
    Public monAlarme As GestionnaireAlarme.InterfaceAlarme  ' la classe vb.net
    'Public monAlInt As GestionnaireAlarme.IAlarmes ' l'interface pour vb6
     
    Public aEventAlarme As New CEventAlarme ' la classe VB6
    Public monEventAlarme As GestionnaireAlarme.IEventAlarme ' l'interface pour vb6
     
    ' Procedure qui permet l'implémenter l'interface vb.net
    Public Sub ImplementerInterfaceGestionnaire()
     Set monAlarme = New GestionnaireAlarme.InterfaceAlarme ' implémente la classe alarme (nous avons un objet alarme)
     'Set monAlInt = monAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir l'Intellisense ce qui est très pratique)
    End Sub
     
    ' Procedure qui permet l'implémenter l'interface vb.net
    Public Sub ImplementerEventAlarme()
        Set aEventAlarme = New CEventAlarme ' implémente la classe alarme (nous avons un objet alarme)
        Set monEventAlarme = aEventAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir l'Intellisense ce qui est très pratique)
    End Sub
     
    Private Sub Command1_Click()
        Call monAlarme.LancerGestionnaireAlarme ' appele la sub qui permet de lancer le gestionnaire d'alarme.
    End Sub
     
     
    Private Sub Form_Load()
        Call ImplementerInterfaceGestionnaire
        Call ImplementerEventAlarme
        Call monAlarme.SetEventAlarme(aEventAlarme)
     
    End Sub
    Programme VB6 (Classe CEventAlarme qui se trouve dans un module de Classe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Implements GestionnaireAlarme.IEventAlarme
     
    Public Sub IEventAlarme_OnChangeEnable()
       MsgBox ("toto")
    End Sub

    Programme VB.NET avec mes interfaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Interface IAlarmes
        Sub SetEventAlarme(ByVal pEventAlarme As IEventAlarme)
        Sub LancerGestionnaireAlarme()
     
    Public Interface IEventAlarme
        Sub OnChangeEnable()
    End Interface
    Programme VB.NET ma classe InterfaceAlarme :


    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
    Public Class InterfaceAlarme
        Implements IAlarmes ' contrat entre classe et interface.
        Public aEventAlarme As IEventAlarme
        Public fenAlarmes As Form2 = New Form2
     
        Public MesAlarmes As Alarme = New Alarme ' a voir la portée
        Public fenAlarmesPoubelle As Form3 = New Form3
        Public Sub SetEventAlarme(ByVal pEventAlarme As IEventAlarme) _
            Implements IAlarmes.SetEventAlarme
            aEventAlarme = pEventAlarme
            fenAlarmes.aInterfaceAlarme = Me
        End Sub
     
     
        Public Sub LancerGestionnaireAlarme() _
        Implements IAlarmes.LancerGestionnaireAlarme
            fenAlarmes.MesAlarmes = MesAlarmes
            fenAlarmesPoubelle.MesAlarmes = MesAlarmes
            fenAlarmes.Show()
     
            fenAlarmesPoubelle.Show()
            fenAlarmesPoubelle.Visible = False
            fenAlarmes.FenPoubelle = fenAlarmesPoubelle
            MesAlarmes = fenAlarmes.MesAlarmes
     
        End Sub
    End Class
    et pour finir mon bouton qui se trouve dans le Form2 qui fait appel à ma procédure OnChangeEnable() qui se trouve dans VB6 via l'interface IEventAlarme qui est implémenter par un Set, etc....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public aInterfaceAlarme As InterfaceAlarme
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            aInterfaceAlarme.aEventAlarme.OnChangeEnable()
        End Sub
    Au final quand je lance mon simulateur en VB6, j'ouvre un gestionnaire en VB.NET, je clic sur le bouton1 et j'obtiens "toto".



    Je sais qu'il y a pas de quoi être fière mais je suis un automaticien, et arrivé à faire un truc comme sa, c'est hors norme pour des personnes comme nous qui font que des maths, maths, maths et maths !!

  2. #22
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Sois en fier.
    Mais surtout bravo à r26t pour sa patience et sa pédagogie, ainsi qu'aux autres qui ont participé.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  3. #23
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par dragondumond Voir le message
    Je sais qu'il y a pas de quoi être fière mais je suis un automaticien, et arrivé à faire un truc comme sa, c'est hors norme pour des personnes comme nous qui font que des maths, maths, maths et maths !!
    Tu as aussi trouvé une solution, Bravo.

    Citation Envoyé par _Ez3kiel Voir le message
    Sois en fier.
    Mais surtout bravo à r26t pour sa patience et sa pédagogie, ainsi qu'aux autres qui ont participé.
    Merci.
    J'aime bien participer, et j'apprend aussi au passage. (la connaissance s'accroit en la partageant)
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #24
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Je ré-ouvre le poste car malheureusement mon application ne marche pas lorsque j'ai des arguments d'entrés sur mes procédures qui sont interfacées entre VB6 et vb.net, genre quand je décide de rajouter 3 arguments d'entrés sur "OnChangeEnable" pourtant j'ai bien fait attention à bien renouveler l'interface et à générer mon projet en vb.net, il me met "La déclaration de la procédure ne correspond pas à la description de l'évenement".

  5. #25
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Peut-on voir les codes
    coté vb.net : la définition dans l'interface.
    coté vb.net : l'implémentation de la méthode.
    coté vb6 : l'appel à la méthode.

    OnChangeEnable ne fait-il pas partie du gestionnaire d'évènement ? si oui, dans ce cas gérer comme dans le Post 14.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #26
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Coté VB6 la seule chose qui change c'est dans la Class cEventAlarme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Implements GestionnaireAlarme.IEventAlarme
     
    Public Sub IEventAlarme_OnChangeEnable(ByVal X As String, ByVal Y As Integer, ByVal Value As Boolean)
        'Dim ObjCtrl As Object
        'ObjCtrl = CollectionEQT.Item(x)
        'ObjCtrl.OnChangeEnable1(y, Value)
    End Sub
    Coté VB.NET la seule chose qui change c'est dans l'interface IEventAlarme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Interface IEventAlarme
        Sub OnChangeEnable(ByVal X As String, ByVal Y As Integer, ByVal Value As Boolean)
    End Interface

  7. #27
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bon, j'y ai passé 3 heures mais j'ai trouvé. (un vague souvenir entre vb6 et c# m'est revenu)
    Citation Envoyé par dragondumond Voir le message
    ... il me met "La déclaration de la procédure ne correspond pas à la description de l'évenement".
    Eh bien ce bug là, je pense que tu aurais eu du mal à le trouver.

    Attention Danger pour le programmeur : le type integer en vb.net correspond au type long en vb6

    Désolé pour la remarque très voyante, mais cette info est importante.

    si tu utilises d'autres types cherche la correspondance entre entre chaque environnement de dev. (vb6 et vb.net)

    la déclaration dans vb.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Public Event OnChangeEnabled(ByVal X As Integer, ByVal Y As Integer, ByVal Valeur As Boolean)
    Celle dans vb6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub mesAlarme_OnChangeEnabled(ByVal X As Long, ByVal Y As Long, ByVal Valeur As Boolean)

    Donc pour toi
    Coté VB6 la seule chose qui change c'est dans la Class cEventAlarme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Implements GestionnaireAlarme.IEventAlarme
     
    Public Sub IEventAlarme_OnChangeEnable(ByVal X As String, ByVal Y As long, ByVal Value As Boolean)
        'Dim ObjCtrl As Object
        'ObjCtrl = CollectionEQT.Item(x)
        'ObjCtrl.OnChangeEnable1(y, Value)
    End Sub
    Coté VB.NET la seule chose qui change c'est dans l'interface IEventAlarme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Interface IEventAlarme
        Sub OnChangeEnable(ByVal X As String, ByVal Y As Integer, ByVal Value As Boolean)
    End Interface
    Attention tu as mis X en string, Est-ce voulu ?


    Pour info mes tests en vb.net et vb6
    Interfaces vb.net
    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
    Imports System.Runtime.InteropServices
    ''' <summary>Cette interface expose les évènements.</summary>
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> Public Interface _EventInterface
      ' Attention Danger : le type integer en vb.net correspond au type long en vb6
      <DispId(1)> Sub UnEvent(ByVal test As String, ByVal x As Integer) ' un évènement qui sera disponible sous vb6 (NomInstanceClasse_UnEvent)
      <DispId(6)> Sub OnChangeEnabled(ByVal X As Integer, ByVal Y As Integer, ByVal Valeur As Boolean)
    End Interface
     
    ''' <summary>L'interface représente un Wrapper de la classe Alarme pour les programmes exe vb6. (elle expose les propriétés et les méthodes)</summary>
    ''' <remarks>Sera exportée dans la bibliothéque de type créé dans l'assembly.</remarks>
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> Public Interface IAlarmes
      <DispId(2)> Sub GestAlarme()
      <DispId(3)> Sub AjoutAlarme(ByVal UnId As String, ByVal LaPriorite As Integer)
      <DispId(4)> Sub LitAlarmes(ByVal UnId As String, ByRef LaPriorite As Integer)
      <DispId(5)> Function existe() As Boolean
    End Interface
    Code vb.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ''' <summary>La classe qui implémentes les méthodes et les évènement.
    ''' Les évènement pour vb6 sont exposés par l'utilisation de l'attribut ComSourceInterfaces.</summary>
    <ClassInterface(ClassInterfaceType.None)> <ComSourceInterfaces(GetType(_EventInterface))> _
    Public Class InterfaceAlarme
      Implements IAlarmes ' contrat entre classe et interface.
      ' Attention Danger : le type integer en vb.net correspond au type long en vb6
      Public Event OnChangeEnabled(ByVal X As Integer, ByVal Y As Integer, ByVal Valeur As Boolean)
      Public Event UnEvent(ByVal test As String, ByVal x As Integer)
     
      'dans le code de gestion au moment voulue ...
      'Déclenche un évènement pour le progr. vb6.
        RaiseEvent UnEvent("teste", 10) ' Envoie l'évènement à vb6
        RaiseEvent OnChangeEnabled(10, 15, True) ' Envoie l'évènement à vb6
    Dans le code vb6
    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
    Option Explicit
    Private WithEvents mesAlarme As Alarmes.InterfaceAlarme  ' la classe vb.net
    Private mesAlInt As Alarmes.IAlarmes ' l'interface pour vb6
     
    Private Sub Form_Load()
     Set mesAlarme = New Alarmes.InterfaceAlarme ' instancie la classe alarme (nous avons un objet alarme)
     Set mesAlInt = mesAlarme ' récupère l'interface à partir de l'objet alarme (permet d'avoir l'Intellisense ce qui est très pratique)
    End Sub
     
     ' Attention Danger : le type integer en vb.net correspond au type long en vb6
     ' reception d'un event dll.net avec paramètre
     Public Sub mesAlarme_OnChangeEnabled(ByVal X As Long, ByVal Y As Long, ByVal Valeur As Boolean)
     MsgBox "Evènement de la DLL.net reçu dans vb6. mesAlarme_OnChangeEnabled; x : " & X & " y : " & Y & " valeur : " & Valeur
     Text2.Text = "Evènement de la DLL.net reçu dans vb6. mesAlarme_OnChangeEnabled; x:" & X & " y:" & Y & " valeur:" & Valeur
     End Sub
     
     ' Attention Danger : le type integer en vb.net correspond au type long en vb6
     ' reception d'un event dll.net ' test param un par un
     Public Sub mesAlarme_UnEvent(ByVal test As String, ByVal X As Long)
     MsgBox "Evènement de la DLL.net reçu dans vb6. paramètre test:" & test & X
     Text1.Text = "Evènement de la DLL.net reçu dans vb6. paramètre test:" & test & " " & X
     End Sub
     
    ' initialisation des données et gestion des alarmes (propriétés nom et param)
    Private Sub Command1_Click()
      Call mesAlInt.AjoutAlarme("a1", 3)
      Call mesAlInt.AjoutAlarme("a2", 2)
      Call mesAlInt.AjoutAlarme("a3", 3)
      Call mesAlInt.AjoutAlarme("a4", 1)
      Call mesAlInt.AjoutAlarme("a5", 3)
      Call mesAlInt.AjoutAlarme("a6", 2)
      Call mesAlInt.GestAlarme  ' appele la sub de gestion des alarmes. (avec fenêtrage)
    End Sub
    Fin info

    L'info est un peu longue, mais si un jour quelqu'un en a besoin tout est expliqué.

    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  8. #28
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 263
    Points : 148
    Points
    148
    Par défaut
    Merci beaucoup, je teste cela ce matin !!

    C’était bien le Long, en plus j'avais des procédures dans l'autre sens (vb6 vers vb.net) avec des "integer" et sa marché très bien, en tous cas, j'aurai jamais pensé à sa ^^

    Un grand MERCI pour ton talent, vraiment, je suis Fan de toi !!

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/06/2011, 17h13
  2. Débugage : VB.NET vers ActiveX VB6
    Par pounaid dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/02/2009, 14h24
  3. Réponses: 4
    Dernier message: 26/11/2008, 13h59
  4. Envoyer des informations en POST vers une url en vb6
    Par bugz57 dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 18/06/2008, 08h59
  5. utiliser une DLL faite en vb6 avec VB.net
    Par j.sineau dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/12/2007, 10h33

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