Newsgroup: it.comp.lang.visual-basic
Titolo: Copia fra oggetti

Salve a tutti,
ho la necessità di fare la copia fra due oggetti.
Mi spiego meglio ho un oggetto Myobj1 ed un oggetto Myobj2.
Per copiare  myobj1 in myobj2 uso :
set myobj2 =myobj1.
Il problema è che in questo modo in realtà non effettuo la copia del
contenuto , ma in realtà copio il puntatore all'oggetto, quindi quando
effettuo una modifica sull'oggetto copiato si ripercuote anche su l'altro e
viceversa.
Esiste un metodo per copiare fisicamente i 2 oggetti?
Grazie a tutti.



No. Devi impostare manin manina tutte le proprietà dell'oggetto di
"destinazione", oppure, in alternativa, sfruttare la persistenza
dell'oggetto "originale" per memorizzare in un file binario l'istanza
corrente dell'oggetto, quindi leggere tale file per inizializzare
l'oggetto "di destinazione".
Ciao,
Moreno
#sirri#@#
morenosoft.com#
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

 wrote in message
news:9dm3rtk0ugfu46fuk...@4ax.com...


potresti spiegarmi meglio l'alternativa?
mmm... già, in effetti non si capiva un granché....
Se imposti la persistenza di una classe su "Persistable", puoi
implementare le Read/Write/InitProperties come faresti normalmente.
Poi salvi tutte le proprietà di un oggetto "objClasse" appartenente a
tale classe in questo modo:
dim pb as propertybag
dim temp as variant
pb.writeproperty "MiaClasse", objClasse	
tamp=pb.contents
open "c:\pippo.txt" for binary as #1
	put #1,, temp
close #1
Poi, crei una nuova istanza dell'oggetto e apri tale file importanto il
Contents delle PropertyBag:
dim pb as propertybag
dim temp as variant
dim bytearray() as byte
dim nuovooggetto as ....
open c:1pippo.txt" for binary as #1
	get #1,,temp
close #1
bytearray=temp
pb.contents=bytearray
set nuovooggetto=pb.readproperty("MiaClasse")
Occhio che nel caso in cui la classe esponga delle proprietà oggetto o
delle collection, devi gestire nella read/writeproperties anche i valori
di queste e di tutte le altre proprietà di tali oggetti...
Spero di essere stato un po' più chiaro....


 Spero di essere stato un po' più chiaro....
ma per copiare un oggetto poi potrebbe usare copymemory  ?(per evitare cicli
lunghissimi)
non ho provato ma dovrebbe funzionare visto che è un array di byte
ciao
--
-------
sito: 
www.dadev.it
ultime: Ocx per irc testi freeware
-------

 wrote in message
news:7Cks7.71407$dJ3.5...@news1.tin.it...



Gli oggetti non esportano strutture, solo funzioni.
Non puoi usare la copymemory su una funzione.
Ciaotutti,
*

 non ho provato ma dovrebbe funzionare visto che è un array di byte
