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

Copier un Objet

16 réponses
Avatar
Pascal B.
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le même objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.

10 réponses

1 2
Avatar
ng
Salut,

En effet Set copie le pointeur, pour avoir une copie il faudra utiliser Let
:

Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont
Set oFont2 = New StdFont

oFont1.Bold = True

Let oFont2 = oFont1

oFont2.Bold = False

Debug.Print oFont1.Bold, oFont2.Bold

End Sub

On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Pascal B. wrote:
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet
ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.


Avatar
Pascal B.
Salut,

Hélas, non, ce n'est pas bon [je suis déçu :-( ]
.
En écrivant "Let oFont1 = oFont2",
on transfert UNIQUEMENT la propriété par défaut (ici Name),
alors qu'il aurait fallut le transfert de TOUTES les propriétés
(de n'importe quel objet)

Il reste toujours cette possibilité:

Obj2.PropertyA = Obj1.PropertyA
Obj2.PropertyB = Obj1.PropertyB
'....

mais elle est fastitieuse et elle n'est valable que pour un seul type d'object.

D'autres idées ?

Merci

Pascal B.


"ng" wrote in message news:
| Salut,
|
| En effet Set copie le pointeur, pour avoir une copie il faudra utiliser Let
| :
|
| Private Sub Form_Load()
| Dim oFont1 As StdFont
| Dim oFont2 As StdFont
|
| Set oFont1 = New StdFont
| Set oFont2 = New StdFont
|
| oFont1.Bold = True
|
| Let oFont2 = oFont1
|
| oFont2.Bold = False
|
| Debug.Print oFont1.Bold, oFont2.Bold
|
| End Sub
|
| On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.
|
| --
| Nicolas G.
| FAQ VB : http://faq.vb.free.fr
| API Guide : http://www.allapi.net
| Google Groups : http://groups.google.fr/
| MZ-Tools : http://www.mztools.com/
|
| Pascal B. wrote:
| > Bonjour à tous,
| >
| > (je sais pas si je vais être clair... bon je me lance)
| >
| > J'aimerais pouvoir créer une copie d'un objet.
| > Ce qui vient en premier à l'esprit, c'est d'écrire:
| >
| > Dim Obj as Class1
| > Dim CopyOfObj as Class1
| > '.....
| > Set CopyOfObj = Obj
| >
| > En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
| > objet.
| > Donc si je modifie CopyOfObj, Obj est modifié aussi.
| > Or, ce n'est pas ce que je veux !!
| >
| > Est-il possible d'écrire une fonction qui crée un *nouvel* objet
| > ayant le meme contenu que le premier objet ? (donc ayant les
| > propriétés)
| >
| > Exemple: Set CopyOfObj = CreateObjectCopy(Obj)
| >
| > Merci
| >
| > Pascal B.
|
|
Avatar
Quasimodo
Pascal B. brought next idea :
Salut,

Hélas, non, ce n'est pas bon [je suis déçu :-( ]
.
En écrivant "Let oFont1 = oFont2",
on transfert UNIQUEMENT la propriété par défaut (ici Name),
alors qu'il aurait fallut le transfert de TOUTES les propriétés
(de n'importe quel objet)

Il reste toujours cette possibilité:

Obj2.PropertyA = Obj1.PropertyA
Obj2.PropertyB = Obj1.PropertyB
'....

mais elle est fastitieuse et elle n'est valable que pour un seul type
d'object.

D'autres idées ?

Merci

Pascal B.


"ng" wrote in message
news:
Salut,

En effet Set copie le pointeur, pour avoir une copie il faudra utiliser Let




Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont
Set oFont2 = New StdFont

oFont1.Bold = True

Let oFont2 = oFont1

oFont2.Bold = False

Debug.Print oFont1.Bold, oFont2.Bold

End Sub

On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Pascal B. wrote:
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet
ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.







Bonjour,
il n'existe pas en vb6 de système/outils pour la recopie d'objet. La
seul méthode que je puisse vous indiquez est d'implimenter une méthode
propre à l'objet qui renvoie un objet du même type initialiser avec les
même valeurs.

@+ Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
YannX
Bonjour,

Novice en "Object" sous VB6, n'est-il pas possible de surcharger l'opérateur
ou l'opérateur LET ?
décidement, C++ est bien mieux foutu !

Autre idée : definir la classe en VC++ (avec l'opérateur Ad'hoc)
et l'utiliser en VB : des exemples ?

Et comment teste-t-on que l'objet est Non initialisé ?
Exemple:
SUB toto( , optional oBJ as MSHFlexGrid)
if <comment ? oBJ = Nothing ?

Y@+


"Quasimodo" a écrit dans le message de
news:
Pascal B. brought next idea :
> Salut,
>
> Hélas, non, ce n'est pas bon [je suis déçu :-( ]
> .
> En écrivant "Let oFont1 = oFont2",
> on transfert UNIQUEMENT la propriété par défaut (ici Name),
> alors qu'il aurait fallut le transfert de TOUTES les propriétés
> (de n'importe quel objet)
>
> Il reste toujours cette possibilité:
>
> Obj2.PropertyA = Obj1.PropertyA
> Obj2.PropertyB = Obj1.PropertyB
> '....
>
> mais elle est fastitieuse et elle n'est valable que pour un seul type
> d'object.
>
> D'autres idées ?
>
> Merci
>
> Pascal B.
>
>
> "ng" wrote in message
> news:
>> Salut,
>>
>> En effet Set copie le pointeur, pour avoir une copie il faudra utiliser


Let
>>>
>>
>> Private Sub Form_Load()
>> Dim oFont1 As StdFont
>> Dim oFont2 As StdFont
>>
>> Set oFont1 = New StdFont
>> Set oFont2 = New StdFont
>>
>> oFont1.Bold = True
>>
>> Let oFont2 = oFont1
>>
>> oFont2.Bold = False
>>
>> Debug.Print oFont1.Bold, oFont2.Bold
>>
>> End Sub
>>
>> On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.
>>
>> --
>> Nicolas G.
>> FAQ VB : http://faq.vb.free.fr
>> API Guide : http://www.allapi.net
>> Google Groups : http://groups.google.fr/
>> MZ-Tools : http://www.mztools.com/
>>
>> Pascal B. wrote:
>>> Bonjour à tous,
>>>
>>> (je sais pas si je vais être clair... bon je me lance)
>>>
>>> J'aimerais pouvoir créer une copie d'un objet.
>>> Ce qui vient en premier à l'esprit, c'est d'écrire:
>>>
>>> Dim Obj as Class1
>>> Dim CopyOfObj as Class1
>>> '.....
>>> Set CopyOfObj = Obj
>>>
>>> En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
>>> objet.
>>> Donc si je modifie CopyOfObj, Obj est modifié aussi.
>>> Or, ce n'est pas ce que je veux !!
>>>
>>> Est-il possible d'écrire une fonction qui crée un *nouvel* objet
>>> ayant le meme contenu que le premier objet ? (donc ayant les
>>> propriétés)
>>>
>>> Exemple: Set CopyOfObj = CreateObjectCopy(Obj)
>>>
>>> Merci
>>>
>>> Pascal B.

Bonjour,
il n'existe pas en vb6 de système/outils pour la recopie d'objet. La
seul méthode que je puisse vous indiquez est d'implimenter une méthode
propre à l'objet qui renvoie un objet du même type initialiser avec les
même valeurs.

@+ Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com



Avatar
Pascal B.
Salut,

J'ai trouvé une solution (assez simple d'ailleur!):

Public Function GetObjectCopy(Object As Object) As Object
Dim ProBag As New PropertyBag
ProBag.WriteProperty "Temp", Object
Set GetObjectCopy = ProBag.ReadProperty("Temp")
Set ProBag = Nothing
End Function

Private Sub Form_Load()
Dim F1 As New StdFont
Dim F2 As Object
F1.Bold = True
Set F2 = GetObjectCopy(F1)
Debug.Print F1.Bold, F2.Bold
F2.Bold = False
Debug.Print F1.Bold, F2.Bold
End Sub

MAIS il y a un MAIS:
Il faut que l'objet soit PUBLIC et PERSISTABLE.
Donc, pour un object (c-a-d sa Class) défini dans projet "EXE Standard", cette
fonction ne fonctionne pas puisque ces proprités n'existent pas.
(L'objet doit être défini dans un projet "ActiveX DLL")

Pascal B.




"Quasimodo" wrote in message news:
|
| Bonjour,
| il n'existe pas en vb6 de système/outils pour la recopie d'objet. La
| seul méthode que je puisse vous indiquez est d'implimenter une méthode
| propre à l'objet qui renvoie un objet du même type initialiser avec les
| même valeurs.
|
| @+ Quaz
|
| --
| This is an automatic signature of MesNews.
| Site : http://mesnews.no-ip.com
|
Avatar
ng
Aie en effet j'aurai dû mieux tester désolé.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

Pascal B. wrote:
Salut,

Hélas, non, ce n'est pas bon [je suis déçu :-( ]
.
En écrivant "Let oFont1 = oFont2",
on transfert UNIQUEMENT la propriété par défaut (ici Name),
alors qu'il aurait fallut le transfert de TOUTES les propriétés
(de n'importe quel objet)

Il reste toujours cette possibilité:

Obj2.PropertyA = Obj1.PropertyA
Obj2.PropertyB = Obj1.PropertyB
'....

mais elle est fastitieuse et elle n'est valable que pour un seul type
d'object.

D'autres idées ?

Merci

Pascal B.


"ng" wrote in message
news:
Salut,

En effet Set copie le pointeur, pour avoir une copie il faudra
utiliser Let




Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont
Set oFont2 = New StdFont

oFont1.Bold = True

Let oFont2 = oFont1

oFont2.Bold = False

Debug.Print oFont1.Bold, oFont2.Bold

End Sub

On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

Pascal B. wrote:
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet
ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.






Avatar
ng
Salut,

D'après ce que j'ai lu, le problème viendrait de COM, on ne pourrait donc
pas faire ca (sauf si on copie les property une à une) avec ces objets, j'ai
essayé plusieurs méthodes mais ca ne fonctionne pas. Voici mon code des fois
que ça en inspire certains :

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As
Long, pSrc As Long, ByVal ByteLen As Long)

Public Sub CloneObject(oObjectSrc As Object, oObjectDest As Object)
Call CopyMemory(ObjPtr(oObjectDest), ObjPtr(oObjectSrc),
LenB(oObjectSrc))
End Sub

Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont

oFont1.Bold = True
oFont1.Italic = True

Set oFont2 = New StdFont
Call CloneObject(oFont1, oFont2)

oFont2.Bold = False


Debug.Print "Nom", "oFont1", "oFont2"
Debug.Print "Pointeurs", ObjPtr(oFont1), ObjPtr(oFont2)
Debug.Print "Bold", oFont1.Bold, oFont2.Bold
Debug.Print "Italic", oFont1.Italic, oFont2.Italic


Set oFont1 = Nothing
Set oFont2 = Nothing
End Sub


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

YannX wrote:
Bonjour,

Novice en "Object" sous VB6, n'est-il pas possible de surcharger
l'opérateur > ou l'opérateur LET ?
décidement, C++ est bien mieux foutu !

Autre idée : definir la classe en VC++ (avec l'opérateur Ad'hoc)
et l'utiliser en VB : des exemples ?

Et comment teste-t-on que l'objet est Non initialisé ?
Exemple:
SUB toto( , optional oBJ as MSHFlexGrid)
if <comment ? oBJ = Nothing ?

Y@+


"Quasimodo" a écrit dans le message de
news:
Pascal B. brought next idea :
Salut,

Hélas, non, ce n'est pas bon [je suis déçu :-( ]
.
En écrivant "Let oFont1 = oFont2",
on transfert UNIQUEMENT la propriété par défaut (ici Name),
alors qu'il aurait fallut le transfert de TOUTES les propriétés
(de n'importe quel objet)

Il reste toujours cette possibilité:

Obj2.PropertyA = Obj1.PropertyA
Obj2.PropertyB = Obj1.PropertyB
'....

mais elle est fastitieuse et elle n'est valable que pour un seul
type d'object.

D'autres idées ?

Merci

Pascal B.


"ng" wrote in message
news:
Salut,

En effet Set copie le pointeur, pour avoir une copie il faudra
utiliser Let




Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont
Set oFont2 = New StdFont

oFont1.Bold = True

Let oFont2 = oFont1

oFont2.Bold = False

Debug.Print oFont1.Bold, oFont2.Bold

End Sub

On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

Pascal B. wrote:
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet
ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.







Bonjour,
il n'existe pas en vb6 de système/outils pour la recopie d'objet. La
seul méthode que je puisse vous indiquez est d'implimenter une
méthode propre à l'objet qui renvoie un objet du même type
initialiser avec les même valeurs.

@+ Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com




Avatar
Pascal B.
Salut,

J'ai étudié avec grand intérêt ta solution...
MAIS elle ne fonctionne PAS corrrectement !

En effet, oFont2.Italic est à False alors qu'il devrait être à True!

Pourquoi?
En fait, ça coince au niveau du LenB(oObjectSrc) qui retourne 10
ce qui correspond à la longueur de la string contenu dans la propriété
par défaut Name (2 x Len("Arial") = 10)
Donc LenB ne retourne pas la longueur d'un objet !!!

D'où ma question:
Existe-il une fonction qui retourne la longueur d'un Objet ??

Pascal B.


"ng" wrote in message news:%23chCU$
| Salut,
|
| D'après ce que j'ai lu, le problème viendrait de COM, on ne pourrait donc
| pas faire ca (sauf si on copie les property une à une) avec ces objets, j'ai
| essayé plusieurs méthodes mais ca ne fonctionne pas. Voici mon code des fois
| que ça en inspire certains :
|
| Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As
| Long, pSrc As Long, ByVal ByteLen As Long)
|
| Public Sub CloneObject(oObjectSrc As Object, oObjectDest As Object)
| Call CopyMemory(ObjPtr(oObjectDest), ObjPtr(oObjectSrc),
| LenB(oObjectSrc))
| End Sub
|
| Private Sub Form_Load()
| Dim oFont1 As StdFont
| Dim oFont2 As StdFont
|
| Set oFont1 = New StdFont
|
| oFont1.Bold = True
| oFont1.Italic = True
|
| Set oFont2 = New StdFont
| Call CloneObject(oFont1, oFont2)
|
| oFont2.Bold = False
|
|
| Debug.Print "Nom", "oFont1", "oFont2"
| Debug.Print "Pointeurs", ObjPtr(oFont1), ObjPtr(oFont2)
| Debug.Print "Bold", oFont1.Bold, oFont2.Bold
| Debug.Print "Italic", oFont1.Italic, oFont2.Italic
|
|
| Set oFont1 = Nothing
| Set oFont2 = Nothing
| End Sub
|
|
| --
| Nicolas G.
| FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
| API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
| Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
| MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/
|
| YannX wrote:
| > Bonjour,
| >
| > Novice en "Object" sous VB6, n'est-il pas possible de surcharger
| > l'opérateur | > ou l'opérateur LET ?
| > décidement, C++ est bien mieux foutu !
| >
| > Autre idée : definir la classe en VC++ (avec l'opérateur Ad'hoc)
| > et l'utiliser en VB : des exemples ?
| >
| > Et comment teste-t-on que l'objet est Non initialisé ?
| > Exemple:
| > SUB toto( , optional oBJ as MSHFlexGrid)
| > if <comment ? oBJ = Nothing ?
| >
| > Y@+
| >
| >
| > "Quasimodo" a écrit dans le message de
| > news:
| >> Pascal B. brought next idea :
| >>> Salut,
| >>>
| >>> Hélas, non, ce n'est pas bon [je suis déçu :-( ]
| >>> .
| >>> En écrivant "Let oFont1 = oFont2",
| >>> on transfert UNIQUEMENT la propriété par défaut (ici Name),
| >>> alors qu'il aurait fallut le transfert de TOUTES les propriétés
| >>> (de n'importe quel objet)
| >>>
| >>> Il reste toujours cette possibilité:
| >>>
| >>> Obj2.PropertyA = Obj1.PropertyA
| >>> Obj2.PropertyB = Obj1.PropertyB
| >>> '....
| >>>
| >>> mais elle est fastitieuse et elle n'est valable que pour un seul
| >>> type d'object.
| >>>
| >>> D'autres idées ?
| >>>
| >>> Merci
| >>>
| >>> Pascal B.
| >>>
| >>>
| >>> "ng" wrote in message
| >>> news:
| >>>> Salut,
| >>>>
| >>>> En effet Set copie le pointeur, pour avoir une copie il faudra
| >>>> utiliser Let
| >>>>>
| >>>>
| >>>> Private Sub Form_Load()
| >>>> Dim oFont1 As StdFont
| >>>> Dim oFont2 As StdFont
| >>>>
| >>>> Set oFont1 = New StdFont
| >>>> Set oFont2 = New StdFont
| >>>>
| >>>> oFont1.Bold = True
| >>>>
| >>>> Let oFont2 = oFont1
| >>>>
| >>>> oFont2.Bold = False
| >>>>
| >>>> Debug.Print oFont1.Bold, oFont2.Bold
| >>>>
| >>>> End Sub
| >>>>
| >>>> On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.
| >>>>
| >>>> --
| >>>> Nicolas G.
| >>>> FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
| >>>> API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
| >>>> Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
| >>>> MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/
| >>>>
| >>>> Pascal B. wrote:
| >>>>> Bonjour à tous,
| >>>>>
| >>>>> (je sais pas si je vais être clair... bon je me lance)
| >>>>>
| >>>>> J'aimerais pouvoir créer une copie d'un objet.
| >>>>> Ce qui vient en premier à l'esprit, c'est d'écrire:
| >>>>>
| >>>>> Dim Obj as Class1
| >>>>> Dim CopyOfObj as Class1
| >>>>> '.....
| >>>>> Set CopyOfObj = Obj
| >>>>>
| >>>>> En fait, ce que j'ai, c'est 2 variables qui pointent vers le même
| >>>>> objet.
| >>>>> Donc si je modifie CopyOfObj, Obj est modifié aussi.
| >>>>> Or, ce n'est pas ce que je veux !!
| >>>>>
| >>>>> Est-il possible d'écrire une fonction qui crée un *nouvel* objet
| >>>>> ayant le meme contenu que le premier objet ? (donc ayant les
| >>>>> propriétés)
| >>>>>
| >>>>> Exemple: Set CopyOfObj = CreateObjectCopy(Obj)
| >>>>>
| >>>>> Merci
| >>>>>
| >>>>> Pascal B.
| >>
| >> Bonjour,
| >> il n'existe pas en vb6 de système/outils pour la recopie d'objet. La
| >> seul méthode que je puisse vous indiquez est d'implimenter une
| >> méthode propre à l'objet qui renvoie un objet du même type
| >> initialiser avec les même valeurs.
| >>
| >> @+ Quaz
| >>
| >> --
| >> This is an automatic signature of MesNews.
| >> Site : http://mesnews.no-ip.com
|
|
Avatar
Patrick Philippot
Pascal B. wrote:
MAIS il y a un MAIS:
Il faut que l'objet soit PUBLIC et PERSISTABLE.



Bonjour,

En technologie objet, quand on parle de copie, il y a 2 types possibles:
shallow copy (ou "bitwise copy") et deep copy. Une "shallow copy" est
une copie membre à membre des propriétés de l'objet source vers l'objet
cible. Mais le problème c'est qu'une de ces propriétés peut être elle
même une référence à un autre objet (propriété de type object). Une
shallow copy ne va donc pas produire un clone indépendant puisqu'il est
possible que dans chacune des copies, une des propriétés au moins pointe
sur un même objet.

Une "deep copy" tiendrait normalement compte de cela en créant une
nouvelle instance de l'objet pointé par une des propriétés. Mais le
phénomène peut se répéter à l'infini, l'objet pointé par une des
propriétés pouvant lui-même avoir une propriété de type objet. Pour ces
raisons, réaliser une "deep copy" est souvent très compliqué et
difficilement automatisable en VB6 (en VB .Net, avec les mécanismes de
réflexion, on pourrait l'envisager).

La seule méthode sûre en VB6 pour réaliser une shallow copy est une
copie explicite membre à membre. En effet, se contenter de copier un
buffer en mémoire à partir d'une adresse donnée est une opération qui
suppose

1) une connaissance intime de l'organisation de l'objet en mémoire.
2) que le bloc d'instance en mémoire (le bloc mémoire qui contient les
données de l'objet) est continu, ce sur quoi vous n'avez aucune
garantie.

Une telle opération est donc vouée à l'échec dans la plupart des cas.

La méthode que vous décrivez, qui passe par l'intermédiaire d'un
Property Bag ne fonctionne en effet qu'avec les objets COM et ce sera de
toutes façons une "shallow copy".

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
ng
Salut,

Comme je l'ai dit ca ne fonctionne pas :

j'ai essayé plusieurs méthodes mais ca ne fonctionne pas.
Voici mon code des fois que ça en inspire certains :





Sinon la longueur d'un objet est de 4 octets (dword) car la variable
contient en fait seulement l'adresse de l'objet (donc sur un long).

http://minilien.com/?0aJMGl4qIq

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

Pascal B. wrote:
Salut,

J'ai étudié avec grand intérêt ta solution...
MAIS elle ne fonctionne PAS corrrectement !

En effet, oFont2.Italic est à False alors qu'il devrait être à True!

Pourquoi?
En fait, ça coince au niveau du LenB(oObjectSrc) qui retourne 10
ce qui correspond à la longueur de la string contenu dans la propriété
par défaut Name (2 x Len("Arial") = 10)
Donc LenB ne retourne pas la longueur d'un objet !!!

D'où ma question:
Existe-il une fonction qui retourne la longueur d'un Objet ??

Pascal B.


"ng" wrote in message
news:%23chCU$
Salut,

D'après ce que j'ai lu, le problème viendrait de COM, on ne pourrait
donc pas faire ca (sauf si on copie les property une à une) avec ces
objets, j'ai essayé plusieurs méthodes mais ca ne fonctionne pas.
Voici mon code des fois que ça en inspire certains :

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(pDst As Long, pSrc As Long, ByVal ByteLen As Long)

Public Sub CloneObject(oObjectSrc As Object, oObjectDest As Object)
Call CopyMemory(ObjPtr(oObjectDest), ObjPtr(oObjectSrc),
LenB(oObjectSrc))
End Sub

Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont

oFont1.Bold = True
oFont1.Italic = True

Set oFont2 = New StdFont
Call CloneObject(oFont1, oFont2)

oFont2.Bold = False


Debug.Print "Nom", "oFont1", "oFont2"
Debug.Print "Pointeurs", ObjPtr(oFont1), ObjPtr(oFont2)
Debug.Print "Bold", oFont1.Bold, oFont2.Bold
Debug.Print "Italic", oFont1.Italic, oFont2.Italic


Set oFont1 = Nothing
Set oFont2 = Nothing
End Sub


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

YannX wrote:
Bonjour,

Novice en "Object" sous VB6, n'est-il pas possible de surcharger
l'opérateur >>> ou l'opérateur LET ?
décidement, C++ est bien mieux foutu !

Autre idée : definir la classe en VC++ (avec l'opérateur Ad'hoc)
et l'utiliser en VB : des exemples ?

Et comment teste-t-on que l'objet est Non initialisé ?
Exemple:
SUB toto( , optional oBJ as MSHFlexGrid)
if <comment ? oBJ = Nothing ?

Y@+


"Quasimodo" a écrit dans le message de
news:
Pascal B. brought next idea :
Salut,

Hélas, non, ce n'est pas bon [je suis déçu :-( ]
.
En écrivant "Let oFont1 = oFont2",
on transfert UNIQUEMENT la propriété par défaut (ici Name),
alors qu'il aurait fallut le transfert de TOUTES les propriétés
(de n'importe quel objet)

Il reste toujours cette possibilité:

Obj2.PropertyA = Obj1.PropertyA
Obj2.PropertyB = Obj1.PropertyB
'....

mais elle est fastitieuse et elle n'est valable que pour un seul
type d'object.

D'autres idées ?

Merci

Pascal B.


"ng" wrote in message
news:
Salut,

En effet Set copie le pointeur, pour avoir une copie il faudra
utiliser Let




Private Sub Form_Load()
Dim oFont1 As StdFont
Dim oFont2 As StdFont

Set oFont1 = New StdFont
Set oFont2 = New StdFont

oFont1.Bold = True

Let oFont2 = oFont1

oFont2.Bold = False

Debug.Print oFont1.Bold, oFont2.Bold

End Sub

On obtient donc Vrai Faux alors qu'avec Set on aurait Faux, Faux.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://faq.vb.free.fr
API Guide : http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.allapi.net
Google Groups : http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://groups.google.fr/
MZ-Tools : http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/" target="_blank" class="text-blue hover:opacity-90 " style="word-break: break-all;" rel="noopener nofollow">http://www.mztools.com/

Pascal B. wrote:
Bonjour à tous,

(je sais pas si je vais être clair... bon je me lance)

J'aimerais pouvoir créer une copie d'un objet.
Ce qui vient en premier à l'esprit, c'est d'écrire:

Dim Obj as Class1
Dim CopyOfObj as Class1
'.....
Set CopyOfObj = Obj

En fait, ce que j'ai, c'est 2 variables qui pointent vers le
même objet.
Donc si je modifie CopyOfObj, Obj est modifié aussi.
Or, ce n'est pas ce que je veux !!

Est-il possible d'écrire une fonction qui crée un *nouvel* objet
ayant le meme contenu que le premier objet ? (donc ayant les
propriétés)

Exemple: Set CopyOfObj = CreateObjectCopy(Obj)

Merci

Pascal B.







Bonjour,
il n'existe pas en vb6 de système/outils pour la recopie d'objet.
La seul méthode que je puisse vous indiquez est d'implimenter une
méthode propre à l'objet qui renvoie un objet du même type
initialiser avec les même valeurs.

@+ Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com








1 2