Archivi (sola lettura) > Programmazione (Gambas 2)

Creare un clone di un oggetto

(1/2) > >>

g.grandi:

Salve a tutti,
ho una domanda da sottoporvi. Supponiamo di avere una Form che contiene un Frame al cui interno vi sono due Button. E' possibile creare un clone della Frame contenente i due Button ed attaccarla alla Form in modo che il risultato finale sia una Form che contiene due Frame identiche? Ovviamente copiarla, non ridisegnarla passo passo da codice.

Grazie anticipatamente

Giovanni Grandi

vuott:

--- Citazione da: g.grandi - 27 Maggio 2016, 18:26:36 --- Ovviamente copiarla, non ridisegnarla passo passo da codice.

--- Termina citazione ---
.....avrai comunque bisogno di utilizzare del codice per ottenere il clone: il problema - a mio avviso - è che deve essere creato un nuovo oggetto.

vuott:
.........in vero puoi ottenere, sì, un "clone", ma dei puri dati contenuti dalle Strutture che i file header sorgente i Gambas prevedono per la creazione di un oggetto, ed in particolare - in questo caso - di un Frame:

Mi spiego con un semplice esempio (è necessario porre sul Form un Frame ed una TextArea):

--- Codice: ---
Public Sub Button1_Click()

  Dim d, i As Integer
  Dim clone As Pointer
  Dim st As Stream

'  Assegna alla variabile "b" la dimensione della Struttura principale del "Frame" da clonare: '
    d = Object.SizeOf(Frame1)
 
' Alloca un'area di memoria pari a quella occupata dalla Struttura principale del "Frame" da clonare: '
    clone = Alloc(d)

' Crea una variabile di tipo "Stream", per scrivere dei dati del "Frame" da clonare
' nell'area di memoria puntata dal Puntatore "clone": '
    st = Memory clone For Write
   
' Scrive mediante i "Memory Stream" nell'area di memoria puntata dal Puntatore "clone"
' i dati del "Frame" da clonare (leggendoli dalla sua Struttura principale):'
    For i = 0 To d - 1
      Write #st, Byte@(Object.Address(Frame1) + i) As Byte
    Next
    st.Close

' Mostra semplicemente i dati presenti ora nell'area di memoria puntata dal Puntatore "clone",
' i quali sono perfettamente corrispondenti ai dati del "Frame" clonato: '
    For i = 0 To d - 1
      TextArea1.Text &= i & Space(6) & Hex(Byte@(clone + i), 2) & Chr(10)
    Next
    TextArea1.text &= "L'oggetto clonato in area di memoria è un:  " & String@(Pointer@(Pointer@(clone) + 24))
   
' Distrugge l'oggetto "Frame1"... '
    Frame1.Delete

' ...ma.... l'area di memoria puntata dal Puntatore "clone" continua ad esistere ed ovviamente a contenere
' una copia precisa dei dati della Struttura principale del "Frame" originario clonato: '
   TextArea1.text &= Chr(10) & "Indirizzo di memoria del Puntatore 'clone':  " & CStr(clone)

End
--- Termina codice ---



g.grandi:

Grazie mille per la risposta, mi hai insegnato cose che non conoscevo e che andrò a sperimentare.
Il succo della domanda era capire se esisteva un modo semplice per copiare un'oggetto, ma vedo che non è possibile se non con artifici.

Ciao,
Giovanni Grandi

Top Fuel:
Ma l'ereditarietà non mette nell'oggetto figlio le stesse caratteristiche dell'oggetto padre?

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa