Página 1 de 1

Peque

Publicado: Jue Ago 31, 2006 12:11 pm
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

Peque

Publicado: Jue Ago 31, 2006 12:19 pm
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
>
>

Peque

Publicado: Jue Ago 31, 2006 12:33 pm
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

Peque

Publicado: Jue Ago 31, 2006 4:04 pm
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
>

Peque

Publicado: Jue Ago 31, 2006 4:28 pm
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
>>
>
>

Peque

Publicado: Jue Ago 31, 2006 4:53 pm
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)Â

Peque

Publicado: Jue Ago 31, 2006 4:58 pm
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

Peque

Publicado: Jue Ago 31, 2006 6:12 pm
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
>
>
>

Peque

Publicado: Jue Ago 31, 2006 7:56 pm
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
>>>
>>
>>
>
>