Besoin d'aide, Urgent. Pb de Type défini dans un ocx
1 réponse
Philippe Da Costa
Bonjour,
j'aurai besoin d'eclaicicement sur un point.
J'ai un ocx avec défini à l'interieur de celui-ci :
Public Type typeRequete
ChampsObligatoire As String
Champs As String
End Type
Dim m_Requete As typeRequete
Public Property Get Requete() As typeRequete
Requete = m_Requete
End Property
Public Property Let Requete(New_Requete As typeRequete)
m_Requete = New_Requete
End Property
Donc il y a un type, une variable interne, et une propriété en
lecture/ecriture
Depuis mon programme qd j'essaye d'accéder à ma structure
par MsgBox MonOcx.Requete.Champs
tout marche bien
par contre qd je fais MonOcx.Requete.ChampsObligatoire ="toto"
ca ne marche pas.
VB ne plante pas, mais ma structure n'est pas effacté.
De plus en mode debug, au lieu d'aller logiquement dans la propriété Let,
il va dans le Get.
Du coup je comprends plus rien :)
Y a -t-il qqch que je fais de mal, qqun a t-il deja eu ce pb ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Zoury
Salut Philippe! :O)
par contre qd je fais MonOcx.Requete.ChampsObligatoire ="toto" ca ne marche pas. VB ne plante pas, mais ma structure n'est pas effacté.
hmmm.. ici ça ne plante pas, mais la structure n'est pas affectée en effet...
De plus en mode debug, au lieu d'aller logiquement dans la propriété Let, il va dans le Get.
C'est normal. Analysons un peu ta ligne de code afin de comprendre ce qui se passe...
ta ligne complète '*** UserControl1.Requete.ChampsObligatoire = "bla bla bla" '***
la section suivante '*** UserControl1.Requete '*** te renvoit une structure typeRequete... d'où l'appel de la property Get sur ton objet. Je **suspecte** que la structure retournée soit une copie de l'original ce qui expliquerait que la valeur ne soit pas modifié sur l'original lorsque tu la modifie..
si tu veux palier à ce problème, je te conseillerais fortement une classe au lieu d'un type.
<non testé> '*** ' CRequete, module de classe Option Explicit
Private m_sChamps As String Private m_sChampsObligatoire As String
Public Property Get Champs() As String Champs = m_sChamps End Property
Public Property Let Champs(ByRef sChamps As String) m_sChamps = sChamps End Property
Public Property Get ChampsObligatoire() As String ChampsObligatoire = m_sChampsObligatoire End Property
Public Property Let ChampsObligatoire(ByRef sChampsObligatoire As String) m_sChampsObligatoire = sChampsObligatoire End Property '***
et dans ton ocx '*** ' UserControl1 Option Explicit
Private m_req As CRequete
Public Property Get Requete() As CRequete Set Requete = m_req End Property
Public Property Set Requete(ByRef req As CRequete) Set m_req = req End Property
Private Sub UserControl_Initialize() ' Tu peux également ne pas l'instancier... Set m_req = New CRequete End Sub
Private Sub UserControl_Terminate() Set m_req = Nothing End Sub '***
et lors de l'utilisation '***
' Fonctionne si instancier dans le UserControl_Initialize... ' Sinon, décommentatiser la ligne suivante ' Set UserControl1.Requete = New CRequete
Merci de poster les réponses au groupe afin d'en faire profiter à tous
Salut Philippe! :O)
par contre qd je fais MonOcx.Requete.ChampsObligatoire ="toto"
ca ne marche pas.
VB ne plante pas, mais ma structure n'est pas effacté.
hmmm.. ici ça ne plante pas, mais la structure n'est pas affectée en
effet...
De plus en mode debug, au lieu d'aller logiquement dans la propriété Let,
il va dans le Get.
C'est normal. Analysons un peu ta ligne de code afin de comprendre ce qui se
passe...
ta ligne complète
'***
UserControl1.Requete.ChampsObligatoire = "bla bla bla"
'***
la section suivante
'***
UserControl1.Requete
'***
te renvoit une structure typeRequete... d'où l'appel de la property Get sur
ton objet. Je **suspecte** que la structure retournée soit une copie de
l'original ce qui expliquerait que la valeur ne soit pas modifié sur
l'original lorsque tu la modifie..
si tu veux palier à ce problème, je te conseillerais fortement une classe au
lieu d'un type.
<non testé>
'***
' CRequete, module de classe
Option Explicit
Private m_sChamps As String
Private m_sChampsObligatoire As String
Public Property Get Champs() As String
Champs = m_sChamps
End Property
Public Property Let Champs(ByRef sChamps As String)
m_sChamps = sChamps
End Property
Public Property Get ChampsObligatoire() As String
ChampsObligatoire = m_sChampsObligatoire
End Property
Public Property Let ChampsObligatoire(ByRef sChampsObligatoire As String)
m_sChampsObligatoire = sChampsObligatoire
End Property
'***
et dans ton ocx
'***
' UserControl1
Option Explicit
Private m_req As CRequete
Public Property Get Requete() As CRequete
Set Requete = m_req
End Property
Public Property Set Requete(ByRef req As CRequete)
Set m_req = req
End Property
Private Sub UserControl_Initialize()
' Tu peux également ne pas l'instancier...
Set m_req = New CRequete
End Sub
Private Sub UserControl_Terminate()
Set m_req = Nothing
End Sub
'***
et lors de l'utilisation
'***
' Fonctionne si instancier dans le UserControl_Initialize...
' Sinon, décommentatiser la ligne suivante
' Set UserControl1.Requete = New CRequete
par contre qd je fais MonOcx.Requete.ChampsObligatoire ="toto" ca ne marche pas. VB ne plante pas, mais ma structure n'est pas effacté.
hmmm.. ici ça ne plante pas, mais la structure n'est pas affectée en effet...
De plus en mode debug, au lieu d'aller logiquement dans la propriété Let, il va dans le Get.
C'est normal. Analysons un peu ta ligne de code afin de comprendre ce qui se passe...
ta ligne complète '*** UserControl1.Requete.ChampsObligatoire = "bla bla bla" '***
la section suivante '*** UserControl1.Requete '*** te renvoit une structure typeRequete... d'où l'appel de la property Get sur ton objet. Je **suspecte** que la structure retournée soit une copie de l'original ce qui expliquerait que la valeur ne soit pas modifié sur l'original lorsque tu la modifie..
si tu veux palier à ce problème, je te conseillerais fortement une classe au lieu d'un type.
<non testé> '*** ' CRequete, module de classe Option Explicit
Private m_sChamps As String Private m_sChampsObligatoire As String
Public Property Get Champs() As String Champs = m_sChamps End Property
Public Property Let Champs(ByRef sChamps As String) m_sChamps = sChamps End Property
Public Property Get ChampsObligatoire() As String ChampsObligatoire = m_sChampsObligatoire End Property
Public Property Let ChampsObligatoire(ByRef sChampsObligatoire As String) m_sChampsObligatoire = sChampsObligatoire End Property '***
et dans ton ocx '*** ' UserControl1 Option Explicit
Private m_req As CRequete
Public Property Get Requete() As CRequete Set Requete = m_req End Property
Public Property Set Requete(ByRef req As CRequete) Set m_req = req End Property
Private Sub UserControl_Initialize() ' Tu peux également ne pas l'instancier... Set m_req = New CRequete End Sub
Private Sub UserControl_Terminate() Set m_req = Nothing End Sub '***
et lors de l'utilisation '***
' Fonctionne si instancier dans le UserControl_Initialize... ' Sinon, décommentatiser la ligne suivante ' Set UserControl1.Requete = New CRequete