PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 21 nov. 2005 à 13:44
bon, j'ai essayé avec la proposition de CRenaud, sans succès.
voici une alternative fonctionnelle.
problème avec Type, obligé en module....
'=-=-=-=
'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 = New CTEST
Dim tClassBValues As tMaClass
tClassBValues = b.GetAll
c.SetAll tClassBValues
Debug.Print "c est initialisée, a récupéré b, et contient " & c.modify
Modifier c
Debug.Print "c est modifiée par SUB et contient " & c.modify
Debug.Print "b vérifie?? " & b.modify
End Sub
'
'
Private Sub Modifier(ByRef MyVar As CTEST)
MyVar.modify = 100
End Sub
'
'
Private Sub Form_Unload(Cancel As Integer)
Set b = Nothing
Set c = Nothing
End Sub
'=-=-=-=
'COPIER DANS UN MODULE DE CLASSE APPELÉ CTEST
'=-=-=-=
'
'
Option Explicit
'
'
Private m_var As Integer
Private m_cha As String
'
'
Public Property Let modify(v As Integer)
m_var = v
End Property
Public Property Get modify() As Integer
modify = m_var
End Property
'
'
Public Property Let chaine(v As String)
m_cha = v
End Property
Public Property Get chaine() As String
chaine = m_cha
End Property
'
'
Friend Function GetAll() As tMaClass
Err.Clear
On Error GoTo ErrHandler
GetAll.tModify = Me.modify
GetAll.tChaine = Me.chaine
On Error GoTo 0 ' *FGE*
Exit Function
ErrHandler:
Err.Raise Err.Number, , Err.Description
End Function
'
'
Friend Sub SetAll(ByRef tVals As tMaClass)
Err.Clear
On Error GoTo ErrHandler
Me.modify = tVals.tModify
Me.chaine = tVals.tChaine
On Error GoTo 0 ' *FGE*
Exit Sub
ErrHandler:
Err.Raise Err.Number, , Err.Description
End Sub
codea
Messages postés94Date d'inscriptiondimanche 9 mai 2004StatutMembreDernière intervention 6 août 2006 21 nov. 2005 à 14:24
J'ai essayé la solution de CR avec success, en fait, il m'a fallu
trouver quelle était la taille mémoire de mon objet ... j'y suis allé
par tatonnement... la valeur que j'ai trouvé est 4 byte. Ca fais
combien ca ? ... ca peut changer facilement ? parce qu'actuellement
j'ai pas d'autre moyer de trouver la taille d'un objet que par
essai-erreur ... et quand ca plante ... ca plante ... avec les api ...
ca fais même fermer vb... Mais j'ai cherché un peu et j'ai rien trouvé
a part LenB qui puisse retourner la taille d'un obj.... et lenB
fonctionne juste pour les structures et les string... si c une classe
ca marche pas ! y paraitrait que le créateur d'objet Com est totalement
transaparent de l'utilisateur et il ne retourne pas la taille de
l'objet qu'il crée lors de l'utilisation du mot clé New.
Pas moyen de savoir la taille d'un p.. d'objet ( de classe ).
Mon Code qui fonctionne :
Private Function TabuSearch(ByVal Hr1 As cHoraire) As cHoraire
Dim S0 As New cHoraire
CopyMemory S0, Hr1, 4
Set TabuSearch = S0
End Function
Merci pcpt, Cr, vsm'avez tous deux donné un sérieux coup de main la ...
Je crois qu'on pourrait partir un nouveau forum sur comment connaître la taille d'un objet ;o)
celui-ci est bien garni....
@+ et merci encore, (vous avez fait ma journée la)
ps: pcpt, la dernière méthode que tu as créée, j'aime mieux pas m'en
servir car ca va me prendre un temps fou a coder vu la taille de ma
classe.... mais je te remercie et pour consolation, j'apprends
toujours en lisant ton code il est bien fait ;o)
codea
Messages postés94Date d'inscriptiondimanche 9 mai 2004StatutMembreDernière intervention 6 août 2006 21 nov. 2005 à 14:37
En fais ca a copié mes pointeurs... oops...
ca marche po :( ....
ca modifie encore l'objet copié ! ....
j'avais pas testé .... j'avais juste vu que mon objet était empli de données...
mais mon objet n'ocuppe certainement pas un espace de mémoire contigu,
étant donné qu'il possède des pointeurs aussi pour d'autre objets ....
ce qui veut dire que le memCopy ne pourrait certainement pas les copier
... juste les référencer.... ca falloir que j'y aille manuellement !
... Et si j'avais fait ca hier ..j'aurais déja fini ... ! ...
@+
Rien ne sert de courir, il faut partir à point
Jean de la fontaine
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 24 nov. 2005 à 00:25
re,
je me suis renseigné de mon côté....
apparemment, dès qu'un Set est fait en rapport à un objet en mémoire, les pointeurs correspondent alors à la même allocation.
autrement dit (même si c'est encore un peu flou à ce niveau pour moi), même CopyMemory n'y changera rien (puisque BYREF forcément).
ma proposition peut être rébarbative, voire "impossible" selon ta classe...., mais çà reste la plus acceptable
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 24 nov. 2005 à 09:35
Avec CopyMemory, cela fonctionne tres bien ... tant que le membres de tes objets ne sont pas des string ou des objets eux meme.
En effet, si tu as dans ton objet les propriétés suivantes :
Public Prop1 As String
Public Prop2 As TypeObjetBis
Et bien VB stocke dans l'objet d'origine ... un pointeur sur la string ou l'objet de type TypeObjetBis ... Donc avec le CopyMemory, tu recopie les pointeurs. Il faudrait en fait dans ce cas, faire du AllocMemory() pour réserver de nouvelles instances d'une chaine et d'un objet de type TypeObjetBis pour la copie de l'objet de base, puis faire le CopyMemory sur Prop1 et Prop2 entre l'objet de base et les allocation mémoire faite juste avant. Et la ca foncitonnerait !!!! Une sorte de CopyMemory récursif en fait ...
A mon avis, c'est inexploitable, meme si avec la TLBInf on pourrait automatiser la chose dans une seule fonction quel que soit le type d'objet à recopier
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 24 nov. 2005 à 10:40
renfield < Ce que je proposait c'était justement de faire des copymemory de ce qui est pointé justement ! Pas des pointeurs directement !! On est bien d'accord