Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   вопрос по addChild (http://www.flasher.ru/forum/showthread.php?t=75868)

fishbounce 21.02.2006 19:18

вопрос по addChild
 
если:
var s:Sprite = new Sprite();
var u:Box= new Box(); // например Box
то
u.addChild(s);
вызывает ошибку
cannot convert flash.display::Sprite@854e7e6 to mx.core.IUIComponent.
Хотя, по идее, у метода addChild(val: DisplayObject).

Понятно, что Sprite не ипмплементирует mx.core.IUIComponent, а, как видно, контейнер Box этого хочет.

Но как тогда быть, если я хочу "прибить" Sprite instance к Box instance?
(например, нарисовать че-нить в Sprite программно, а потом засунуть в Box).

BlooDHounD 22.02.2006 11:53

Box - должен быть наследован от Sprite

fishbounce 22.02.2006 13:58

в том то и дело, что Box - это mx.containers.Box, который наследуется от Container -> UIComponent -> Sprite.
Но, факт есть, возникает вышеописанная ошибка.

UP!

7thsky™ 22.02.2006 17:12

в классе mx.core.Container метод addChild перегружен - не смотря на то что в документации он принимает DisplayObject, скорее всего addChild (child:IUIComponent) или ошибка возникает внутри переписанного метода, где пытаются привести аргумент к IUIComponent

fishbounce 22.02.2006 17:19

ок, это понятно.
Но как тогда быть?
Т.е. я не могу добавить объект Sprite, MovieClip... (все , что выше UIComponent'ов в цепочке наследования) как child в какой-нибудь UIComponent.
В принципе, вопрос был в этом.
Мне кажется, что такая ситуация "не есть хорошо")

fishbounce 22.02.2006 17:23

такая ситуация наблюдается только с instance'ами наследников mx.core.Container.
C наследиками UIComponent (например, Button) все нормально

7thsky™ 22.02.2006 20:34

Цитата:

Сообщение от tyombria
ок, это понятно.
Но как тогда быть?
Т.е. я не могу добавить объект Sprite, MovieClip... (все , что выше UIComponent'ов в цепочке наследования) как child в какой-нибудь UIComponent.
В принципе, вопрос был в этом.
Мне кажется, что такая ситуация "не есть хорошо")

в принципе это логично, так ты имеешь библиотеку компонентов, нормально что компонент может добавить в себя только компонент

Antares 23.02.2006 00:12

На уровне UIObject это реализовано так:

1. Каждый компонент -- визуальный класс (наследним мувиклипа).
2. Создание включает в себя либо аттач, либо createEmptyMovieClip c Object.registerClass

Поэтому не вижу причин не цеплять простейшие классы. Посмотрю позднее, сейчас некогда.

7thsky™ 23.02.2006 00:45

Цитата:

Сообщение от Antares
На уровне UIObject это реализовано так:

1. Каждый компонент -- визуальный класс (наследним мувиклипа).
2. Создание включает в себя либо аттач, либо createEmptyMovieClip c Object.registerClass

Поэтому не вижу причин не цеплять простейшие классы. Посмотрю позднее, сейчас некогда.


Миша, ты про что это :) этож АС3 :)

Antares 23.02.2006 01:52

А ты думаешь внутри везде все другое?:) У меня вот нет 100% уверенности

fishbounce 23.02.2006 05:27

Цитата:

Сообщение от Antares
На уровне UIObject это реализовано так:

1. Каждый компонент -- визуальный класс (наследним мувиклипа).
2. Создание включает в себя либо аттач, либо createEmptyMovieClip c Object.registerClass

Поэтому не вижу причин не цеплять простейшие классы. Посмотрю позднее, сейчас некогда.

Я тоже не вижу причин) однако, не цепляет контейнер простейшие классы, от которых он наследован:(

Я искал в гугле что-нибудь на эту тему: нашлось 2 ссылки (та же проблема) на форумы - вроде французский и польский что ли... в этих языках я не силен:( и насколько видно (мое предположение:)) из тамошних дискуссий, четкого ответа нет...

Так что вот так...
Косяк какой-то.

7thsky™ 23.02.2006 10:20

посмотрел в дебаггере у функции addChild у mx.core.Container есть локальная переменная uiChild

то есть происходит что-то вроде
Код:

public override function addChild (child:DisplayObject):DisplayObject {
var uiChild:IUIComponent = IUIComponent (child);
if (uiChild == null) {
throw new TypeError ('Error');
} else {
....
}
}

З.Ы. Антарес, твои темные намеки не понятны, а предложение "...Создание включает в себя либо аттач, либо createEmptyMovieClip c Object.registerClass...", вообще пёрл в контексте АС3, уж если АС3 это доделанный АС1, то уж от этих трех методов избавились в первую очередь.

Antares 23.02.2006 15:00

Или обернули их еще в один декоратор :)

7thsky™ 23.02.2006 15:07

Нет не обернули, так как такая конструкция не дает возможности копировать ЗАГРУЖЕННЫЙ МУВ из одного парента в другой (без переиницилизации этого мува), а если есть конструкция которая позволяет это делать то нету надобности в createEmptyMovieClip (), attachMovie (), createTextField (), Object.registerClass ()

fishbounce 23.02.2006 16:49

Цитата:

Сообщение от 7thsky™
посмотрел в дебаггере у функции addChild у mx.core.Container есть локальная переменная uiChild
....

спасибо...
все это, конечно, хорошо.
но вопрос остается: что делать:)?
забить?

7thsky™ 23.02.2006 17:02

наследуй не от Spite, а от UIComponent

BlooDHounD 23.02.2006 20:21

что делать ... что делать .... а чего собсвенно пытаемся добиться? а то как-то отвлеклись от основй темы и перешли непонятно куда.

fishbounce 23.02.2006 21:07

Добиться того, чтобы в контейнер (объект mx.core.Container) можно было "вставить" addChild'ом объект Sprite.
Но, я так понимаю, обсуждать здесь больше нечего...
Придется действительно вместо Sprite использовать более громоздкий UIComponent.

Antares 23.02.2006 21:17

Спросил бы во Флекскодерз -- дали бы ответ сами Адобовцы. Они знают побольше нас.

BlooDHounD 23.02.2006 22:21

Я реально наверно не понимаю. Зачем это делать?

fishbounce 23.02.2006 23:12

наверное, не понимаешь. Я в первом посте, в принципе, пытался объяснить.

Antares 24.02.2006 00:38

Да какая разница, зачем. Просто непонятно, почему не дает. И это уже само по себе интересно.

7thsky™ 24.02.2006 01:54

ну наверно как первая нормальная библиотека компонентов, все что добавляется внутрь компонента, регистрируется в LayoutManager, и чтобы он мог этим чайлдом мог нормально тусовать тут должен реализовывать интерфейс IUIComponent. я же говорил что метод переписан в mx.core.Container, в переписанном методе и происходит попытка привести к IUIComponent.

fishbounce 24.02.2006 14:32

во flexcoders примерно то же самое ответили. В качестве выхода, чел предложил сначала Sprite запихнуть в UIComponent - это работает, а потом UIComponent уже в Container. Таким образом, все нормально.

Diomas 09.05.2007 03:35

сам недавно наткнулся на проблему. Если еще актуально, вот решение:
Код:

var s:Sprite = new Sprite();
var u:Box= new Box();
u.rawChildren.addChild(s);


etc 09.05.2007 14:51

Я думаю, год назад уже разобрались.


Часовой пояс GMT +4, время: 04:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.