Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Delegate et Event avec valeur de retour ?

11 réponses
Avatar
claudetom
Voici un exemple qui ne fonctionne pas,
Auriez-vous la bonne Syntaxe pour que cela fonctionne ?

Public Delegate Function CheckUserInputEvent() As Boolean

Public Event BeforeUpdate As CheckUserInputEvent
'*** Erreur retournée :
'Les événements ne peuvent pas être déclarés avec un type délégué ayant un
type 'de retour.
'***

'*Exemple de fonction qui retourne la valeur
Private Function dbSel_BeforeUpdate() As Boolean
MyBase.dbSelect.SelectedRecords.GetRecord(0).ClearTables()
Return True
End Function

Merci.

10 réponses

1 2
Avatar
Fred
Dans : news:,
claudetom disait :
Voici un exemple qui ne fonctionne pas,
Auriez-vous la bonne Syntaxe pour que cela fonctionne ?

Public Delegate Function CheckUserInputEvent() As Boolean



Bonjour,

Un évènement ne retourne pas de valeur.
Il faut utiliser un paramètre dérivé de EventArgs.
Du style :

Class CheckUserInputEventArgs
inherits EventArgs
Public Retour As Boolean
End Class

Public Delegate Sub CheckUserInputEventHandler(sender as Object, e as
CheckUserInputEventArgs)

Public Event BeforeUpdate As CheckUserInputEventHandler

Protected Overridable Sub OnBeforeUpdate(e as CheckUserInputEventArgs)
RaiseEvent BeforeUpdate(Me, e)
End Sub

Private Sub dbSel_BeforeUpdate()
MyBase.dbSelect.SelectedRecords.GetRecord(0).ClearTables()
Dim e As New CheckUserInputEventArgs
e.Retour = True
Me.OnBeforeUpdate(e)
End Function




--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
claudetom
"Fred" wrote:

Dans : news:,
claudetom disait :
> Voici un exemple qui ne fonctionne pas,
> Auriez-vous la bonne Syntaxe pour que cela fonctionne ?
>
> Public Delegate Function CheckUserInputEvent() As Boolean

Bonjour,

Un évènement ne retourne pas de valeur.
Il faut utiliser un paramètre dérivé de EventArgs.
Du style :

Class CheckUserInputEventArgs
inherits EventArgs
Public Retour As Boolean
End Class

Public Delegate Sub CheckUserInputEventHandler(sender as Object, e as
CheckUserInputEventArgs)

Public Event BeforeUpdate As CheckUserInputEventHandler

Protected Overridable Sub OnBeforeUpdate(e as CheckUserInputEventArgs)
RaiseEvent BeforeUpdate(Me, e)
End Sub

Private Sub dbSel_BeforeUpdate()
MyBase.dbSelect.SelectedRecords.GetRecord(0).ClearTables()
Dim e As New CheckUserInputEventArgs
e.Retour = True
Me.OnBeforeUpdate(e)
End Function




--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)




Avatar
claudetom
Ca marche presque
mais les Events servaient aussi à des Addhandler
qui pointe vers des fonctions

Donc avec ta réponse il me dit forcément que les signatures sont différentes.


"Fred" wrote:

Dans : news:,
claudetom disait :
> Voici un exemple qui ne fonctionne pas,
> Auriez-vous la bonne Syntaxe pour que cela fonctionne ?
>
> Public Delegate Function CheckUserInputEvent() As Boolean

Bonjour,

Un évènement ne retourne pas de valeur.
Il faut utiliser un paramètre dérivé de EventArgs.
Du style :

Class CheckUserInputEventArgs
inherits EventArgs
Public Retour As Boolean
End Class

Public Delegate Sub CheckUserInputEventHandler(sender as Object, e as
CheckUserInputEventArgs)

Public Event BeforeUpdate As CheckUserInputEventHandler

Protected Overridable Sub OnBeforeUpdate(e as CheckUserInputEventArgs)
RaiseEvent BeforeUpdate(Me, e)
End Sub

Private Sub dbSel_BeforeUpdate()
MyBase.dbSelect.SelectedRecords.GetRecord(0).ClearTables()
Dim e As New CheckUserInputEventArgs
e.Retour = True
Me.OnBeforeUpdate(e)
End Function




