PDA

Просмотр полной версии : comboBox баг


rolling_tmp
07.06.2002, 13:14
new_combo = function (){

_root.createEmptyMovieClip("win",1);
_root.win._x = random (200);
_root.win._y = random (200);

_root.win.attachMovie("FComboBoxSymbol","lis", 1);

}
new_list = function (){

_root.createEmptyMovieClip("win",1);
_root.win._x = random (200);
_root.win._y = random (200);

_root.win.attachMovie("FListBoxSymbol","lis", 1);
}

функция с листом отрабатывает прекрасно
а вот функция с комбо отрабатывает только через раз

примеры здесь
sample swf - http://www.time-line.kz/test/combo_bug.swf
zipped fla - http://www.time-line.kz/test/combo_bug.zip

ктонибудь знает в чем дело?

john
07.06.2002, 15:29
забавно, что так все работает

new_combo = function (){


var a = _root.createEmptyMovieClip("win",1);
a._x = random (200);
a._y = random (200);

trace(a.attachMovie("FComboBoxSymbol","lis", 5));

}

rolling_tmp
07.06.2002, 15:51
да, так работает :)

интересная фичка, но почему?

john
07.06.2002, 16:11
предполагаю это что то с инициализацией класса.
создается ведь на то же место. а компоненты "рисуют" себя только через кадр от создания .... но тогда и мой вариант не должен работать,...
я вообще всегда работаю со ссылками... и я бы написал сразу мой вариант.
короче шаманство.

rolling_tmp
07.06.2002, 16:26
вопрос отсается в силе, так как предложеное решение не помогает в более сложных случаях. пример пока не могу привести, но постараюсь.

Nox Noctis
09.06.2002, 02:39
в действительности все не так, как на самом деле...
(народная мудрость)

а на самом деле до жути просто :)

...сразу перейдем к тому, как будет работать:

new_combo = function () {
delete _root.win.lis.onUnload;
_root.createEmptyMovieClip("win", 1);
_root.win._x = random(200);
_root.win._y = random(200);
_root.win.attachMovie("FComboBoxSymbol", "lis", 1);
};

улавливаете подставу ? :D :D
когда мы переписываем старый клип с комбой новым пустым клипом, то как раз и срабатывает обработчик onUnload...
...теперь берем пустой мув, кидаем на сцену компонент комбобокс, альт+ф3 -> MovieExplorer и вбиваем в строку поиска слово onUnload
что видим :

Scene 1
Symbol Definition(s)
ComboBox
actions for frame 1
#initclip 3
/*
FComboBoxClass
EXTENDS FScrollSelectListClass
This class manages a "pulldown" scrolling list.
*/
function FComboBoxClass() {
............. [skip]
............. [skip]
............. [skip]
this.onUnload = function()
{
this.superHolder.removeMovieClip();
}
............. [skip]
............. [skip]
............. [skip]

как грится - с приездом :)

проверяем то же самое для листа - онАнлоад не определяется, и следовательно все работает !..

выхода два:
– либо удалять онАнлоад перед новым аттачем (как в коде выше)
– либо более удобно:
1. идем в библиотеку->Flash UI Components->ComboBox
2. открываем клип и в верхнем слое "Actions : Class" находим слово "onUnload"
3. убиваем эту функцию
:)

...если б вы только знали, КАК я этот нашел :p ... пятнадцать минут полного извращения :p

rolling_tmp
10.06.2002, 17:52
попробую удалить как советует уважаемый Nox Noctis.

на самом деле круто раскопал!!!!
я тоже до Анлоада дошел, но я попробовал затрейсить тело функции, теперь попробую удалить саму функцию.

ну так зачем макромедиа все это намутили?

rolling_tmp
13.06.2002, 11:14
удаление unload решило все проблемы, combo заработал корректно.

ктонибудь может обюъяснить зачем они ее вставили ?

Nox Noctis
13.06.2002, 18:16
почитай объявление класса FComboBoxClass...
там есть такое:

_global._popUpLevel = (_global._popUpLevel==undefined) ? 20000 : _global._popUpLevel+1;

// Testing for _root's existence?
this.superHolder = _root.createEmptyMovieClip("superHolder" + _popUpLevel, _popUpLevel);

то есть проверяется на какую глубину можно положить суперХолдер, и клип суперХолдер создается в руте... значит чтобы его убить, когда комбобокс исчезнет из таймлайна, нужно отдельное действие, которое и реализуется онАнлоадом.