ci ho già provato io qualche anno fa ed avevo postato la stessa domanda
in questo ng moooooolto tempo addietro :)
la mia intenzione era quella di trasformare il late binding agli oggetti di
tipo Object allocati con Createobject in early binding.
Private Withevent Winsock1 as Winsock
Private Winsock2 As Object
Winsock2 = Createobject("MSWinsock.Winsock")
' Winsock2 è di tipo object e non accetta eventi
Set Winsock1 = Winsock2
Copymemory objptr(winsock1), objptr(winsock2), len(winsock2)
Copymemory varptr(winsock1), varptr(winsock2), len(winsock2)
nessuna delle tre soluzioni va :(
in particolare le ultime due non vanno perché Winsock1 è nothing ed
il puntatore a nothing non va :(
ho pensato di allocare la memoria con la GlobalAlloc ma non sono
riuscito a cavarci un ragno dal profondo buco.
purtroppo gli oggetti sono puntatori e le copie dei puntatori puntano
sempre alla stessa area dati... ci vorrebbe un classico costruttore di
copia.. più tardi mi spulcio il mio vecchio libro di C++ :ppp
dopo decine di ore perse su MSDN ho deciso di lasciar perdere l'idea :(
non ho ancora provato la soluzione di Moreno e spero che funzioni..
sarebbe grandioso ^_^
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #26 delle Mitiche Brigate Takahashi sezione Sud

 non ho provato ma dovrebbe funzionare visto che č un array di byte
forse non mi sono spiegato ..
mi sono collegato al messaggio di moreno appunto perchč mi riferivo al
propertybag ....
l'array di byte č il propertyb.contents e solo quello :))
gli oggetti,come diceva appunto moreno,non si possono copiare
spero di essermi spiegato


sarebbe grandioso ^_^
Funziona, funziona... ho risposto velocemente proprio perché ieri stavo
giusto implementando una DLL con quella funzionalità: nel mio caso salvo
copia dell'oggetto in un campo OLE di Access, che successivamente verrà
sostituito da un blob in SQL Server...
Solo una precisazione: le collection non possono venir considerate come
proprietà, quindi bisogna invocare n (=collection.count) volte la
propbag.writeproperty per ciascun oggetto appartenente alla collection.


 
In questo caso come funziona?
Vengono salvate anche le variabili interne?
Se no ricadiamo nello stesso problema di prima.
In C++ questo problema si risolve implementando un metodo .Clone
(per la precisione in C++ di solito si fa l'overload dell'operatore =)
scrivendo qualcosa di equivalente a
Public Sub Clone(AltroOggetto As clsProva)
 ...
End Sub
Il problema e' che in questo caso mentre in C++ possiamo accedere
a tutti i dati di AltroOggetto poiche' appartiene alla stessa classe
di questo, in VB viene trattato come un oggetto di una classe qualsiasi
e quindi non possiamo accedere ai suoi dati privati.
Siamo di nuovo al punto di partenza.
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

Se no ricadiamo nello stesso problema di prima.
idem come sopra...
Ciao,
Moreno
#sirri#@#morenosoft#.com


 
Scusa ma non capisco.
Se creo una proprieta' Get UltimaOperazioneScrittura (a proposito,
ma cosi' non si crea un conflitto con il nome della variabile?),
posso sapere il valore della variabile interna, ma non posso assegnarlo.
Non vedo come questo possa risolvere il problema.
A parte il fatto che cosi' sono costretto a rendere publico il valore
di quella variabile, e non e detto che sia possibile.


di quella variabile, e non e detto che sia possibile.
No.
Quando tu modifichi il valore di una qualsiasi proprietą, setti
m_UltimaOperazioneScrittura=True, giusto?
Ora se implementi una property Get/Let UltimaOperazioneScrittura, puoi
memorizzare lo stato del flag, salvando il valore di tale proprietą, che
era poi il problema.
Per non renderla visibile, basta dichiararla Private.
Ciao,
Moreno
#sirri#@#
morenosoft.com#


 Per non renderla visibile, basta dichiararla Private.
Ma così non riesco ad accederci nemmeno io da fuori, che è dove ho
bisogno di fare la copia.


bisogno di fare la copia.
Allora la Get la dichiari Friend (o Public, ora non so "fino a che
livello" vuoi renderla visibile...)
Ciao,
Moreno
#sirri#@#morenosoft#.com


 ---------------------------------------------------------------------------
Bacchettata anche a te (l'ho promesso ad Asterix).
La firma va separata dal corpo del messaggio con "-- ".


La firma va separata dal corpo del messaggio con "-- ".
Ah, non lo sapevo... grazie.
Ciao,
Moreno
--


 Ah, non lo sapevo... grazie.
ci va anche uno spazio dopo i due trattini
in questo modo i filtri snippano le parti inutili (firma e sign
+/- idiote/inutili)
--
Fibia "La mia č una sign inutile" FBI


 
Guarda che neanche nella tua compare lo spazio!



Outlook depress pensa bene di toglierlo, tanto non serve, no?
Morte a Bill Gates,
*