In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Peque

Foro de Xailer profesional en español
Responder
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Peque

Mensaje por jose.luis »

Hola,
Tengo una clase como sigue:
//------------------------------------------> Inicio código
CLASS miClase FROM tComponent
COMPONENT oMemDataSet
METHOD New() CONSTRUCTOR
METHOD CopiaMem() INLINE ::oMemDataSet
METHOD End()
ENDCLASS
METHOD NEW( oParent ) CLASS tMiClase
WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
:open( {{1,2,3},{3,4,5}, {"a","b","c"} )
END
Super:New( oParent )
RETURN Self
METHOD End() CLASS tMiClase
TRY
::oMemDataSet:End()
END
RETURN Super:End()
//------------------------------------------> Fin código
Y luego en mi aplicación hago esto:
LOCAL oCl
LOCAL oMem
oCl := tMiClase():New( Self ) // Self -> formulario
oMem := oCl:CopiaMem() //--> tiene tres elementos
MsgInfo(oMem:RecCount() ) // --> 3 elementos
oCl:End()
MsgInfo(oMem:RecCount() ) // --> 0 elementos
¿¿ La pregunta es... ¿como podemos hacer una copia del objeto tMemDataSet
sin que, al destruirse el objeto copiado, se eliminen tambien los elementos
tambien del nuevo objeto ??
Saludos y gracias!
José Luis Capel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9457
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Peque

Mensaje por ignacio »

José Luis,
No hagas depender el MemDataSet del formulario que destruyes. Cambia esto:
> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
Por esto:
> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
Espero que funcione.
Saludos,
"José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
news:44f6b5c1$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Hola,
>
>
> Tengo una clase como sigue:
>
> //------------------------------------------> Inicio código
> CLASS miClase FROM tComponent
>
> COMPONENT oMemDataSet
>
> METHOD New() CONSTRUCTOR
> METHOD CopiaMem() INLINE ::oMemDataSet
> METHOD End()
>
> ENDCLASS
>
> METHOD NEW( oParent ) CLASS tMiClase
> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
> :open( {{1,2,3},{3,4,5}, {"a","b","c"} )
> END
> Super:New( oParent )
> RETURN Self
>
> METHOD End() CLASS tMiClase
> TRY
> ::oMemDataSet:End()
> END
> RETURN Super:End()
> //------------------------------------------> Fin código
>
> Y luego en mi aplicación hago esto:
>
> LOCAL oCl
> LOCAL oMem
> oCl := tMiClase():New( Self ) // Self -> formulario
> oMem := oCl:CopiaMem() //--> tiene tres elementos
> MsgInfo(oMem:RecCount() ) // --> 3 elementos
> oCl:End()
> MsgInfo(oMem:RecCount() ) // --> 0 elementos
>
>
> ¿¿ La pregunta es... ¿como podemos hacer una copia del objeto tMemDataSet
> sin que, al destruirse el objeto copiado, se eliminen tambien los
> elementos tambien del nuevo objeto ??
>
> Saludos y gracias!
> José Luis Capel
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Peque

Mensaje por jose.luis »

Ignacio,
>
> No hagas depender el MemDataSet del formulario que destruyes. Cambia esto:
>
>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>
> Por esto:
>
>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
>
> Espero que funcione.
Lo siento... no me funciona. Incluso he desarrollado el método de copiamem
como sigue:
//------------------------------------------> Inicio código
CLASS miClase FROM tComponent
COMPONENT oMemDataSet
METHOD New() CONSTRUCTOR
METHOD CopiaMem()
METHOD End()
ENDCLASS
METHOD NEW( oParent ) CLASS tMiClase
WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
:open( {{1,2,3},{3,4,5}, {"a","b","c"} )
END
Super:New( oParent )
RETURN Self
METHOD End() CLASS tMiClase
TRY
::oMemDataSet:End()
END
RETURN Super:End()
METHOD CopiaMem() CLASS tMiClase
LOCAL a
a := ::oMemDataset
a:aData := aClone(::oMemDataSet:aData)
RETURN a
//------------------------------------------> Fin código
Y luego en mi aplicación hago esto:
LOCAL oCl
LOCAL oMem
oCl := tMiClase():New( Self ) // Self -> formulario
oMem := oCl:CopiaMem() //--> tiene tres elementos
MsgInfo(oMem:RecCount() ) // --> 3 elementos
oCl:End()
MsgInfo(oMem:RecCount() ) // --> 0 elementos
Y tampoco me acaba de ir bien...
Saludos,
José Luis Capel
Rolando
Mensajes: 191
Registrado: Lun May 08, 2006 2:10 pm

Peque

Mensaje por Rolando »

Esta funciona
LOCAL oCl, oMem, o := tMemDataSet():Create()
oCl := tMiClase():New( Self ) // Self -> formulario
oMem := oCl:CopiaMem() //--> tiene tres elementos
MsgInfo(oMem:RecCount() ) // --> 3 elementos
o:Open( aClone(oMem:aData))
oCl:End()
MsgInfo(o:RecCount() ) // --> 3 elementos
Saludos,
Rolando.
"José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
news:44f6baff$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Ignacio,
>
>
>>
>> No hagas depender el MemDataSet del formulario que destruyes. Cambia
>> esto:
>>// TForm2():New( Self ):Show()
>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>>
>> Por esto:
>>
>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
>>
>> Espero que funcione.
>
> Lo siento... no me funciona. Incluso he desarrollado el método de
> copiamem como sigue:
>
> //------------------------------------------> Inicio código
> CLASS miClase FROM tComponent
>
> COMPONENT oMemDataSet
>
> METHOD New() CONSTRUCTOR
> METHOD CopiaMem()
> METHOD End()
>
> ENDCLASS
>
> METHOD NEW( oParent ) CLASS tMiClase
> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
> :open( {{1,2,3},{3,4,5}, {"a","b","c"} )
> END
> Super:New( oParent )
> RETURN Self
>
> METHOD End() CLASS tMiClase
> TRY
> ::oMemDataSet:End()
> END
> RETURN Super:End()
>
> METHOD CopiaMem() CLASS tMiClase
> LOCAL a
> a := ::oMemDataset
> a:aData := aClone(::oMemDataSet:aData)
> RETURN a
> //------------------------------------------> Fin código
>
> Y luego en mi aplicación hago esto:
>
> LOCAL oCl
> LOCAL oMem
> oCl := tMiClase():New( Self ) // Self -> formulario
> oMem := oCl:CopiaMem() //--> tiene tres elementos
> MsgInfo(oMem:RecCount() ) // --> 3 elementos
> oCl:End()
> MsgInfo(oMem:RecCount() ) // --> 0 elementos
>
> Y tampoco me acaba de ir bien...
>
> Saludos,
> José Luis Capel
>
Rolando
Mensajes: 191
Registrado: Lun May 08, 2006 2:10 pm

Peque

Mensaje por Rolando »

Podemos simplificar:
LOCAL oCl, oMem := tMemDataSet():Create()
oCl := tMiClase():New( Self )
oMem:Open( aClone(oCl:CopiaMem():aData ) )
oCl:End()
MsgInfo(oMem:RecCount() )
Saludos,
"Rolando Sarrailh" <rsarrailh@gmail.com> escribió en el mensaje
news:[email=44f6ec77@news.xailer.com...]44f6ec77@news.xailer.com...[/email]
> Esta funciona
>
>
> LOCAL oCl, oMem, o := tMemDataSet():Create()
> oCl := tMiClase():New( Self ) // Self -> formulario
> oMem := oCl:CopiaMem() //--> tiene tres elementos
> MsgInfo(oMem:RecCount() ) // --> 3 elementos
> o:Open( aClone(oMem:aData))
> oCl:End()
> MsgInfo(o:RecCount() ) // --> 3 elementos
>
> Saludos,
> Rolando.
>
>
> "José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
> news:44f6baff$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
>> Ignacio,
>>
>>
>>>
>>> No hagas depender el MemDataSet del formulario que destruyes. Cambia
>>> esto:
>>>// TForm2():New( Self ):Show()
>
>
>>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>>>
>>> Por esto:
>>>
>>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
>>>
>>> Espero que funcione.
>>
>> Lo siento... no me funciona. Incluso he desarrollado el método de
>> copiamem como sigue:
>>
>> //------------------------------------------> Inicio código
>> CLASS miClase FROM tComponent
>>
>> COMPONENT oMemDataSet
>>
>> METHOD New() CONSTRUCTOR
>> METHOD CopiaMem()
>> METHOD End()
>>
>> ENDCLASS
>>
>> METHOD NEW( oParent ) CLASS tMiClase
>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>> :open( {{1,2,3},{3,4,5}, {"a","b","c"} )
>> END
>> Super:New( oParent )
>> RETURN Self
>>
>> METHOD End() CLASS tMiClase
>> TRY
>> ::oMemDataSet:End()
>> END
>> RETURN Super:End()
>>
>> METHOD CopiaMem() CLASS tMiClase
>> LOCAL a
>> a := ::oMemDataset
>> a:aData := aClone(::oMemDataSet:aData)
>> RETURN a
>> //------------------------------------------> Fin código
>>
>> Y luego en mi aplicación hago esto:
>>
>> LOCAL oCl
>> LOCAL oMem
>> oCl := tMiClase():New( Self ) // Self -> formulario
>> oMem := oCl:CopiaMem() //--> tiene tres elementos
>> MsgInfo(oMem:RecCount() ) // --> 3 elementos
>> oCl:End()
>> MsgInfo(oMem:RecCount() ) // --> 0 elementos
>>
>> Y tampoco me acaba de ir bien...
>>
>> Saludos,
>> José Luis Capel
>>
>
>
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9457
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Peque

Mensaje por ignacio »

José Luis,
El problema es que tu mismo estás destruyendo el MemDataset, y aunque tengas
varias variables referenciando al mismo Dataset no sirve de nada. La
solución pasa por utilizar el método Clone().
oNewDataSet := ::oMemDataSet:Clone()
No obstante he comprobado que no funciona correctamente por un pequeño bug
que ya esta corregido. Te incluyo el módulo corregido.
Un saludo,
Nota: Los datos del DataSet clonado APUNTAN a los mismos datos que el
Dataset original.
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
news:44f6baff$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Ignacio,
>
>
>>
>> No hagas depender el MemDataSet del formulario que destruyes. Cambia
>> esto:
>>
>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>>
>> Por esto:
>>
>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
>>
>> Espero que funcione.
>
> Lo siento... no me funciona. Incluso he desarrollado el método de
> copiamem
> como sigue:
>
> //------------------------------------------> Inicio código
> CLASS miClase FROM tComponent
>
> COMPONENT oMemDataSet
>
> METHOD New() CONSTRUCTOR
> METHOD CopiaMem()
> METHOD End()
>
> ENDCLASS
>
> METHOD NEW( oParent ) CLASS tMiClase
> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
> :open( {{1,2,3},{3,4,5}, {"a","b","c"} )
> END
> Super:New( oParent )
> RETURN Self
>
> METHOD End() CLASS tMiClase
> TRY
> ::oMemDataSet:End()
> END
> RETURN Super:End()
>
> METHOD CopiaMem() CLASS tMiClase
> LOCAL a
> a := ::oMemDataset
> a:aData := aClone(::oMemDataSet:aData)
> RETURN a
> //------------------------------------------> Fin código
>
> Y luego en mi aplicación hago esto:
>
> LOCAL oCl
> LOCAL oMem
> oCl := tMiClase():New( Self ) // Self -> formulario
> oMem := oCl:CopiaMem() //--> tiene tres elementos
> MsgInfo(oMem:RecCount() ) // --> 3 elementos
> oCl:End()
> MsgInfo(oMem:RecCount() ) // --> 0 elementos
>
> Y tampoco me acaba de ir bien...
>
> Saludos,
> José Luis Capel
>
>


Attached files MemDataSet.rar (6.5 KB)Â
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Peque

Mensaje por jose.luis »

Ignacio,
>
> El problema es que tu mismo estás destruyendo el MemDataset, y aunque
> tengas varias variables referenciando al mismo Dataset no sirve de nada.
> La solución pasa por utilizar el método Clone().
Si.. Es cierto que destruyo el dataset... Sin embargo pensaba que el aClone
hacia una copia de la matriz...
>
> oNewDataSet := ::oMemDataSet:Clone()
>
> No obstante he comprobado que no funciona correctamente por un pequeño bug
> que ya esta corregido. Te incluyo el módulo corregido.
>
Gracias!! lo pruebo enseguida!
>
> Nota: Los datos del DataSet clonado APUNTAN a los mismos datos que el
> Dataset original.
>
¿Quieres decir que aunque hagal el oNewDataset := ::oMemDataset:Clone() al
destruir ::oMemDataset tambien desaparecerán los elementos de la matriz?
Saludos y gracias por tu tiempo!!
José Luis Capel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9457
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Peque

Mensaje por ignacio »

José Luis,
> Si.. Es cierto que destruyo el dataset... Sin embargo pensaba que el
> aClone hacia una copia de la matriz...
Si, pero no es suficiente.
> ¿Quieres decir que aunque hagal el oNewDataset := ::oMemDataset:Clone() al
> destruir ::oMemDataset tambien desaparecerán los elementos de la matriz?
No, porque al destruir ::oMemDataSet no desaparece realmente la matriz, la
matriz sigue viva mientras haya alguna variable que haga referencia a ella.
En este caso a través de oNewDataSet:aData.
Saludos,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
news:[email=44f6f901@news.xailer.com...]44f6f901@news.xailer.com...[/email]
> Ignacio,
>
>>
>> El problema es que tu mismo estás destruyendo el MemDataset, y aunque
>> tengas varias variables referenciando al mismo Dataset no sirve de nada.
>> La solución pasa por utilizar el método Clone().
>
> Si.. Es cierto que destruyo el dataset... Sin embargo pensaba que el
> aClone hacia una copia de la matriz...
>
>>
>> oNewDataSet := ::oMemDataSet:Clone()
>>
>> No obstante he comprobado que no funciona correctamente por un pequeño
>> bug que ya esta corregido. Te incluyo el módulo corregido.
>>
>
> Gracias!! lo pruebo enseguida!
>
>>
>> Nota: Los datos del DataSet clonado APUNTAN a los mismos datos que el
>> Dataset original.
>>
>
> ¿Quieres decir que aunque hagal el oNewDataset := ::oMemDataset:Clone() al
> destruir ::oMemDataset tambien desaparecerán los elementos de la matriz?
>
> Saludos y gracias por tu tiempo!!
> José Luis Capel
>
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Peque

Mensaje por jose.luis »

Rolando,
Gracias... Al final he hecho algo parecido a lo que me has mostrado.
Saludos,
José Luis Capel
"Rolando Sarrailh" <rsarrailh@gmail.com> escribió en el mensaje
news:44f6f201$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
> Podemos simplificar:
>
> LOCAL oCl, oMem := tMemDataSet():Create()
> oCl := tMiClase():New( Self )
> oMem:Open( aClone(oCl:CopiaMem():aData ) )
> oCl:End()
> MsgInfo(oMem:RecCount() )
>
> Saludos,
>
>
> "Rolando Sarrailh" <rsarrailh@gmail.com> escribió en el mensaje
> news:[email=44f6ec77@news.xailer.com...]44f6ec77@news.xailer.com...[/email]
>> Esta funciona
>>
>>
>> LOCAL oCl, oMem, o := tMemDataSet():Create()
>> oCl := tMiClase():New( Self ) // Self -> formulario
>> oMem := oCl:CopiaMem() //--> tiene tres elementos
>> MsgInfo(oMem:RecCount() ) // --> 3 elementos
>> o:Open( aClone(oMem:aData))
>> oCl:End()
>> MsgInfo(o:RecCount() ) // --> 3 elementos
>>
>> Saludos,
>> Rolando.
>>
>>
>> "José Luis Capel" <jose.luis@iaicom.com> escribió en el mensaje
>> news:44f6baff$[email=1@news.xailer.com...]1@news.xailer.com...[/email]
>>> Ignacio,
>>>
>>>
>>>>
>>>> No hagas depender el MemDataSet del formulario que destruyes. Cambia
>>>> esto:
>>>>// TForm2():New( Self ):Show()
>>
>>
>>>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>>>>
>>>> Por esto:
>>>>
>>>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create()
>>>>
>>>> Espero que funcione.
>>>
>>> Lo siento... no me funciona. Incluso he desarrollado el método de
>>> copiamem como sigue:
>>>
>>> //------------------------------------------> Inicio código
>>> CLASS miClase FROM tComponent
>>>
>>> COMPONENT oMemDataSet
>>>
>>> METHOD New() CONSTRUCTOR
>>> METHOD CopiaMem()
>>> METHOD End()
>>>
>>> ENDCLASS
>>>
>>> METHOD NEW( oParent ) CLASS tMiClase
>>> WITH OBJECT ::oMemDataSet := tMemDataSet():Create( oParent )
>>> :open( {{1,2,3},{3,4,5}, {"a","b","c"} )
>>> END
>>> Super:New( oParent )
>>> RETURN Self
>>>
>>> METHOD End() CLASS tMiClase
>>> TRY
>>> ::oMemDataSet:End()
>>> END
>>> RETURN Super:End()
>>>
>>> METHOD CopiaMem() CLASS tMiClase
>>> LOCAL a
>>> a := ::oMemDataset
>>> a:aData := aClone(::oMemDataSet:aData)
>>> RETURN a
>>> //------------------------------------------> Fin código
>>>
>>> Y luego en mi aplicación hago esto:
>>>
>>> LOCAL oCl
>>> LOCAL oMem
>>> oCl := tMiClase():New( Self ) // Self -> formulario
>>> oMem := oCl:CopiaMem() //--> tiene tres elementos
>>> MsgInfo(oMem:RecCount() ) // --> 3 elementos
>>> oCl:End()
>>> MsgInfo(oMem:RecCount() ) // --> 0 elementos
>>>
>>> Y tampoco me acaba de ir bien...
>>>
>>> Saludos,
>>> José Luis Capel
>>>
>>
>>
>
>
Responder