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

Besoin d'aide, Urgent. Pb de Type défini dans un ocx

1 réponse
Avatar
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 ?

Merci

1 réponse

Avatar
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

UserControl1.Requete.ChampsObligatoire = "blablabla"

'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous