crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 21 nov. 2005 à 11:19
En VB6, les objets sont touours passé par référence, tout simplement parce que lorsque tu mets ceci ...
sub CopieObj(Byref Obj1 as cObject)
....
End sub
ou même ceci ...
sub CopieObj(Byval Obj1 as cObject)
....
End sub
VB ne transmet pas réellement Obj1 à la procédure CopieObj, il transmet un entier sur 32b représentant l'@ de l'objet en mémoire. Donc que tu mettes ByVal ou byRef, cela ne change rien ... LES OBJETS SONT TOUJOURS PASSE PAR REFERENCE.
pour faire une recopie de Obj1 vers Obj2, il faut passer par l'API RtlMoveMemory, déclarée comme ceci :
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
... et utilisée comme ceci ...
CopyMemory ObjPtr(Obj2), ObjPtr(Obj1), Ici la taille en mémoire de tes objets.
.. en lieu et place de la ligne
Set Obj2 = Obj1
Le seul Hic, c'ets si tes objets contiennent des string de longueur variable, tu va avoir des soucis pour connaitre la taille de tes objets !!!
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 20 nov. 2005 à 17:03
Salut,
Quand tu fais un set obj2 = obj1, obj2 prend toutes les propriétés de obj1, y compris sa position et sa taille, tu vois où je veux en venir ?
Ton obj2 se colle donc par-dessus ton obj1, d'où l'illusion que l'objet de départ affiche la même chose que obj2.
Décale ton obj2 : obj2.top = obj1.top + obj1.height et tu verras qu'il y a une différence.
-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
codea
Messages postés94Date d'inscriptiondimanche 9 mai 2004StatutMembreDernière intervention 6 août 2006 20 nov. 2005 à 17:26
Effectivement comme le mentionne pcpt, cObject est une classe.
J'ai essayé ton truc pcpt, remplacer byref par byval, et ca donne le
même résultat, ca modifie quand même l'instance de la classe passée en
paramètres...
je retourne étudier le problème ... merci bcp quand même les gars ;o) , si vous avez d'autre idées... ne vous gênez pas ....
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 20 nov. 2005 à 17:31
Tu as raison pcpt. Mais c'est le même principe, enfin faudrait savoir si c'est du vb6 ou du vb.net, les comportements ne sont pas tout à fait les mêmes.
-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 nov. 2005 à 18:49
sur ta Form principal (... en question), quelles sont tes déclarations de classes.
et dans ta classe cObjet, quel est le contenu de Public Sub Initialize()
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 nov. 2005 à 19:07
il était affiché.
ma question a pour but de savoir comment tu utilises ta classe.
j'ai lu ton code, çà ne me répond pas....
voici un exemple avec un composant
Option Explicit
'
'
Private Sub Form_Load()
Picture1.Picture = LoadPicture ("C:\tmp.jpg")
End Sub
'
'
Private Sub Command1_Click()
Set Picture2 = Picture1
End Sub
'
'
Private Sub Command2_Click()
Picture2.Picture = Nothing
End Sub
codea
Messages postés94Date d'inscriptiondimanche 9 mai 2004StatutMembreDernière intervention 6 août 2006 20 nov. 2005 à 21:05
petit exemple qui démontre ce que j'essaie de dire ! ...
si on suit l'évolution de la variable c à l'aide d'un espion, elle est
quand même modifiée par la fonction Modifier, et ne le devrait pas
puisque l'on fait un passage byval ... je voudrais que la fonction
Modifier ne modifie pas la valeur de la varaible c dans le FormLoad
--=-
COPIER DANS FORM1
-=-
Private Sub Form_Load()
Dim c As New cTest
c.modify = 1
Modifier c
End Sub
Private Sub Modifier(ByVal myvar As Object)
myvar.modify = 100
End Sub
--=-
COPIER DANS UN NOUVEAU MODULE DE CLASSE APPELÉ CTEST
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 20 nov. 2005 à 22:19
re,
mais ton exemple est totalement normal et c'est un cas de figure ou le ByVal/ByRef n'intervient pas.
peut-être ai-je mal compris.....
'=-=-=-
'COPIER DANS FORM1
'=-==-
'
'
Option Explicit
'
Dim b As New CTEST
Dim c As New CTEST
'
'
Private Sub Form_Load()
Me.Show
Set b = New CTEST
Debug.Print "b est initialisée et contient " & b.modify
b.modify = 1
Debug.Print "b est modifiée par PROP et contient " & b.modify
Set c = b
Debug.Print "c est initialisée et contient " & c.modify
Modifier c
Debug.Print "c est modifiée par SUB et contient " & c.modify
End Sub
'
'
Private Sub Modifier(ByVal myvar As Object)
myvar.modify = 100
End Sub
'
'
Private Sub Form_Unload(Cancel As Integer)
Set b = Nothing
Set c = Nothing
End Sub
'=-=-=-
'COPIER DANS UN NOUVEAU MODULE DE CLASSE APPELÉ CTEST
'=-=-=-=
'
'
Option Explicit
'
Private m_var As Integer
'
'
Public Property Let modify(v As Integer)
m_var = v
End Property
'
'
Public Property Get modify() As Integer
modify = m_var
End Property
apparemment, dès que l'objet est lié, seul un Nothing le dé-lie...
j'ai aussi essayé en passant par une 3e Var en locale (sub) détruite avant l'affichage final, pareil!
codea
Messages postés94Date d'inscriptiondimanche 9 mai 2004StatutMembreDernière intervention 6 août 2006 21 nov. 2005 à 03:07
Je sais ... je deviens dingue avec cette histoire de copie... rien a y faire ...
le problème c le set je crois ... y faudrais un autre mot clef du genre
copy .... p-e que cela serait possible mais avec un memCopy appelé avec
une dll api ... mais ca serait un peu complexe a réaliser ... ensuite
le truc devient une propritété .clone de la classe qui fonctionne avec
le memCopy ... mais c riducule ... dans la Doc de Vb ils parlent du Set
pour réaliser une référence sur un objet existant ... le new pour créer
un nouvel objet .... et rien pour copier un objet déja existant dans un
autre objet sans référence ...
Finalement, avec une classe un peu complexe (constituée de plusieurs
classes) ils serait vraiment pratique de pouvoir la copier sans avoir a
copier "Manuellement par affectation " toute les valeurs dans la
nouvelle classe... je suis surpris que personne n'ait encore rien
trouvé la dessus ? ... ou du moins j'ai rien trouvé d'évident a ce
sujet !!!...