--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)




Avatar
Fred
Dans : news:,
claudetom disait :
Ca marche presque
mais les Events servaient aussi à des Addhandler
qui pointe vers des fonctions

Donc avec ta réponse il me dit forcément que les signatures sont
différentes.



Oui, j'ai repris le schéma classique :
Un paramètre sender
Un paramètre EventArgs (dans ce cas précis : dérivé de EventArgs)

Soit tu adaptes tes procédures de gestion d'évènement, soit tu modifies
mon exemple.
Le plus judicieux est, à mon avis, de modifier la signature des
procédures connectées à l'évènement.
Avec ces deux paramètres, tu couvres tous les cas de figure. Si les
besoins en retour changent, il suffit de modifier la classe EventArgs et
tout le reste suit.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
claudetom
Voici exactement ce qu'il devrait être mais Event non fonctionnel

Le Délégate qui se trouve sur un module
Public Delegate Function CheckUserInputEvent() As Boolean

'L'event de la class FormPrincipal
Public Event BeforeActionClear As CheckUserInputEvent
'Erreur :Les événements ne peuvent pas être déclarés avec un type délégué
ayant un type de retour.

'Execute ce qu'il y'a dans le If si vrai ou nothing
Public Sub ActionClear()
If Me.BeforeActionClear Is Nothing Or Me.BeforeActionClear() Then
......
End If
End Sub


Création Evennement sur TiForm_BeforeActionClear (Function) qui se trouve
sur Class TiForm
AddHandler MyBase.BeforeActionClear, New CheckUserInputEvent(AddressOf
Me.TiForm_BeforeActionClear)

'La Fonction qui retourne une valeur
Private Function TiForm_BeforeActionClear() As Boolean
Me.EnableComponent()
Return True
End Function

J'ai le même principe pour d'autre type de fonction qui retourne une valeur
environs 30
Quelle est la correction à effectuer ?

1 exemple d'une seule me mettrait sur la piste car je ne suis pas très au
point avec ce genre de code
Merci


"Fred" a écrit :

Dans : news:,
claudetom disait :
> Ca marche presque
> mais les Events servaient aussi à des Addhandler
> qui pointe vers des fonctions
>
> Donc avec ta réponse il me dit forcément que les signatures sont
> différentes.

Oui, j'ai repris le schéma classique :
Un paramètre sender
Un paramètre EventArgs (dans ce cas précis : dérivé de EventArgs)

Soit tu adaptes tes procédures de gestion d'évènement, soit tu modifies
mon exemple.
Le plus judicieux est, à mon avis, de modifier la signature des
procédures connectées à l'évènement.
Avec ces deux paramètres, tu couvres tous les cas de figure. Si les
besoins en retour changent, il suffit de modifier la classe EventArgs et
tout le reste suit.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)




Avatar
Fred
Dans : news:,
claudetom écrivait :

1 exemple d'une seule me mettrait sur la piste car je ne suis pas
très au point avec ce genre de code



Peux-tu exposer précisément ce que tu veux faire ?
Je ne vois pas très bien à la lecture du code.
Quel est cet évènement BeforeActionClear ? Où est-il déclenché ? À quoi
doit servir cette valeur de retour ?
Si le premier exemple ne conviens pas, je crains d'avoir très mal
compris la problématique.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
claudetom
Pour être plus claire voici ce que j'ai fait en me servant de ce que tu avais
écrit :

*** Cela le semble mais..***

'Le Délégate
Public Delegate Sub CheckUserInputEvent(ByVal e As CheckUserInputEventArgs)

Public Class CheckUserInputEventArgs
Inherits EventArgs
Public Retour As Boolean
End Class

'Pour l'Event
Public Event BeforeInsert As CheckUserInputEvent

'Pour l'assignation par :
AddHandler MyBase.dbC.BeforeInsert, New CheckUserInputEvent(AddressOf
Me.dbC_BeforeInsertX)

Private Sub dbC_BeforeInsertX(ByVal Value As CheckUserInputEventArgs)
Value.Retour = dbC_BeforeInsert()
End Sub

