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. #1
    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 Echange d'information VB.NET vers VB6 avec evenement
    Bonjour,

    Alors je m'adresse à vous pour me donnée quel que pise sur un petit problème.

    Depuis 1 mois je travail sur un gestionnaire d'alarme et c'était le bordel dans mon code, un mec de ma boite est passé et il ma donné un petit cours sur les bonnes pratique du coup j'ai quasi tous effacer et je me rend compte que parfois il est possible de faire des choses simple avec du code simple alors que je me prenais la tête en me fixant des contraintes. Du coup dans mon gestionnaire d'alarme qui s'agit d'un Form avec un datagridview et un simulateur en VB6, j'ai garder une interface entre les deux où je peux lancer des procédures sur mon code en VB6 pour ajouter directement des alarmes dans mon datagridview. Cette technique me permet de retirer toute ma partie scrutation dans mon gestionnaire d'alarme ce qui allége largement mon code, je suis partie plutôt sur un mode pooling où j'attend un évènement pour exécuter une procédure d'où le principe de la programmation objet en même temps. (En faite, j'ai simplement importer ma partie scrutation dans mon simulateur)

    Mon problème est que mon interface me permet seulement d'exécuter des procédures du gestionnaire sur mon code VB6.

    J'aurai aimé pouvoir exécuter une procédure sur mon code VB6 ou alors informer mon code VB6 d'un changement de variable lors d'un évènement dans mon gestionnaire.

    Code actuel pour l'évènement supprimer une alarme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Public Sub cms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            If sender.text = "Suppress Alarm" Then
                Dim z As Integer
                For z = 0 To MesAlarmes.i - 1
                    If DataGridView1.Rows(z).Selected = True Then
                        MesAlarmes.DicoAlarm2(DataGridView1.Rows(z).Cells(3).EditedFormattedValue).Supprimer = True
                        MesAlarmes.DicoAlarm2(DataGridView1.Rows(z).Cells(3).EditedFormattedValue).Etat = False
                        DataGridView1.Rows.RemoveAt(z)
                        FenPoubelle.MesAlarmes = MesAlarmes
                        Exit Sub
                    End If
                Next
            End If
        End Sub
    Je veux signaler à mon code VB6 que mon alarme est supprimer.

    Je veux réaliser la même action avec un CheckBox qui se trouve à la première colonne qui signal que l'alarme est acquitté lorsqu'on valide le checkbox. Je voudrai en gros signaler à mon code VB6 qu'une alarme est acquitté.

    Je voudrai aussi vos impression sur la manière de résoudre mes problèmes de la manière la plus bonne possible, c'est-à-dire, sans scrutation si possible !!

    Merci d'avance pour vos solutions.

  2. #2
    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écupérer la ligne dans mon dgv lors de l'évènement "click droit" mais par la suite je passe par deux autres procédures avant de supprimer ma ligne, je voudrai pouvoir transmettre la ligne d'un procédure à une autre en argument d'entré mais je sais pas comment le faire avec un évènement.

    Voila le code de mon évènement Click droit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub AffichierMenu_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown
     
            If e.Button = MouseButtons.Right Then ' Lorsqu'on fait un click *droit*
                'un try ... catch pour eviter une exception au clic sur une entete        
                Try
                    DataGridView1.Rows(e.RowIndex).Selected = True
                    OuvrirMenu(e.RowIndex) 'Ouvre un menu
                Catch ex As ArgumentOutOfRangeException
                End Try
     
            End If
     
        End Sub
    Cette évènement me permet de selectionner la ligne sur la quelle j'ai réaliser un click droit pour ensuite ouvrir un menu.

    Voila le code qui permet d'ouvrir un menu :

    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
    'Procedure qui permet d'ouvrir un menu
        Private Sub OuvrirMenu(ByVal e As Object)
            ' Create a new ContextMenuStrip control.
            Dim z As Integer
            ContextMenuStrip1 = New ContextMenuStrip()
            AddHandler ContextMenuStrip1.Opening, AddressOf cms_Opening
     
            For z = 0 To MesAlarmes.i - 1
                If DataGridView1.Rows(z).Selected = True Then
                    DataGridView1.Rows(z).ContextMenuStrip = ContextMenuStrip1
                End If
            Next
     
        End Sub
        'Procedure qui contient ce qui ce trouve dans le menu
        Private Sub cms_Opening(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
            ' Acquire references to the owning control and item.
            Dim c As Control = ContextMenuStrip1.SourceControl
            Dim tsi As ToolStripDropDownItem = ContextMenuStrip1.OwnerItem
     
            ' Clear the ContextMenuStrip control's 
            ' Items collection.
            ContextMenuStrip1.Items.Clear()
     
            ' Populate the ContextMenuStrip control with its default items.
     
            ContextMenuStrip1.Items.Add("Continue Updating")
            AddHandler ContextMenuStrip1.Items(0).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Acknowledge Single Alarm")
            AddHandler ContextMenuStrip1.Items(2).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Open Control Display")
            AddHandler ContextMenuStrip1.Items(4).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Open Faceplate Display")
            AddHandler ContextMenuStrip1.Items(5).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("Open Detail Display")
            AddHandler ContextMenuStrip1.Items(6).Click, AddressOf cms_Click
            ContextMenuStrip1.Items.Add("-")
            ContextMenuStrip1.Items.Add("Suppress Alarm")
            AddHandler ContextMenuStrip1.Items(8).Click, AddressOf cms_Click
            ' Set Cancel to false. 
            ' It is optimized to true based on empty entry.
            e.Cancel = False
        End Sub
    L'évènement cms_Click est déjà dans le poste 1. Je voudrai pouvoir importer mon "e.RowIndex" qui se trouve dans mon évènement click droit dans l'évènement cms_Click ce qui me permettrait de retirer ma scrutation pour savoir quel ligne est sélectionné et ce qui me permettrait par la suite de retirer la sélection d'une ligne.

    Merci d'avance pour vos solutions !!

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Tout ça me paraît bien compliqué. Mais peut-être ai-je raté quelque chose ?
    Est-ce que tu ne peux pas plutôt :
    • Créer une seule fois le menu contextuel (en design ou par code) plutôt que de le reconstruire à chaque ouverture,
    • Associer le menu contextuel au DataGridView plutôt que de l'ouvrir manuellement sur l'évènement MouseDown,
    • Définir un évènement différent pour chaque item du menu afin d'éviter le test sur le libellé (pas beau). D'autant que dans cms_click, sender est de type Object et que la propriété Object.Text n'existe pas. Du coup il faudrait transtyper et ... Bref.
    • Utiliser la propriété DataGridView.SelectedRows qui te donnera une collection des lignes sélectionnées.

    Bref, je pense qu'on peut faire un peu plus simple pour répondre à ton besoin. Maintenant détrompe moi si quelque chose m'a échappé dans ton architecture.
    Eb.

  4. #4
    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 suis pas contre ce que tu dis et j'aurai aimer approfondi un peu sur le fait que c'est pas beau !!

    Sinon je me vois pas rajouter un menu dans le datagridview, mon client veux un menu lorsqu'il click sur un bouton click droit.

  5. #5
    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
    En faite l'idée du SelectedRows, c'est pas mal mais justement moi mon bute c'est de supprimer la sélection, car pour l'instant c'est un moyen de substitution pour savoir sur quel ligne j'ai réaliser un click droit mais j'essaye de dire "Stop" à la programmation de magouille !!

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 119
    Points
    25 119
    Par défaut
    si tu veux vraiment coder propre, ca va prendre un peu de temps
    tu peux déjà commencer par lire ca : http://plasserre.developpez.com/cours/vb-net/

    après c'est en codant et en essayant des technologies qu'on voit ce qu'on a raté dans ce qu'on a codé avant ...

    par exemple des addhandler c'est bien, mais ca nécessite des removehandler sinon ca fait une fuite mémoire
    un fuite sur une appli qui ne fonctionne pas longtemps mais sur une appli h24 ca fini toujours par planter

    après si tu veux communiquer entre 2 applis (c'est le titre du topic, bien qu'en lisant en diagonale je ne vois pas grand chose qui s'y réfère) il y a plusieurs méthodes
    si les 2 applis peuvent se connecter sur la même base de données il y a moyen de faire quelque chose par là
    sinon par tcp/ip (même en local)
    sinon il y a aussi une dll qui a trainée il y a quelques semaines sur le forum et qui permet de faire du messaging entre une appli vb6 et appli vb.net

  7. #7
    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 Pol63 Voir le message
    sinon il y a aussi une dll qui a trainée il y a quelques semaines sur le forum et qui permet de faire du messaging entre une appli vb6 et appli vb.net
    Oui c'est lié à son développement.
    Mais là c'est dans la partie de la dll VB.net.

    Vu la façon dont tu procédes, ton datagridview à la propriété multiselect à false, (sinon tu ne supprimes que la première ligne sélectionnée, ce qui ne correspond pas forcément à celle cliquée) tu peux faire directement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MesAlarmes.DicoAlarm2(DataGridView1.SelectedRows(0).Cells(3).EditedFormattedValue).Supprimer = True
    Suit les conseils de ebastien et Pol63.
    C'est préférable de lier chaque élément du menu à une méthode qui lui est propre.
    Pour l'instant tu peux connaître facilement la ligne sélectionné de ton DataGridView.
    Si tu as besoin de transmettre des info par évènement, je te montrerais comment faire des évènements personnalisés.

  8. #8
    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
    Oui c'est plus un évènement personnalisé que j'ai besoin qui possède un argument d'entré précis. Ensuite j'aurai crée une function Get dans mon interface qui j'utilise directement dans mon programme VB6 pour aller cherche des info que j'ai besoin dans mon dll mais j'aurai plus aimer avoir une procédure dans mon dll qui agit directement dans mon code VB6 ce qui m'évitera de faire du pooling !!

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par dragondumond Voir le message
    Je suis pas contre ce que tu dis et j'aurai aimer approfondi un peu sur le fait que c'est pas beau !!
    Tester un libellé pour faire une action, ça marche ... jusqu'au jour où tu décides de modifier le libellé. Tu vas te palucher tout ton code pour vérifier si il y a un impact ?

    Citation Envoyé par dragondumond Voir le message
    Sinon je me vois pas rajouter un menu dans le datagridview, mon client veux un menu lorsqu'il click sur un bouton click droit.
    Ok, tu veux que la sélection se fasse sur le click droit. Pourquoi pas. Mais il n'empêche que tu n'es pas obligé de reconstruire tout ton menu lors de chaque affichage. Tu peux même le créer en mode design une bonne fois pour toute.
    Et puis si tu veux coder propre, évite aussi les ContextMenuStrip1 et autre DataGridView1. Ca devient très vite illisible.

  10. #10
    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'avoue que sa fait pas très beau DataGridView1 mais je compte les changer le plus rapidement possible et je m'excuse d'avance si c'est illisible. Tous vos suggestions, je les retiens et j'essaye de les appliquer.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Ne t'excuse pas, c'est pour toi que c'est illisible : je ne compte pas faire la maintenance de ton application

  12. #12
    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
    Dans le cas actuel, tu n'as pas besoin d'évènement personnalisé pour mettre à jour ton datagridview.
    Citation Envoyé par dragondumond Voir le message
    Oui c'est plus un évènement personnalisé que j'ai besoin qui possède un argument d'entré précis.
    Cela peut être fait dans la dll vb.net. Mais entre vb6 et vb.net ça je ne sais pas.

    Citation Envoyé par dragondumond Voir le message
    Ensuite j'aurai crée une function Get dans mon interface qui j'utilise directement dans mon programme VB6 pour aller cherche des info que j'ai besoin dans mon dll
    Là il est peut être possible de passer un évènement simple entre vb6 et vb.net qui déclenchera la lecture des infos dns la DLL.net (ta méthode get) par le progr. vb6. Il faut essayer.

    Citation Envoyé par dragondumond Voir le message
    mais j'aurai plus aimer avoir une procédure dans mon dll qui agit directement dans mon code VB6 ce qui m'évitera de faire du pooling !!
    Par contre le passage d'un évènement personailisé entre vb6 et .net, je ne sais pas. (comme indiqué ci-dessus)

    Sinon il faudrat un timer dans vb6 qui viendra scruter une méthode de la DLL (méthode qui utilisera par exemple un dictionnaire des alarmes traitées)

  13. #13
    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
    Bien,
    J'y ai passé l'après midi, mais voici comment emettre un évènement depuis la DLL vb.net vers le progr. vb6

    L'interface d'évènement expose l'évenement en provenance de la DLL comme une sub pour vb6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Imports System.Runtime.InteropServices
     
    ' Cette interface expose les évènements
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface _EventInterface
      <DispId(1)> Sub UnEvent()
    End Interface
    l'interface classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ''' <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
      Sub CreEvent()
      Sub LibereEvent()
      Sub GestAlarme()
      Sub AjoutAlarme(ByVal UnId As String, ByVal LaPriorite As Integer)
    End Interface
    La classe qui passera à travers l'interface et l'interface d'évènement pour vb6 (communication vb6 - dll.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
    17
    18
    19
    20
    21
    22
    23
    24
    ''' <summary>Les évènement sont exposé par l'utilisation de l'attribut ComSourceInterfaces.</summary>
    <ClassInterface(ClassInterfaceType.None)> _
    <ComSourceInterfaces(GetType(_EventInterface))> _
    Public Class InterfaceAlarme
      Implements IAlarmes ' contrat entre classe et interface.
     
      Public Event UnEvent() ' l'évènement à destination du prog. vb6
     
      Private fenAlarmes As frmAlarmes = New frmAlarmes
      Private MesAlarmes As DesAlarmes = DesAlarmes.GetInstance ' pas de new, il sera fait une seule fois dans Getinstance, c'est cette sub qui vérifie l'unicité.
     
      Public Sub MesAlarmes_EventEtatFaux()
        RaiseEvent UnEvent() ' Envoie l'eévènement à vb6
      End Sub
     
      Public Sub CreEvent() Implements IAlarmes.CreEvent
        AddHandler MesAlarmes.EventEtatFaux, AddressOf MesAlarmes_EventEtatFaux
      End Sub
     
      Public Sub LibereEvent() Implements IAlarmes.LibereEvent
        RemoveHandler MesAlarmes.EventEtatFaux, AddressOf MesAlarmes_EventEtatFaux
      End Sub
     
    '...
    La classe de gestions des alarmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class DesAlarmes
     
      Private Shared _InstanceAlarmesUnique As DesAlarmes
      Public Event EventEtatFaux As EventHandler
     
    '...
     
      Public Sub EtatFaux()
        RaiseEvent EventEtatFaux(Me, New System.EventArgs) ' évènement interne DLL
      End Sub

    Dans 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
    Private WithEvents mesAlarme As Alarmes.InterfaceAlarme  ' la classe vb.net
    Private mesAlInt As Alarmes.IAlarmes ' l'interface pour vb6
    Dim numalarme As Integer
     
    Private Sub Form_Load()
    numalarme = 0
     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)
     mesAlInt.CreEvent
    End Sub
     
    Public Sub mesAlarme_UnEvent()
      MsgBox "recu dans vb6"
    End Sub
     
    Private Sub Form_Unload(Cancel As Integer)
      mesAlInt.LibereEvent
    End Sub
    Dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Public Sub cms_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    '...
              mMesAlarmes.DicoAlarmes(MonDGW.SelectedRows(0).Cells(3).EditedFormattedValue).Supprimer = True
              mMesAlarmes.DicoAlarmes(MonDGW.SelectedRows(0).Cells(3).EditedFormattedValue).Etat = False
              MesAlarmes.EtatFaux() ' voir avec quelque chose de plus propre
    '...
    Pour l'évènement dll je ne me suis pas compliqué la vie (à voir pour faire quelque chose de plus propre)

    Pour les paramètres de l'évènement DLL.net-vb6, il suffit de passer des paramètres comme pour une fonction
    ex : Sub UnEvent(byval Etat as boolean).

    A+, Hervé.

  14. #14
    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'ai simplifié la création des events interne à la DLL.net

    Interface évènement pour vb6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ''' <summary>Cette interface expose les évènements.</summary>
    <InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface _EventInterface
      <DispId(1)> Sub UnEvent() ' un évènement qui sera disponible sous vb6 (NomInstanceClasse_UnEvent)
    End Interface
    Interface méthodes pour vb6
    plus de gestion des events interne à la dll.net.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ''' <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)
    End Interface
    Classe utilisant l'interface pour vb6 qui implémente les méthodes et évènements.
    Abonnement aux évènement de la dll.net en interne.
    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
    ''' <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.
      Public Event UnEvent() ' l'évènement à destination du prog. vb6
     
      Private fenAlarmes As frmAlarmes = New frmAlarmes
      Private MesAlarmes As DesAlarmes = DesAlarmes.GetInstance ' pas de new, il sera fait une seule fois dans Getinstance, c'est cette sub qui vérifie l'unicité.
      ''' <summary>Abonne les évènement interne à la DLL.</summary>
      ''' <remarks>En automatique sur instanciation de la classe, ainsi le prog. vb6 n'a rien à faire</remarks>
      Public Sub New()
        AddHandler MesAlarmes.EventEtatFaux, AddressOf MesAlarmes_EventEtatFaux
      End Sub
      ''' <summary>Déclenche un évènement pour le progr. vb6.</summary>
      Public Sub MesAlarmes_EventEtatFaux()
        RaiseEvent UnEvent() ' Envoie l'évènement à vb6
      End Sub
    '...
     
      ''' <summary>Désabonne les évènement interne à la DLL.</summary>
      Protected Overrides Sub Finalize()
        RemoveHandler MesAlarmes.EventEtatFaux, AddressOf MesAlarmes_EventEtatFaux
      End Sub
    La classe DesAlarmes est identique à celle de mon post précédant. (gestion interne dll.net)

    Dans vb6
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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
     
     ' reception d'un event dll.net
     Public Sub mesAlarme_UnEvent()
     MsgBox "Evènement de la DLL.net reçu dans vb6."
     End Sub
    Il reste à voir comment générer un évènement au sein de la classe alarme.
    Par exemple :
    event suppression avec l'Id de l'alarme
    event etat avec l'Id de l'alarme et son état vrai/faux.

    Le traiter dans la classe DesAlarmes.
    sur réception event suppression => event suppression pour vb6 avec l'Id de l'alarme en param (def dans EventInterface) <DispId(1)> Sub SuppimerAlarme(ByVal IdAl as string).
    sur réception event etat => event etat pour vb6 avec en paramètre l'Id de l'alarme et son état vrai/faux. (def dans EventInterface) <DispId(5)> Sub EtatAlarme(ByVal IdAl as string, ByVal Etat as boolean).

    Exemple à adapter suivant la structure de ta dll.

    Résumé pour créer un évènement dll.net à destination de vb6.
    Dans la DLL.net
    Uiliser les interfaces spécifique d'exposition à COM pour vb6. (avec les liens entre elles)
    Déclaration de l'évènement sous forme de sub dans l'interface d'exposition des évènement pour vb6.Sub ...;
    Déclaration de l'évènement dans la classe interface pour vb6.Public Event ...;
    Déclenchement de l'évènement dans la classe interface pour vb6.RaiseEvent ...;

    Dans vb6
    Après les déclarations et instanciations des classes issues de la DLL.net.
    reception d'un event dll.net Public Sub NomInstanceClasse_NomEvent().

    Bon code, Hervé.

  15. #15
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour dragondumond
    à tous ...
    Je te suggere si tu veux que ton gestionnaire d'alarme vb.nt (dll vb.net qui selon tes infos affiche un form ) d'utliser :
    - le Pack InteropForm Toolkit de Microsoft gratuit(site msdn) qui te genera un form tout pret dans lequel tu mettras ton dgv...
    Apres tu peux raiser :
    - un Event Simple(de type Eventargs donc un argument ) associe à un Delegate de ton cru .
    Dans le click du ContextMenu tu sette Eventargs à l'ndex du row que tu veux supprimer.
    L'appli Scrutateur d'Alarm trapperas cette event et recupera l'index du row supprime (ou un num alarm)..

    Si tu veux passer plusieurs Infos dans Eventargs ca se complique comme dit par un intervenant.
    Il faut rajouter un class COM avec Interface (ton class MyCustomArgs qui herite de EventArg et un Delegate handler public)...

    Tout est decrit sur le Pack Interop Form avec un exemple clair(hello word)...

    Pour ton dgv et la selection du row voici un code qui ne fait apparaitre le contextmenu que sur click droit( RowContextMenuStripNeeded)et recupere au vol l'index dans (event RowEnter ) :

    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
     
    'ce form sera celui de l'interopform
    'tu peux rajouter d'autres si tu veux agrementer
    Public Class Form1
        Private maListe As New List(Of Data)()
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            ContextMenuStrip1.Text = "Redden"
            Dim dt As Data
            For i As Integer = 1 To 10
                dt = New Data("text" + i.ToString, i, i * 25.5)
                maListe.Add(dt)
            Next
            Me.DataGridView1.DataSource = maListe
     
        End Sub
        Private Sub DataGridView1_RowContextMenuStripNeeded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowContextMenuStripNeededEventArgs) Handles DataGridView1.RowContextMenuStripNeeded
            e.ContextMenuStrip = ContextMenuStrip1
            Dim row As DataGridViewRow = Me.DataGridView1.Rows(e.RowIndex)
            row.ContextMenuStrip = ContextMenuStrip1
        End Sub
        'variable tres importante pour recuperer l'index row
        Private rowArgs As DataGridViewCellEventArgs
        Private Sub DataGridView1_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
            rowArgs = e
        End Sub
        'on peut remplacer les 7 handlers par celui la
        'dirait Monseigneur de Montaigne
        Private Sub cms_Click_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem1.Click, ToolStripMenuItem2.Click,
            ToolStripMenuItem3.Click, ToolStripMenuItem4.Click,
            ToolStripMenuItem5.Click, ToolStripMenuItem6.Click,
            ToolStripMenuItem7.Click
            Dim strName As String = CType(sender, ToolStripMenuItem).Name
            Select Case strName
                Case "ToolStripMenuItem1"
                    'ici tu peux raise ton event vers VB6
                    MessageBox.Show("menuitem1")
                    ' comme j'ai mis DGV.DataSource=liste
                    ' je dois supprimer dans ma liste car Mister Binding 
                    ' n'autorise pas la suppression dans DGV qui lui est lie  
     
                    maListe.RemoveAt(rowArgs.RowIndex)
                Case "ToolStripMenuItem2"
                    MessageBox.Show("menuitem2")
                    maListe.RemoveAt(rowArgs.RowIndex)
                Case "ToolStripMenuItem3"
                    MessageBox.Show("menuitem3")
                    maListe.RemoveAt(rowArgs.RowIndex)
                    'les autres cases...............................
            End Select
            'rafraichit l'affichage
            Me.DataGridView1.Refresh()
     
        End Sub
     
     
    End Class
    lien MSDN(intitule Download Microsoft InteropForms Toolkit 2.1 at the Official Microsoft ):

    http://www.google.fr/url?q=http://ww...664XkBrLGdO32w


    bon code....................

  16. #16
    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 rv26t Voir le message
    Il reste à voir comment générer un évènement au sein de la classe alarme.
    Par exemple :
    event suppression avec l'Id de l'alarme
    event etat avec l'Id de l'alarme et son état vrai/faux.

    Le traiter dans la classe DesAlarmes.
    sur réception event suppression => event suppression pour vb6 avec l'Id de l'alarme en param (def dans EventInterface) <DispId(1)> Sub SuppimerAlarme(ByVal IdAl as string).
    sur réception event etat => event etat pour vb6 avec en paramètre l'Id de l'alarme et son état vrai/faux. (def dans EventInterface) <DispId(5)> Sub EtatAlarme(ByVal IdAl as string, ByVal Etat as boolean).
    Ou dans DesAlarmes avoir une propriété IdAlarmeTraite qui sera mise à jour par ton programme et qui générera l'évenement pour l'interface.

    La piste donné par MABROUKI semble bien. Je ne connaissais pas.

    A+, Hervé.

  17. #17
    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 regarde cela avec une grande attention !!

  18. #18
    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
    sa ma l'air tres interessant mais je pense que c'est un peu trop poussé pour un gestionnaire d'alarme alors j'ai essayé de revenir à la racine, essayer de trouver une solution moins compliqué et plus facile à mettre en œuvre.

    L'idée est de partager mon Dico entre vb.net et VB6 via l'interface.

    Je créer et remplie mon Dico dans vb.net, je l'implémente dans mon interface et ensuite je vais directement regarder sur VB6 ce qu'il contient au moment voulu. C'est réalisable ou pas ?

  19. #19
    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
    sa ma l'air tres interessant mais je pense que c'est un peu trop poussé pour un gestionnaire d'alarme alors j'ai essayé de revenir à la racine, essayer de trouver une solution moins compliqué et plus facile à mettre en œuvre.

    L'idée est de partager mon Dico entre vb.net et VB6 via l'interface.

    Je créer et remplie mon Dico dans vb.net, je l'implémente dans mon interface et ensuite je vais directement regarder sur VB6 ce qu'il contient au moment voulu. C'est réalisable ou pas ?
    Le dictionnaire de vb6 est totalement différent de celui de vb.net, donc à mon avis tu vas avoir beaucoup de mal à les mettre de niveau pour communiquer (après tu peux essayer)

    Le plus simple est d'utiliser les évènements entre vb6 et la dll.net pour mettre à jour les évolutions, en utilisant la plus petite unité de données pour les transmissions.
    Tu as besoins de transmettre l'IdAlarme et l'info à modifier (Etat, description, Message, Seuil, NiveauAlarm, Ack, Unit, ModuleParam, ...) 11 au total.

    Il te faut donc 11 ensemble de 3 lignes pour effectuer tes communications de façon fine et performante.

    Uiliser les interfaces spécifique d'exposition à COM pour vb6. (avec les liens entre elles) Classique tu l'as déjà fait. Tu n'as qu'a utiliser l'exemple de mes post précédant pour les évènements.

    Dans la DLL.net
    Exemple avec Etat pour créer un évènement dll.net à destination de vb6.
    Déclaration de l'évènement sous forme de sub dans l'interface d'exposition des évènement pour vb6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub EtatAlarme(ByVal IdAlarme as string, ByVal Etat as boolean)
    Déclaration de l'évènement dans la classe interface pour vb6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Event EtatAlarme(ByVal IdAlarme as string, ByVal Etat as boolean)
    Déclenchement de l'évènement dans la classe interface pour vb6.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RaiseEvent EtatAlarme("IdAlarme1", true)
    fin exemple coté dll.net

    Tu auras donc un ensemble de 3 lignes pour chaque info à transmettre (3*11=33)
    A mon avis pour faire plus simple tu auras du mal.

    Dans vb6
    Après les déclarations et instanciations des classes issues de la DLL.net.
    Exemple avec Etat pour recevoir un évènement dll.net.
    reception d'un event dll.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub MaClasseAlarmeVB6_EtatAlarme(ByVal IdAlarme as string, ByVal Etat as boolean)
      Mondicovb6(IdAlarme).Etat = Etat
    End Sub
    fin exemple coté vb6

    Ensuite la gestion des alarmes est classique que ce soit coté vb6 ou vb.net.

    Je n'ai pas trop le temps je regarderai ce soir comment tu as avancé.

    A+, Hervé.

  20. #20
    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
    Un ancien de la boite ma donnée une solution que j'arrive pas à réaliser qui est que je rajoute une class dans le programme VB6 qui est implémenter dans une interface IEventAlarme qui se trouve dans mon ddl vb.net et ainsi de suite mais lorsque j'instancie mon interface et la classe dans le Form du VB6 avec le Set, il aime pas, je pense qu'il est impossible de rajouter deux interfaces dans un seul ddl, Vous en pensé quoi ?
    Solution poste 21 !!

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