2009-02-19 13 views
8

Chcę sklonować obiekt Canvas, który zawiera powierzchnię Degrafa z kilkoma kształtami geometrii.Jak sklonować obiekt w programie Flex?

Próbowałem naiwne podejście:

return ObjectUtil.copy(graph_area) as Canvas; 

czego efektem błędów:

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

Odpowiedz

9

Co chcesz nazywany jest głęboka kopia, generują nowe wystąpienie z tej samej informacji oryginału.

Jedynym sposobem, wiem, jak to zrobić to przy użyciu ByteArray następująco:

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

AS3 jest naprawdę brakuje Object.clone() ...

+2

jeśli spojrzeć na źródło ObjectUtil.copy(), robi dokładnie to samo. –

+0

Tak, używa AMF do serializacji i dekomplementacji obiektu. – LiraNuna

+0

Mam błąd w tym kodzie ... Błąd: Błąd nr 2030: Napotkano koniec pliku. \t w flash.utils :: ByteArray/readObject() – Devendra

0

Nie sądzę ObjectUtil.copy będzie działać do klonowania płótna. Zgodnie z dokumentem flex:

Kopiowanie Ta metoda służy do kopiowania obiektów danych, takich jak elementy kolekcji. Nie jest przeznaczony do kopiowania obiektu UIComponent, takiego jak kontrolka TextInput. Jeśli chcesz utworzyć kopie określonych obiektów UIComponent, możesz utworzyć podklasę komponentu i zaimplementować metodę clone() lub inną metodę wykonania kopii.

1

znalazłem się stara coś bardziej jak to niestety wciąż nie wydają się skopiować 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

czy będzie działać dla UIComponent lub displayObject? – Devendra

1

mam ten sam problem (dla interfejsu NamedEntity Stworzyłem), szukał odpowiedzi tutaj, ale tylko działał, wykonując połączenie z metodą registerClassAlias ​​(którą wziąłem od http://richapps.de/?p=34). Właśnie tak:

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

ObjectUtil

metoda statyczna ObjectUtil.copy() jest "Object.clone()" AS3 za:

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

Jak mogę skopiować uiobiekt? – Devendra

Powiązane problemy