Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   событие change на созданном кадре (attachMovie) (http://www.flasher.ru/forum/showthread.php?t=154673)

Bolmazov 20.04.2011 22:56

событие change на созданном кадре (attachMovie)
 
Я новичок во Flash, от того могу неверно пользоваться терминологией и т.п. Однако...

Задача:
Есть кнопка "Добавить". Она создаёт Кадр, в кадре есть TextInput. Нужно при создании этого Кадра (при нажатии кнопки "Добавить") повесить слушателя события change (addEventListener).
Проблема:
Слушатель события change хорошо работает на статическом (заранее созданном) кадре, но если вешать слушатель на денамически созданный Кадр (как описано в задаче), он не работает.
Вопрос:
Как повесть слушателя события change на TextInput в динамически созданном кадре?

Для ясности код:

Код AS1/AS2:

//ф-я выполняется по нажатию кнопки "Добавить"
function _add_perelet(){
        //Создаем новый Кадр (в нём есть TextInput new_perelet.from)
        var new_perelet = perelet_group.attachMovie(
                "perelet",
                "perelet"+new_name,
                perelet_group.getNextHighestDepth(),
                {_x:0,_y:h}
        );
        var from_listener:Object = new Object();
        from_listener.change = function(e:Object):Void {
                new_perelet.err_from._visible = false;
        };
        // Добавляем слушатель события change к элементу TextInput, НО этого события не наступает! Почему?
        new_perelet.from.addEventListener('change', from_listener);
}


mooncar 21.04.2011 00:13

1. new_perelet.from. - где слушателя пытаетесь добавить - это верно, не ошибка?

2. Залезаем в хелп по AS2, смотрим, видим, что для TextField есть такие варианты:
Код AS1/AS2:

this.createTextField("my_txt", this.getNextHighestDepth(), 10, 10, 100, 22);
my_txt.border = true;
my_txt.type = "input";
 
//вариант 1
my_txt.onChanged = function(textfield_txt:TextField) {
  trace(textfield_txt._name + " changed");
  trace(this + " changed");
 
};
 
//вариант 2
var txtListener:Object = new Object();
txtListener.onChanged = function(textfield_txt:TextField) {
    trace(textfield_txt._name+ " changed and notified myListener");
};
my_txt.addListener(txtListener);

Я бы выбрал 1-й вариант, без лишнего слушателя. Как-то так:
Код AS1/AS2:

function _add_perelet()
{
        var new_perelet:MovieClip = perelet_group.attachMovie('perelet', 'perelet' + new_name, perelet_group.getNextHighestDepth(), {_x:0,_y:h});
 
        new_perelet.err_from.onChanged = function()
        {
          trace(this + ' changed,  new text:' + this.text);
        };
}

С динамически созданным мувиком (не кадром) все прекрасно будет работать.

Bolmazov 21.04.2011 14:02

1. Нет, это не ошибка. Логика такая: new_perelet.from - это TextInput. Когда он пустой, становится видна рамка (new_perelet.err_from) вокруг него. Как только пользователь начинает вводить текст в new_perelet.from, рамка new_perelet.err_from должна исчезнуть.
2.Вы показываете мне выдержки из хелпа для TextField, а у меня задача повесить слушатель к TextInput. В этом случае ни один из предложенных вариантов, к сожалению, не работает.

mooncar 21.04.2011 14:59

Да, извините, не понял.
Это н-ся компонент TextInput.
Вот так, например, будет работать, с использованием крошечной задержки:
Код AS1/AS2:

_add_perelet();
 
 
function _add_perelet()
{
        var new_perelet:MovieClip = _root.attachMovie('perelet', 'perelet' + new_name, _root.getNextHighestDepth(), {_x:0,_y:h});
 
        var from_listener:Object = new Object();
 
        from_listener.change = function(eventObject:Object)
        {
                trace('Изменен');
        };
 
        setTimeout(addLst, 1, new_perelet.from, from_listener); //задержка в 1mc
}
 
 
function addLst (ti:Object, obj:Object)
{
        ti.addEventListener('change', obj);
}


Bolmazov 21.04.2011 15:22

Примите охапку из благодарности, респекта и уважухи за:
1. мувик
2. компонент
3. и конечно же за setTimeout

Последняя просьба: объясните, почему в данном случае необходима была задержка и дайте, если это возможно, ссылку по теме.

mooncar 21.04.2011 15:28

К сожалению, ссылки не дам, сам установил когда-то опытным путем, что при аттачменте объектов с компонентами внутри, свойства последних, их события и методы не становятся мгновенно доступными с того же главного таймлайна.


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

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