Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Copiare un oggetto

Dovendo implementare un metodo di copia e incolla di alcuni oggetti avevo
pensato di usare un codice simile a questo:
(cOggetto è un'istanza della classe contenente tutti i suoi bravi dati)
dim tmp as clsOggetto
set tmp=cOggetto
tmp.proprietà="Pippo"
Tutto ciò nella speranza di ottenere una copia dell'oggetto cOggetto nella
variabile tmp. Quello che ho ottenuto invece è che veniva modificata anche
cOggetto.proprietà.
Dopo poco ho scoperto che l'istruzione set crea solo un riferimento
all'oggetto. Ho cercato sull'help ma non sono riuscito trovare un modo per
creare una copia dell'oggeto cOggetto in tmp. L'help farnetica qualcosa
approposito della parola chiave New ma ho scoperto che è possibile usarla
solo per creare una nuova istanza di una classe vuota.
In pratica di queste due soluzioni la prima non funziona e la seconda non ha
l'effetto desiderato:
1) dim tmp as clsOggetto
     set tmp=new cOggetto
2) dim tmp as new clsOggetto
    set tmp=cOggetto
Come devo fare per ottenere una copia di un oggetto e non un riferimento?
Cioa, Rick

...

In realtà puoi usare queste due sintassi:
1) dim tmp as clsOggetto
     set tmp=new cOggetto
2) dim tmp as New clsOggetto
Con la condizione che clsOggetto sia una classe creabile.
In pratica non puoi fare copie di oggetti tipo ListBox ecc...
Perchè? Non sono ancora riuscito a capire perchè ListBox non è considerata
una classe a tutti gli effetti.
Dai un'occhio anche al messaggio d'errore che ti copio qui sotto, ti darà
un'idea più ampia di quello che puoi o non puoi copiare.
Ciao.
---------------------------
Utilizzo non valido della parola chiave New
La parola chiave New può essere utilizzata solo con oggetti creabili, ovvero
istanze di unaclasse ooggetti di automazione. Cause e soluzioni dell'errore:
Si è cercato di creare una nuova istanza di un elemento che può avere una
sola istanza. Ad esempio, si è cercato di creare una nuova istanza di
unmodulo specificando Module1 in un'istruzione come la seguente:
Dim MyMod As New Module1
Non è possibile creare una nuova istanza, poiché un modulo può avere una
sola istanza.
Si è cercato di creare un'istanza di un oggetto di automazione, ma l'oggetto
non è creabile. Ad esempio, si è cercato di creare una nuova istanza di una
casella di riepilogo specificando ListBox in un'istruzione come la seguente:
' Sintassi valida per creare la variabile.
Dim MyListBox As ListBox
Dim MyFormInst As Form
' Sintassi non valida per creare un'istanza dell'oggetto.
Set MyFormInst = New Form
Set MyListBox = New ListBox
ListBox e Form sono nomi di classe e non nomi specifici di oggetti. È
possibile utilizzarli per specificare che unavariabile sarà un riferimento a
un determinatotipo di oggetto, come con le istruzioni Dim indicate sopra che
sono valide. Non è invece possibile utilizzarli per creare istanze degli
oggetti stessi in un'istruzione Set. Nell'istruzione Set è necessario
specificare un oggetto specifico anziché il nome di classe generico:
' Sintassi valida per creare una nuova istanza di un
' form o di una casella di riepilogo.
Set MyFormInst = New Form1
Set MyListBox = New List1
Per ulteriori informazioni, selezionare l'elemento desiderato e premere F1.

Non so se sia possibile con qualche API tipo CopyMemory, l'unica alternativa
è qualle di creare una nuova istanza dell'oggetto e poi copiare pari pari
tutte le proprietà.
VB6 permette ad una classe di salvare se stessa in un file attraverso la
PropertyBag e ovviamente di creare un oggetto dallo stesso file. Appare
evidente che se salvi la classe in un file e poi crei n istanze di classi da
tale file hai effettivamente creato n cloni della classe che hai salvato.
La cosa comunque non è immediata, richiede VB6 e la scrittura di un po di
codice, quindi se devi clonare una classe con poche proprietà senz'altro è
più veloce copiare tutte le proprietà
Ciao,
Corrado

non so se era quello che volevi... spero si si', ciao


Usando Set non fai altro che creare un RIFERIMENTO all'oggetto gia'
esistente.
Per creare una copia identi di un oggetto devi fare cosi':
(e' un metodo di cOggetto che ritorna un cOggetto che ne e' la copia)
Public Function Clone() As cOggetto
    Dim NewOggetto As cOggetto
    Set NewOggetto = New cOggetto
    ' Copi tutte le proprieta' una alla volta...
    With NewOggetto
        .Property1 = Me.Property1
        ' etc...
    End With
    Set Clone = NewOggetto
End Function
HTH
--
Roal Zanazzi
z...@iol.it