WithEvents [Résolu]

Signaler
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008
-
lispo
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008
-
Bonjour a tous,
J 'ai crée une classe cercle(Vba AutoCad)
mais je voudrais lui attribuer un evenement(ex: apparition d'un msgbox)
voila comment j'ai fait ma classe

''' Dans mon module Class
Public Event RayonChanger()


Private C_Rayon As Double
Private C_Air As Double
Private C_Centre As Variant
Public Objcercle As AcadCircle
Private Sub Class_Initialize()
    C_Rayon = 1
End Sub


Public Property Let Rayon(Valeur As Double)
    C_Rayon = Valeur
    RaiseEvent RayonChanger
End Property


Public Property Get Rayon() As Double
   Rayon = C_Rayon
End Property


Public Property Let Centre(Valeur As Variant)
    C_Centre = Valeur
End Property


Public Property Get Centre() As Variant
   Centre = C_Centre
End Property


Public Property Get Air() As Double
    Air = 2 * 3.14159265358979 * C_Rayon
End Property


Public Property Get Circonference() As Double
    Circonference = 3.14159265358979 * (C_Rayon * 2)
End Property


Public Property Get Pos_Centre() As Variant
Pos_Centre = Centre(0) & " / " & Centre(1) & " / " & Centre(2)
End Property


Public Property Get Diametre() As Double
Diametre = 2 * C_Rayon
End Property


Function Draw_Cercle() As Object
Set Objcercle = ThisDrawing.ModelSpace.AddCircle(Centre, Rayon)
Objcercle.Update
End Function
Private Sub cercle1_RayonChanger()
MsgBox "Rayon a changer " & Rayon
End Sub

'Dans un module normale

Private Sub Button1_Click()
Dim cercle1 As New cercle
Me.Hide
With ThisDrawing.Utility
cercle1.Centre = .GetPoint(, " Centre !")
cercle1.Rayon = 50
End With
cercle1.Draw_Cercl
End Sub

-------------------
--------------------


'' Puis j'ai rajouter tout ce qui est en bleu pour mon evenement
mais quand je change de Rayon rien n'apparait.
Si quelqu'un pourrais m'aider ca serais kool
Merci d'avance

15 réponses

Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
c'est bien ce que je dis, tu as mal regardé le code...
comment veux-tu recevoir un évènement d'un objet qui n'est pas instancié pour toute la durée de vie de la Form.....

il faut :
Set Cercle1 = New
Cercle

dans le Form_Load ou UserForm_Load (je te rapelle que je n'utile pas VBA...)

++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
63
Salut
En supopoisant que ta classe s'appelle clsCercle (évite les noms qui pourraient ressembler à des mots clé) :
Dans ton module, il faut créer une instance de cette classe au niveau de la déclaration, pas dans une procédure.
De plus, comme ta classe génère des Events, il faut le spécifier dans la déclaration :
Private WithEvents Cercle1 As ClsCercle

Pour info, un Event peut envoyer aussi des paramètres :
Public Event RayonChanger(ByVal Valeur As Double)
Et dans l'évènement Private Sub cercle1_RayonChanger(ByVal Valeur As Double)
tu pourras utiliser directement la valeur fournie par le RaiseEvent RayonChanger(C_Rayon) dans ton
MsgBox "Rayon a changer " & CStr(Valeur)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Re-Bonjour,
Désoler je n'ais pas tout a fait saisie ce que tu écris

qui va dans le module de class et qui va dans ma Form
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
63
Re
Un petit peu de reflexion et tu devrais trouver seul ...
Bien sûr, la déclaration de ta classe génératrice d'évènement va dans la partie déclaration de ta forme.
Bien sûr la déclaration de l'évènement est celle qui existe déjà dans ta classe, je n'ai fait que rajouter un paramètre qui sera transmis avec le RaiseEvent.
Le MsgBox, lui, va dans l'évènement ChangerRayon, là où tu l'avais déjà mis. La seule différence, c'est qu'il affichera une donnée qui lui ait fournie par l'évènement (donc qui vient de ta classe) et pas la valeur 'Rayon' qui n'existe que dans ta forme.

Si tu ne comprends pas, laisse tomber. Contente toi de mettre la déclaration de ton instance de classe dans la partie déclaration de ta forme, ça suffira pour faire délencher l'évènement par le RaiseEvent.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,
à noter qu'un module ne peut recevoir d'évènement

++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Re-bonjour,
 Je suis désoler de te faire perdre ton temps(Jack), mais ce qui  parait a toi chose facile,   parait a moi etre un gouffre 
voila j'ai fais les modification mais toujour pas d'evenement,il ne bloque pas, mais pas de msgbox quand je change le rayon du cercle!
ça serais vraiment genial si tu pouvais m'aider
merci encore.

''Donc dans  mon module de clase

Public Event RayonChanger(ByVal Valeur As Double)
Private C_Rayon As Double
Private C_Air As Double
Private C_Centre As Variant
Public Objcercle As AcadCircle
Private Sub Class_Initialize()
    C_Rayon = 1
End Sub


Public Property Let Rayon(Valeur As Double)
    C_Rayon = Valeur
    RaiseEvent RayonChanger(C_Rayon)
End Property


Public Property Get Rayon() As Double
   Rayon = C_Rayon
End Property


Public Property Let Centre(Valeur As Variant)
    C_Centre = Valeur
End Property


Public Property Get Centre() As Variant
   Centre = C_Centre
End Property


Public Property Get Air() As Double
    Air = 2 * 3.14159265358979 * C_Rayon
End Property


Public Property Get Circonference() As Double
    Circonference = 3.14159265358979 * (C_Rayon * 2)
End Property


Public Property Get Pos_Centre() As Variant
Pos_Centre = Centre(0) & " / " & Centre(1) & " / " & Centre(2)
End Property


Public Property Get Diametre() As Double
Diametre = 2 * C_Rayon
End Property


Function Draw_Cercle() As Object
Set Objcercle = ThisDrawing.ModelSpace.AddCircle(Centre, Rayon)
Objcercle.Update
End Function
Private Sub cercle1_RayonChanger()
MsgBox "Rayon a changer " & CStr(Valeur)
End Sub
'---------------------------------------------------------


' et dans ma Form
Private WithEvents Cercle1 As cercle

Private Sub UserForm_Click()
Dim Cercle1 As New cercle
Me.Hide
With ThisDrawing.Utility
Cercle1.Centre = .GetPoint(, " Centre !")
Cercle1.Rayon = 50
End With
Cercle1.Draw_Cercle
End Sub
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,

'   dans le module de classe (nommé ici "Class1")
'
Private C_Rayon As Double 
Private C_Air As Double 
Private C_Centre As Variant 
Public Objcercle As New AcadCircle 
Public Event RayonChanger(ByVal Valeur As Double) 

Private Sub Class_Initialize() 
    C_Rayon =  1 
End Sub 
Private Sub Class_Terminate() 
    Set Objcercle = Nothing 
End Sub 

Public Property Let Rayon(Valeur As Double) 
    C_Rayon = Valeur 
    RaiseEvent RayonChanger(C_Rayon) 
End Property 
Public Property Get Rayon() As Double 
   Rayon = C_Rayon 
End Property 

Public Property Let Centre(Valeur As Variant) 
    C_Centre = Valeur 
End Property 
Public Property Get Centre() As Variant 
   Centre = C_Centre 
End Property 

Public Property Get Air() As Double 
    Air = 2 * 3.14159265358979 * C_Rayon 
End Property 
Public Property Get Circonference() As Double 
    Circonference = 3.14159265358979 * (C_Rayon * 2) 
End Property 
Public Property Get Pos_Centre() As Variant 
    Pos_Centre = Centre(0) & " / " & Centre(1) & " / " & Centre(2) 
End Property 
Public Property Get Diametre() As Double 
    Diametre = 2 * C_Rayon 
End Property 

Function Draw_Cercle() As Object 
    Set Objcercle = ThisDrawing.ModelSpace.AddCircle(Centre, Rayon) 
    Objcercle.Update 
End Function 

'   dans la form (nommée Form1, exemple en VB6, pas VBA....)
'
Private WithEvents Cercle1 As Class1 

Private Sub Form_Click() 
    Me.Hide 
    With ThisDrawing.Utility 
        Cercle1.Centre = .GetPoint(, " Centre !") 
        Cercle1.Rayon = 50 
    End With 
    Cercle1.Draw_Cercle 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    Set Cercle1 = Nothing 
End Sub 

Private Sub cercle1_RayonChanger(ByVal Valeur As Double) 
    MsgBox "Rayon a changer " &  CStr (Valeur) 
End Sub

<small> Coloration
syntaxique automatique [AFCK]</small>
       

évènements de la Form à remplacer par ceux du UserForm

++
PCPT   [AFCK]

<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
63
Re
PCT a été plus rapide et plus complet dans la réponse.
"Module" : Comme c'est sous VBA, des fois les termes changent par rapport à VB6, c'est pourquoi je n'avait pas relevé ce détail.

Lispo : Tes corrections sont correctes.
Il faut en effet juste vérifier que :
La déclaration  Private WithEvents Cercle1 As Class1
soit bien dans une Forme
ET que la déclaration  Private Sub cercle1_RayonChanger(ByVal Valeur As Double)
  soit elle aussi dans la Forme
ET que sa syntaxe reflète bien la déclaration (avec le/les paramètres)

Si le terme Module en VBA est le même que sous VB6, tu ne peux pas générer d'evènement à partir d'un module mais uniquement à partir d'un Objet

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Re-Bonjour,
Aujourd 'hui je suis accrocheur,j'ai refait toutes les modifications .
mais!( il y a toujour un mais) il beug
il beug sur ma Form le msg  d'erreur dit run-time error 91 - Object Variable or With block variable not set
Voila le contenu de ma  Form
 
Private WithEvents Cercle1 as cercle

 Private Sub UserForm_Click()
 Me.Hide
 With ThisDrawing.Utility
 Cercle1.Centre = .GetPoint(, " Centre !")
 Cercle1.Rayon = 50
 End With
 Cercle1.Draw_Cercle
 End Sub

 Private Sub cercle1_RayonChanger(ByVal Valeur As Double)
 ''MsgBox "rayon a changer " & CStr(Valeur)
 End Sub
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
comment se nomme ta classe ?

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Elle se nome "Cercle"
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
salut,

soit tu t'es planté dans le copier/coller, soit c'est ton utilisation de AcadCircle qui est faussée....

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Salut,
Le probleme est que si je ne met pas le (Dim Cercle1 As New Cercle ) il beug et quand je le met il y a rien qui se fasse "il dessine le cercle mais pas de msgbox"

Private WithEvents Cercle1 As
 Cercle

Private Sub Form_Click() 
    Me.Hide 
   Dim Cercle1 As New Cercle
    
With ThisDrawing.Utility 
        Cercle1.Centre = .GetPoint(, " Centre !") 
        Cercle1.Rayon = 50 
    
End With 
    Cercle1.Draw_Cercle 

End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    
Set Cercle1 = Nothing 

End Sub 

Private Sub cercle1_RayonChanger(ByVal Valeur As Double) 
    
MsgBox "Rayon a changer " & CStr(Valeur) 

End Sub
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
30
faut aussi y mettre du tien !
Messages postés
49
Date d'inscription
dimanche 2 octobre 2005
Statut
Membre
Dernière intervention
1 septembre 2008

Re-Salut PCPT
Un grand merci sans toi je n'y serais jammais arriver (j'étais au bord de la crise de nerf)
Merci encore
 bye