2009-02-19 3 views
8

Я хочу клонировать объект Canvas, который содержит поверхность Degrafa с несколькими геометрическими фигурами.Как клонировать объект в Flex?

Я попробовал наивный подход:

return ObjectUtil.copy(graph_area) as Canvas; 

, что привело к ошибкам:

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

ответ

9

То, что вы хотите, называется глубокая копия, генерировать новый экземпляр с той же информацией оригинала.

Единственный способ я знаю, как сделать это с помощью ByteArray следующим образом:

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

AS3 действительно не хватает Object.clone() ...

+2

, если вы посмотрите на источник ObjectUtil.copy(), он делает то же самое. –

+0

Да, он использует AMF для сериализации и де-сериализации объекта. – LiraNuna

+0

У меня ошибка в этом коде ... Ошибка: Ошибка # 2030: была обнаружена копия файла. \t at flash.utils :: ByteArray/readObject() – Devendra

0

Я не думаю, что ObjectUtil.copy будет работать для клонирования холста. В соответствии с документом flex:

Копия Этот метод предназначен для копирования объектов данных, таких как элементы коллекции. Он не предназначен для копирования объекта UIComponent, такого как элемент управления TextInput. Если вы хотите создать копии определенных объектов UIComponent, вы можете создать подкласс компонента и реализовать метод clone() или другой метод для выполнения копии.

1

я обнаружил, что пытается что-то больше, как это, увы это все еще, кажется, не копировать TextArea (так называемый пользовательский интерфейс Object) ...

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

будет ли он работать для UIComponent или displayObject? – Devendra

1

я получил ту же проблему (для NamedEntity интерфейса я создал), искал ответ здесь, но только получил его работу, делая вызов метода registerClassAlias ​​(который я взял с http://richapps.de/?p=34). Просто так:

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

ObjectUtil

статический метод ObjectUtil.copy() является AS3 в "Object.clone()":

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

как скопировать uiobject? – Devendra

Смежные вопросы