2009-02-19 7 views
8

Je souhaite cloner un objet Canevas, qui contient une surface Degrafa avec plusieurs formes de géométrie.Comment cloner un objet dans Flex?

J'ai essayé l'approche naïve:

return ObjectUtil.copy(graph_area) as Canvas; 

qui a donné lieu à des erreurs:

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] ... 

Répondre

9

Qu'est-ce que vous voulez que l'on appelle une copie en profondeur, générer une nouvelle instance avec les mêmes informations de l'original.

La seule façon que je sais comment le faire utilise ByteArray comme suit:

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

AS3 est vraiment manque Object.clone() ...

+2

si vous regardez la source de ObjectUtil.copy(), il fait exactement la même chose. –

+0

Ouais, il utilise AMF pour sérialiser et désérialiser l'objet. – LiraNuna

+0

J'ai eu une erreur sur ce code ... Erreur: Erreur # 2030: Fin de fichier a été rencontrée. \t à flash.utils :: ByteArray/readObject() – Devendra

0

Je ne pense pas ObjectUtil.copy travaillera pour cloner une toile. Selon le document flex:

Copie Cette méthode est conçue pour la copie d'objets de données, tels que des éléments d'une collection. Il n'est pas destiné à copier un objet UIComponent, tel qu'un contrôle TextInput. Si vous souhaitez créer des copies d'objets UIComponent spécifiques, vous pouvez créer une sous-classe du composant et implémenter une méthode clone() ou une autre méthode pour effectuer la copie.

1

Je me suis trouvé essayer quelque chose de plus comme cela, hélas, il semble ne pas encore de copier un TextArea (aka UI Object) ...

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

cela fonctionnera-t-il pour UIComponent ou displayObject? – Devendra

1

j'ai eu le même problème (pour une interface NamedEntity i créé), a cherché la réponse ici, mais l'a seulement fait travailler en faisant un appel à la méthode registerClassAlias ​​(que j'ai pris de http://richapps.de/?p=34). Juste comme ça:

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

ObjectUtil

La méthode statique ObjectUtil.copy() est "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

comment copier uiobject? – Devendra

Questions connexes