El problema:
Obtener un New objeto que sea igual que el referenciado, tanto en su clase como en todas sus variables y propiedades. O sea, un clon pero en otra posicion de memoria.
Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Objetivo: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
última edición por tercoIDE el Jueves, 23 Abril 2020, 16:42; editado 1 vez
última edición por tercoIDE el Jueves, 23 Abril 2020, 16:42; editado 1 vez
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
tercoIDE:
Mirate esto: http://sologambas.blogspot.com/2014...ar-objetos.html
A ver si te sirve...
Saludos
Julio
Mirate esto: http://sologambas.blogspot.com/2014...ar-objetos.html
A ver si te sirve...
Saludos
Julio
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Yo supongo que no: ...tercoIDE en estos días está de humor para refinamientos "excesivos".
última edición por vuott el Jueves, 23 Abril 2020, 19:57; editado 3 veces
jsbsan escribió:
Yo supongo que no: ...tercoIDE en estos días está de humor para refinamientos "excesivos".
última edición por vuott el Jueves, 23 Abril 2020, 19:57; editado 3 veces
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Me parece que tú quieres obtener, crear un Objeto "c5" pero sin la sintaxis "As New .....", sino obteniéndolo del Objeto pasado a la función, como modelo, como base.
De todos modos yo te respondo con otra pregunta: ¿desde el punto de vista del bajo nivel, qué significa crear un Objeto, una instancia de una Clase?
última edición por vuott el Jueves, 23 Abril 2020, 19:44; editado 1 vez
tercoIDE escribió:
Me parece que tú quieres obtener, crear un Objeto "c5" pero sin la sintaxis "As New .....", sino obteniéndolo del Objeto pasado a la función, como modelo, como base.
De todos modos yo te respondo con otra pregunta: ¿desde el punto de vista del bajo nivel, qué significa crear un Objeto, una instancia de una Clase?
última edición por vuott el Jueves, 23 Abril 2020, 19:44; editado 1 vez
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
No funciono porque la clase tiene un array de otro clase menor
La variable P es un array de clase Punto. La rutina que me pasaste no puede procesar eso.
jsbsan escribió:
No funciono porque la clase tiene un array de otro clase menor
' SAVE from this
Public P As New Punto[] ' acumulador de puntos
Public Level As Float ' from 0 to 1
' For future use in CAD implementation
Public Layer As Integer ' Capa o Layer
Public Group As Integer ' Para tener la posibilidade de juntar cosas en un grupo
Public _Color As Integer ' Para darle un color distinto al del layer
Public LineType As Integer
Public LineWidth As Integer
Public P As New Punto[] ' acumulador de puntos
Public Level As Float ' from 0 to 1
' For future use in CAD implementation
Public Layer As Integer ' Capa o Layer
Public Group As Integer ' Para tener la posibilidade de juntar cosas en un grupo
Public _Color As Integer ' Para darle un color distinto al del layer
Public LineType As Integer
Public LineWidth As Integer
La variable P es un array de clase Punto. La rutina que me pasaste no puede procesar eso.
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Quiero crear una nueva instancia de un objeto del cual no conozco la clase y copiar todo el contenido.
No se como trabaja internamente gambas, pero tal vez un objeto sea una porcion de memoria con datos interpretables por GBX y tal vez, solo tal vez pueda ser copiado como eso, una porcion de memoria y asignada a un puntero de un objeto nuevo...tal vez...habria que meter la cabeza en el agujero como tu avestruz
vuott escribió:
Quiero crear una nueva instancia de un objeto del cual no conozco la clase y copiar todo el contenido.
No se como trabaja internamente gambas, pero tal vez un objeto sea una porcion de memoria con datos interpretables por GBX y tal vez, solo tal vez pueda ser copiado como eso, una porcion de memoria y asignada a un puntero de un objeto nuevo...tal vez...habria que meter la cabeza en el agujero como tu avestruz
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Este codigo funciona para mi caso particular. Pero tengo que meter los puntos a mano.
Estaria bien tener un codigo universal.
tercoIDE escribió:
Este codigo funciona para mi caso particular. Pero tengo que meter los puntos a mano.
Estaria bien tener un codigo universal.
Public Sub Clone(hObjeto As Object) As Object
Dim SinPuntos As Object
SinPuntos = CopyElementObject(hObjeto)
' ahora meto los puntos a mano
Dim p2 As Punto
For Each p2 In hObjeto.p
SinPuntos.P.add(puntos.Add(p2.x, p2.z, p2.Level))
Next
SinPuntos.finish()
Return SinPuntos ' pero ahora tiene :)
End
Public Sub CopyElementObject(hObjeto As Object) As Object
Dim hNewMe As Object = Object.New(Object.Type(hObjeto)) 'se genera un objeto de la mismo tipo que nos pasan
Dim s As String 'variable utilizada para almacenar el valor de hclass.symbols
Dim hclass As Class = Object.Class(hObjeto) 'contiene el valor de la clase del objeto
Dim hChild As Object
Dim nuevoObjeto As Object
Dim caso As Integer 'tipo de dato de la propiedad del objeto
Dim contador, a As Integer 'para usarlo en bucle si son arrays
Dim arrayPosible As Object
'Inicio de la copia de las propiedades....
For Each s In hclass.Symbols
If s = "Chlidren" Then Continue
If Not hclass[s].ReadOnly Then ' esto se cumple cuando llego a P[0]
caso = TypeOf(Object.GetProperty(hObjeto, s))
Select Case caso
Case gb.Object
'la propiedad es un objeto, vuelvo a llamar a la funcion para que me extraiga los valores y no las referencias
nuevoObjeto = CopyElementObject(Object.GetProperty(hObjeto, s))
Object.SetProperty(hNewMe, s, nuevoObjeto)
Try contador = Object.GetProperty(hObjeto, s).count
If Error Then
'no es un array
Else
For a = 0 To contador - 1
nuevoObjeto.add(Object.GetProperty(hObjeto, s)[a])
Next
Endif
Default
'la propiedad no es un objeto, copio el valor
Object.SetProperty(hNewMe, s, Object.GetProperty(hObjeto, s))
End Select
Endif
Next
Return hNewMe
End
Dim SinPuntos As Object
SinPuntos = CopyElementObject(hObjeto)
' ahora meto los puntos a mano
Dim p2 As Punto
For Each p2 In hObjeto.p
SinPuntos.P.add(puntos.Add(p2.x, p2.z, p2.Level))
Next
SinPuntos.finish()
Return SinPuntos ' pero ahora tiene :)
End
Public Sub CopyElementObject(hObjeto As Object) As Object
Dim hNewMe As Object = Object.New(Object.Type(hObjeto)) 'se genera un objeto de la mismo tipo que nos pasan
Dim s As String 'variable utilizada para almacenar el valor de hclass.symbols
Dim hclass As Class = Object.Class(hObjeto) 'contiene el valor de la clase del objeto
Dim hChild As Object
Dim nuevoObjeto As Object
Dim caso As Integer 'tipo de dato de la propiedad del objeto
Dim contador, a As Integer 'para usarlo en bucle si son arrays
Dim arrayPosible As Object
'Inicio de la copia de las propiedades....
For Each s In hclass.Symbols
If s = "Chlidren" Then Continue
If Not hclass[s].ReadOnly Then ' esto se cumple cuando llego a P[0]
caso = TypeOf(Object.GetProperty(hObjeto, s))
Select Case caso
Case gb.Object
'la propiedad es un objeto, vuelvo a llamar a la funcion para que me extraiga los valores y no las referencias
nuevoObjeto = CopyElementObject(Object.GetProperty(hObjeto, s))
Object.SetProperty(hNewMe, s, nuevoObjeto)
Try contador = Object.GetProperty(hObjeto, s).count
If Error Then
'no es un array
Else
For a = 0 To contador - 1
nuevoObjeto.add(Object.GetProperty(hObjeto, s)[a])
Next
Endif
Default
'la propiedad no es un objeto, copio el valor
Object.SetProperty(hNewMe, s, Object.GetProperty(hObjeto, s))
End Select
Endif
Next
Return hNewMe
End
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Los objetos collection se pueden copiar.
Por ejemplo.
Saludos.
tercoIDE escribió:
Los objetos collection se pueden copiar.
Por ejemplo.
Public Sub Form_Open()
Dim c1 As New Collection
Dim c2 As New Collection
Dim v As Variant
c1.Add("texto1", "clave1")
c1.Add("texto2", "clave2")
c2 = c1.Copy() 'Intercambiendo esta linea por la siguiente se ve el efecto 'Copy' y el efecto '='
'c2 = c1
c2.Add("texto3", "clave3")
Print "Collection 1 -----------"
For Each v In c1
Print c1.Key & ":" & v
Next
Print "\n"
Print "Collection 2 -----------"
For Each v In c2
Print c2.Key & ":" & v
Next
End
Dim c1 As New Collection
Dim c2 As New Collection
Dim v As Variant
c1.Add("texto1", "clave1")
c1.Add("texto2", "clave2")
c2 = c1.Copy() 'Intercambiendo esta linea por la siguiente se ve el efecto 'Copy' y el efecto '='
'c2 = c1
c2.Add("texto3", "clave3")
Print "Collection 1 -----------"
For Each v In c1
Print c1.Key & ":" & v
Next
Print "\n"
Print "Collection 2 -----------"
For Each v In c2
Print c2.Key & ":" & v
Next
End
Saludos.
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Esta función podria servir
Saludos.
Saludos.
Objetivo: Re: Clases: Como Clonar Un Object De Una Clase Que No Conocemos?
Exactamente, y esto lo hace el Constructor "New".
New construye las Estructuras y las sub-estructuras necesarias y previstas para dar vida al Objeto deseado, asignando la necesaria memoria.
Yo propondría el siguiente ejemplo:
Modulo principal
Clase secundaria: Class1.class
última edición por vuott el Viernes, 24 Abril 2020, 05:35; editado 3 veces
tercoIDE escribió:
Exactamente, y esto lo hace el Constructor "New".
New construye las Estructuras y las sub-estructuras necesarias y previstas para dar vida al Objeto deseado, asignando la necesaria memoria.
tercoIDE escribió:
Yo propondría el siguiente ejemplo:
Modulo principal
Public Sub Main()
Dim cl As New Class1
Dim clone As Object
Dim b As Byte
clone = ClonMe(cl)
' Verificación:
Print "Objeto \e[1mcl\e[0m = "; cl, "Objeto \e[1mclone\e[0m = "; clone
Print "\nSus recursos:"
For b = 0 To Object.Class(cl).Symbols.Max
Print "Objeto cl = "; Object.Class(cl).Symbols[b]; " "; "Objeto clone = "; Object.Class(clone).Symbols[b]
Next
Print clone.Adde(500)
Print clone.Subtrahe(500)
End
Public Function ClonMe(original As Object) As Object
Dim novum As Object
' Un nuevo objeto igual al original (por supuesto hace falta usar el Metodo "New"):
novum = Object.Class(original).New(Null)
Return novum
End
Dim cl As New Class1
Dim clone As Object
Dim b As Byte
clone = ClonMe(cl)
' Verificación:
Print "Objeto \e[1mcl\e[0m = "; cl, "Objeto \e[1mclone\e[0m = "; clone
Print "\nSus recursos:"
For b = 0 To Object.Class(cl).Symbols.Max
Print "Objeto cl = "; Object.Class(cl).Symbols[b]; " "; "Objeto clone = "; Object.Class(clone).Symbols[b]
Next
Print clone.Adde(500)
Print clone.Subtrahe(500)
End
Public Function ClonMe(original As Object) As Object
Dim novum As Object
' Un nuevo objeto igual al original (por supuesto hace falta usar el Metodo "New"):
novum = Object.Class(original).New(Null)
Return novum
End
Clase secundaria: Class1.class
última edición por vuott el Viernes, 24 Abril 2020, 05:35; editado 3 veces
Página 1 de 2
No puede crear mensajesNo puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario
Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.
Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo
Página generada en:: 0.6224s (PHP: -68% SQL: 168%)
Consultas SQL: 49 - Debug off - GZIP Activado