Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Динамические кнопки и обработчики (http://www.flasher.ru/forum/showthread.php?t=210268)

Antonpro 17.02.2015 17:59

Динамические кнопки и обработчики
 
Добрый день, по циклу создаю кнопки. Хочу к ним привязать действия.
В итоге кнопки создаются выводятся на экран но события не обрабатываются.
Код AS3:

function newButton(text){
                lectionCount=lectionCount+1;
                var t:TextField = new TextField();
                t.text = text;
 
                item[lectionCount]=new SimpleButton(t); // создаю кнопку
 
                item[lectionCount].x = 300;
                item[lectionCount].y = 100+25*lectionCount;
                item[lectionCount].addEventListener(MouseEvent.CLICK, clickMenu); //привязываю обработчик события
                addChild(item[lectionCount]);
        }
 
//****************************************************
 
        function clickMenu(event:Event):void {  // обработчик
                trace('click');
 
                }


Wolsh 17.02.2015 22:40

Для оформления своего кода надо использовать теги [as3][/as3]

vlbuto 23.02.2015 15:28

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

Antonpro 12.03.2015 17:28

Еще вопрос, кнопки с Вашей помощью создал код такой:
Код AS3:

function newButton(title,file){
                lectionCount=lectionCount+1;
                var t:TextField = new TextField();
                t.text = title;
 
                item[lectionCount]=new SimpleButton(t);
                item[lectionCount].hitTestState = t;
                trace(title,lectionCount);
 
                item[lectionCount].x = 300;
                item[lectionCount].y = 100+25*lectionCount;
                item[lectionCount].name = title;
                item[lectionCount].addEventListener(MouseEvent.CLICK,clickMenu);
                addChild(item[lectionCount]);
        }

Пробую удалить объекты кнопок и обработчики таким образом,
Код AS3:

while(lectionCount > 0)
{
        lectionCount--;
  stage.removeChildAt(item[lectionCount]);}

вылетаю с ошибкой TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at main_fla::MainTimeline/allElements()

ZackMercury 12.03.2015 17:49

Код некрасивый. Последний кусок с ошибкой.
Вы передаёте вместо индекса с которого удалить объект сам объект в removeChildAt.
Я подозреваю, вы хотели написать просто removeChild.
Но так или иначе, один(последний добавленный) элемент массива удалён не будет, сами угадайте, почему.

Добавлено через 2 минуты
И прикол в том, что вы скорее всего случайно удалили сам MainTimeline из DL :D
Поэтому ссылка на stage пропадает, скорее всего, и вылетает эта ошибка.

Добавлено через 8 минут
Секунду, на лицо непонимание различий между stage.addChild и просто addChild.
Объясняю: stage.numChildren == 1 в самом начале.
trace(stage.getChildAt(0)); == object MainTimeline.

На сцене находится главная линия времени.
Когда вы пишете addChild(item), вы неявно используете this.addChild(item), тоесть добавляете item не рядом с MainTimeline, а в дисплей лист самого MainTimeline(который изначально пуст). Удаляя item из stage не удалит объект, который вы добавляли в Main, так как его попросту там нет.

Да, stage.contains(item) выдаст true, потому, что этот метод учитывает вложенности.

Добавлено через 12 минут
P.S. код очень некрасивый.

neonoviiwolf 12.03.2015 22:02

vlbuto плиз, напишите тут или пришлите мне пример кода, как сделать, а то давно про это читал, но без примера не врубаюсь, использую другие подходы

dimarik 12.03.2015 23:37

Попробуйте так, без stage.(removeChildAt)
Код AS3:

while(lectionCount > 0)
{
        lectionCount--;
  removeChildAt(item[lectionCount]);}


Antonpro 13.03.2015 15:50

dimarik, да действительно, такой вариант проходит, и видимо объекты с цены удаляются, судя по логу, но в результате сцена стает черной и ничего на ней невидно. в чем может быть причина?

ZackMercury 13.03.2015 15:52

Antonpro, вы мой ответ читали?

Antonpro 13.03.2015 16:16

ZackMercury, безусловно читал, если я правильно понял я случайно удаляю таймлайн, но это было при удалении
Код AS3:

stage.removeChildAt(item[lectionCount])

. Сейчас использую
Код AS3:

removeChildAt(item[lectionCount])

прохожу по всем созданным объектам без ошибки и видимо таки удаляю их. Но только сцена стает черной. а так все работает. Если я неправ подскажите пожалуйста, что я не так делаю.


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

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