2009-02-19 10 views
8

Quiero clonar un objeto Canvas, que contiene una superficie Degrafa con varias formas de geometría.Cómo clonar un objeto en Flex?

He probado el enfoque ingenuo:

return ObjectUtil.copy(graph_area) as Canvas; 

que dio lugar a errores:

TypeError: Error #1034: Type Coercion failed: cannot convert [email protected] to com.degrafa.geometry.Geometry. 
TypeError: Error #1034: Type Coercion failed: cannot convert [email protected] to com.degrafa.geometry.Geometry. 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at mx.core::Container/addChildAt()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2196] 
    at mx.core::Container/addChild()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\Container.as:2140] ... 

Respuesta

9

Lo que se quiere que se llama una copia profunda, generar una nueva instancia con la misma información del original.

La única manera que sé cómo hacerlo está utilizando ByteArray de la siguiente manera:

private function clone(source:Object):* 
{ 
    var buffer:ByteArray = new ByteArray(); 
    buffer.writeObject(source); 
    buffer.position = 0; 
    return buffer.readObject(); 
} 

AS3 es muy deficiente Object.clone() ...

+2

si nos fijamos en el fuente de ObjectUtil.copy(), hace exactamente lo mismo. –

+0

Sí, está usando AMF para serializar y deserializar el objeto. – LiraNuna

+0

recibí un error en este código ... Error: Error # 2030: se encontró el final del archivo. \t en flash.utils :: ByteArray/readObject() – Devendra

0

No creo ObjectUtil.copy trabajará para clonar un lienzo. Según el doc de flex:

Copia Este método está diseñado para copiar objetos de datos, como los elementos de una colección. No está destinado a copiar un objeto UIComponent, como un control TextInput. Si desea crear copias de objetos UIComponent específicos, puede crear una subclase del componente e implementar un método clone() u otro método para realizar la copia.

1

me encontré tratando de hacer algo de la misma familia por desgracia todavía no parece copiar un TextArea (también conocido como la interfaz de usuario del objeto) ...

public function duplicateObject(sourceObject:*, targetObject:*):void { 
    var buffer:ByteArray = new ByteArray(); 
    buffer.writeObject(sourceObject); 
    buffer.position = 0; 
    targetObject = buffer.readObject(); 
} 
+0

¿Funcionará para UIComponent o displayObject? – Devendra

1

me dieron el mismo problema (para una interfaz NamedEntity he creado), busqué la respuesta aquí, pero solo funcionó haciendo una llamada al método registerClassAlias ​​(que tomé del http://richapps.de/?p=34). Al igual que:

public static function clone(namedEntity:NamedEntity):NamedEntity { 
registerClassAlias('test',ReflectionUtil.classByObject(namedEntity)); 
var returnObject:NamedEntity = ObjectUtil.copy(namedEntity) as NamedEntity; 
} 
7

ObjectUtil

El método estático ObjectUtil.copy() es "Object.clone()" de AS3:

public static function copy(value:Object):Object 

Copies the specified Object and returns a reference to the copy. The copy is made using a native serialization technique. This means that custom serialization will be respected during the copy.

This method is designed for copying data objects, such as elements of a collection. It is not intended for copying a UIComponent object, such as a TextInput control. If you want to create copies of specific UIComponent objects, you can create a subclass of the component and implement a clone() method, or other method to perform the copy.

+0

¿cómo copio uiobject? – Devendra