WithEvents [Résolu]

lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 6 juil. 2006 à 19:37 - Dernière réponse : lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention
- 8 juil. 2006 à 18:38
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
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 8 juil. 2006 à 17:53
3
Merci
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

Merci PCPT 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 119 internautes ce mois-ci

Commenter la réponse de PCPT
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 6 juil. 2006 à 19:47
0
Merci
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
Commenter la réponse de cs_Jack
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 6 juil. 2006 à 20:10
0
Merci
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
Commenter la réponse de lispo
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 7 juil. 2006 à 03:15
0
Merci
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
Commenter la réponse de cs_Jack
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 7 juil. 2006 à 04:42
0
Merci
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
Commenter la réponse de PCPT
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 7 juil. 2006 à 10:29
0
Merci
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
Commenter la réponse de lispo
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 7 juil. 2006 à 12:15
0
Merci
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
Commenter la réponse de PCPT
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 7 juil. 2006 à 12:53
0
Merci
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
Commenter la réponse de cs_Jack
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 7 juil. 2006 à 15:38
0
Merci
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
Commenter la réponse de lispo
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 7 juil. 2006 à 16:21
0
Merci
comment se nomme ta classe ?

<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Commenter la réponse de PCPT
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 8 juil. 2006 à 10:36
0
Merci
Elle se nome "Cercle"
Commenter la réponse de lispo
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 8 juil. 2006 à 10:48
0
Merci
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
Commenter la réponse de PCPT
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 8 juil. 2006 à 17:37
0
Merci
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
Commenter la réponse de lispo
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 8 juil. 2006 à 17:53
0
Merci
faut aussi y mettre du tien !
Commenter la réponse de PCPT
lispo 49 Messages postés dimanche 2 octobre 2005Date d'inscription 1 septembre 2008 Dernière intervention - 8 juil. 2006 à 18:38
0
Merci
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
Commenter la réponse de lispo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.