Public Function Insert(ByVal getID As Boolean) As Integer
Dim e As New CheckUserInputEventArgs
RaiseEvent BeforeInsert(e) 'va d'éclencher l'execution de la
fonction et mettre sa valeur dans Retour
...
'Ici test la valeur de retour ou si not nothing si les 2 alors poursuit le
reste du code
If (Not IsNothing(e) AndAlso Not e.Retour) Then
Return -1
End If
end Function

MERCI

"Fred" a écrit :

Dans : news:,
claudetom écrivait :

> 1 exemple d'une seule me mettrait sur la piste car je ne suis pas
> très au point avec ce genre de code

Peux-tu exposer précisément ce que tu veux faire ?
Je ne vois pas très bien à la lecture du code.
Quel est cet évènement BeforeActionClear ? Où est-il déclenché ? À quoi
doit servir cette valeur de retour ?
Si le premier exemple ne conviens pas, je crains d'avoir très mal
compris la problématique.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)




Avatar
Fred
Dans : news:,
claudetom écrivait :

'Ici test la valeur de retour ou si not nothing si les 2 alors
poursuit le reste du code
If (Not IsNothing(e) AndAlso Not e.Retour) Then
Return -1
End If
end Function



Est-ce tu souhaites créer un évènement qui permette d'annuler une action
?
(Un peu comme l'évènement Closing d'une form qui permet d'annuler la
fermeture avec un paramètre de type CancelEventArgs)


--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
claudetom
Bonsoir,
Oui c'est ce qu'il se passe dans les procédures si la fonction dans le cas
de l'exemple précédent si retourúlse alors n'execute pas le code qu'il y'a
dans la parti IF ENDIF.

Merci

"Fred" a écrit :

Dans : news:,
claudetom écrivait :

> 'Ici test la valeur de retour ou si not nothing si les 2 alors
> poursuit le reste du code
> If (Not IsNothing(e) AndAlso Not e.Retour) Then
> Return -1
> End If
> end Function

Est-ce tu souhaites créer un évènement qui permette d'annuler une action
?
(Un peu comme l'évènement Closing d'une form qui permet d'annuler la
fermeture avec un paramètre de type CancelEventArgs)


--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)




Avatar
Fred
Dans : news:,
claudetom écrivait :
Bonsoir,
Oui c'est ce qu'il se passe dans les procédures si la fonction dans
le cas de l'exemple précédent si retourúlse alors n'execute pas le
code qu'il y'a dans la parti IF ENDIF.



Bon,
je suppose donc que le but poursuivi est le suivant :

Une classe doit faire un traitement.
Avant de le faire, elle déclenche un évènement qui peut être intercepté
par une autre classe.
Cet évènement doit pouvoir récupérer une annulation éventuelle du
traitement.

Si c'est bien cela, alors la petite application console suivante
illustre une façon de procéder :

Module Module1

Sub Main()
Dim t As New Test
AddHandler t.BeforeInsert, _
AddressOf Test_BeforeInsert
t.Insert("String")
t.Insert(DateTime.Now)
t.Insert(5)
Console.ReadLine()
End Sub

Private Sub Test_BeforeInsert( _
ByVal sender As Object, _
ByVal e As TestEventArgs)
e.Cancel = Not InsertAllowed(e.Data)
End Sub

Private Function InsertAllowed(ByVal o As Object) As Boolean
Return TypeOf o Is Int32
End Function

End Module


Public Class TestEventArgs
Inherits EventArgs
Public Data As Object = Nothing
Public Cancel As Boolean = False
End Class

Public Delegate Sub TestEventHandler( _
ByVal sender As Object, _
ByVal e As TestEventArgs)

Public Class Test
Public Event BeforeInsert As TestEventHandler

Protected Overridable Sub OnBeforeInsert( _
ByVal e As TestEventArgs)
RaiseEvent BeforeInsert(Me, e)
End Sub

Public Sub Insert(ByVal o As Object)
Dim e As New TestEventArgs
e.Data = o
Me.OnBeforeInsert(e)
If e.Cancel Then Exit Sub
Console.WriteLine(o.ToString & " inséré")
End Sub

End Class

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
1 2