Bon, j'y ai passé 3 heures mais j'ai trouvé. (un vague souvenir entre vb6 et c# m'est revenu)
Envoyé par
dragondumond
... 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
Public Event OnChangeEnabled(ByVal X As Integer, ByVal Y As Integer, ByVal Valeur As Boolean)
Celle dans vb6
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 :
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 :
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
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
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
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é.
Partager