Форум 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=185516)

in4core 14.10.2012 02:33

События остаются после их удаления
 
вопрос снят.

Вопрос другого плана. Если кнопка подписана на 2 события клика, и одно из событий было удалено, то при нажатии все равно срабатывают оба. Как разрешить срабатывать только тому, которое не было удалено?! ( какой нить там preventDefault )

strangedk 14.10.2012 05:24

т.е. после removeEventListener обработчик всё равно продолжает срабатывать?

gagaga 14.10.2012 12:43

stopPropogation()

Krusty 14.10.2012 13:05

Событие нельзя "удалить". Можно удалить слушатель, если он удален правильно-срабатывать не будет
preventDefault-предотвращает действие "по умолчанию", для ввода текста, например, отменяет ввод текста.
stopPropogation() отменяет всплытие.

Что точно вам надо?

in4core 14.10.2012 15:26

Цитата:

т.е. после removeEventListener обработчик всё равно продолжает срабатывать?
Ага, если зарегестрировано 2 события. У мня было сделано так : был класс кнопки, подписанный на клик, ну обычная анимация, - добавляем кнопку в дисплей лист и подписываем ее на другой клик ( тоесть поверх ) - для выполнения какого нибудь действия. Далее - снимаем слушатель изнутри ( внешний оставляем ) - жмем - получаем выполнение и первого и второго )))

Цитата:

Событие нельзя "удалить". Можно удалить слушатель,
Кеп спасибо конечно, но я не первый день в программировании )

Jewelz 14.10.2012 17:49

насколько я понял у тебя обычный баблинг происходит, stopPropogation() в первом листенере пропиши

Frost47rus 14.10.2012 23:12

Цитата:

Сообщение от in4core (Сообщение 1099865)
Ага, если зарегестрировано 2 события. У мня было сделано так : был класс кнопки, подписанный на клик, ну обычная анимация, - добавляем кнопку в дисплей лист и подписываем ее на другой клик ( тоесть поверх ) - для выполнения какого нибудь действия. Далее - снимаем слушатель изнутри ( внешний оставляем ) - жмем - получаем выполнение и первого и второго )))

Кеп спасибо конечно, но я не первый день в программировании )

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

in4core 15.10.2012 04:10

Frost47rus - мне кажется Вы Алеша! - или Вася - неважно.
Цитата:

здравомыслящие люди не будут вешать два слушателя на клик на одну кнопку
)) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх.

Добавлено через 53 секунды
Frost47rus - мне кажется Вы Алеша! - или Вася - неважно.
Цитата:

здравомыслящие люди не будут вешать два слушателя на клик на одну кнопку
)) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

Jewelz - видимо, хотя помоему, я проверял, баблинг выставлен в false. Может не доглядел. Все равно интересно, давай порассуждаем . CLICK , CLICK - c первого сняли. ( тоесть внутренний ) - раз мы его сняли , то причем тут баблинг? - его уже нет. Остался внешний , получается внешний может баблится как наверх так и вниз? - если так, я походу нуб, и учить мат часть мне! Но насколько я помню баблится - вверх.

silin 15.10.2012 10:09

вообще-то если кнопка дважды подписана на событие клика, и один из обработчиков был удален, то при нажатии срабатывает только тот, что остался
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var but:But = new But();
                        but.addEventListener(MouseEvent.CLICK, but_click);
                        addChild(but);
                }
 
                private function but_click(e:MouseEvent):void
                {
                        trace("Main.but_click > e : " + e);
 
                }
 
        }
 
}
import flash.display.Sprite;
import flash.events.MouseEvent;
 
class But extends Sprite
{
        public function But()
        {
                graphics.beginFill(0x008000);
                graphics.drawRect(0, 0, 50, 50);
                this.addEventListener(MouseEvent.CLICK, this_click);
        }
 
        private function this_click(e:MouseEvent):void
        {
                trace("But.this_click > e : " + e);
                // удаляем (и больше этого трейса не видим)
                this.removeEventListener(MouseEvent.CLICK, this_click);
        }
 
}

а что происходит у ТС, из его описания понять как-то затруднительно
пример м.б. ?

Frost47rus 15.10.2012 10:52

Цитата:

Сообщение от in4core (Сообщение 1099924)
Frost47rus - мне кажется Вы Алеша! - или Вася - неважно. )) ты просто красавец. На будущее тебя просвещу, - нормальные люди вешают либо 1 либо 2 события. 1 событие вешается, если кнопка создана программно, или графически , не задействуя функционал . То в одном событии описывается и функционал и анимация(поведение). А есть случай, когда будете разрабатывать игры или хотя бы что то похожее - голова поймет, что для массовых кнопок прописывается ОБЩИЙ функционал сразу, - а функционал запуска - прописывается уже после, - получается 2 события ! Учи мат часть.

какая разница как создана кнопка? =)
листенер на клик у кнопки - один! =)
листенер на лэйауте - это листенер на лэйауте, но не на кнопке.
и внутренний клик эвент в кнопке всего лишь диспетчит какое-либо событие, как правило такое же.
извне - слушатель на одно событие - один.
не надо пудрить людям мозги. этот форум будут читать и новички - а вы им мозги запудриваете.

Добавлено через 42 минуты
Вот вам пример стандартной кнопки. Создаётся такая кнопка в Flash CS ручками послойно из графических ресурсов. Отрисовывается hitArea для каждой, если кнопки разные. Соответственно, имена полей - так же проставляются вручную ( по дефолту - 4 лейбла на 4 кадрах, 1 - для hitArea, 1 - для текстового поля.
Вешаются листенеры на такую кнопку как и на обычный SimpleButton.

Код AS3:

package ru.domain.project.view.gui.buttons {
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
        /**
        * ...
        * @author Frost
        */

        public class MyButton extends EventDispatcher {
                private var hitArea:MovieClip;
                private var layout:MovieClip;
                private var _enabled:Boolean;
 
                public function MyButton(mc:MovieClip) {
                        layout = mc;
                        if (layout.getChildByName('hit') == null) {
                                trace('MYBTN_ERROR: Cant find hit layer in MovieClip: ' + mc.name);
                                return;
                        }                       
                        hitArea = layout.getChildByName('hit') as MovieClip;
                        enabled = true;
                }
 
                private function turnOn():void {
                        hitArea.buttonMode = true;
                        hitArea.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        hitArea.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        hitArea.addEventListener(MouseEvent.ROLL_OUT, onRollOut);                       
                        hitArea.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        hitArea.addEventListener(MouseEvent.CLICK, onClick);                       
                        layout.gotoAndStop('up');
                }
 
                private function turnOff():void {
                        hitArea.buttonMode = false;
                        hitArea.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
                        hitArea.removeEventListener(MouseEvent.ROLL_OVER, onRollOver);
                        hitArea.removeEventListener(MouseEvent.ROLL_OUT, onRollOut);                       
                        hitArea.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
                        hitArea.removeEventListener(MouseEvent.CLICK, onClick);
                        layout.gotoAndStop('disabled');
                }
 
                public function get enabled():Boolean {
                        return _enabled;
                }
 
                public function set enabled(val:Boolean):void {
                        _enabled = val;
                        (_enabled == true) ? turnOn() : turnOff();
                }
 
                public function text(txt:String):void {                       
                        var tf:TextField = layout.getChildByName('tf') as TextField;
                        formatTextField(tf, txt);                       
                }
 
                private function formatTextField(tf:TextField, e:String):void {
                        tf.text = e;
                        tf.selectable = false;
                        //some other format settings
                }
 
                private function onClick(e:MouseEvent):void {
                        dispatchEvent(new MouseEvent(MouseEvent.CLICK));                       
                }
 
                private function onRollOver(e:MouseEvent):void {
                        layout.gotoAndStop('over');
                        dispatchEvent(new MouseEvent(MouseEvent.ROLL_OVER));
                }
 
                private function onRollOut(e:MouseEvent):void {
                        layout.gotoAndStop('up');
                        dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
                }
 
                private function onMouseUp(e:MouseEvent):void {
                        layout.gotoAndStop('up');
                }
 
                private function onMouseDown(e:MouseEvent):void {
                        layout.gotoAndStop('down');
                }               
        }
}


Wolsh 15.10.2012 11:46

Господа, немедленно сбросьте пылкость речей. На форуме запрещено переходить на личности.

Frost47rus, не надо придумывать свои правила подсчета. Событие одно — MouseEvent.CLICK. Оно не бывает "внутренним" или "внешним". Эти определения можно отнести к слушателям, да. Слушателей может быть сколько угодно, даже у "здравомыслящего" разработчика. Вот чего бы мне никогда не пришло в голову, так это диспатчить "как правило такое же" событие из собственного обработчика кнопки. "Как правило" кнопка подписывается на клик по себе исключительно для собственных целей, "как правило" — отображения своей реакции на клик: анимации или другого визуального эффекта. Можно, конечно, завести для этих целей специальный интерактивный объект, и слушать внутри кнопки клик по этому объекту (хитАреа). Но далеко не всегда это целесообразно, поскольку описанной ТС проблемы вообще-то никогда не существовало, и городить лишние механизмы в кнопке никакого смысла нет (если конечно нет нужды в назначении в качестве хитАреа какого-то внешнего объекта). Так что два Слушателя на одно событие Клик — это вполне нормальная ситуация и не надо делать вид, что собственная подписка кнопки "не считается".

Frost47rus 15.10.2012 11:53

я всё-таки исходил из мнения, что кнопка как объект и её hitArea как объект - два разных объекта.
то, что вся кнопка целиком может быть как одна hitArea - и вся подписана на событие внутри себя же - лишь частный случай.
зачастую приходится работать с кнопками, которые художники рисуют в фш. и кнопка сама по себе будет png с прозрачностью.
и если заглянуть в тот же широкоизвестный Interactive PNG - найдём там то же самое - отрисовку hitArea, но попиксельно.

Wolsh, а насчёт диспетча - я не понял, что имеется в виду тут: "так это диспатчить "как правило такое же" событие из собственного обработчика кнопки"?
А какое же тогда? От самой hitArea передавать тот же? Это будет эвент не от кнопки в таком случае, а от её части и доступа к полям нужного event - получено не будет.

Wolsh 15.10.2012 12:19

Непонятно, зачем писать диспатч клика, если он происходит "автоматически", то есть это стандартное поведение InteractiveObject, наследником которого является Ваша кнопка. Проще говоря, она ИТАК продиспатчит клик, зачем это дублировать дополнительно? Чтобы было два диспатча?

Добавлено через 3 минуты
Interactive PNG — да, хороший пример внутренней подписки на все возможные мышиные события с целью их проанализировать и решить, диспатчить клик "наружу" или нет. Но тоже весьма частный случай))

Frost47rus 15.10.2012 13:18

Wolsh, прочтите, пожалуйста, код, который я написал на первой странице темы.
Этот эвент не дублируется. Эвент "внутри" - относится к hitArea кнопки, т.е. event.target - [object MovieClip]. Новый же эвент - он для внешних слушателей и относится к экземпляру [object MyButton].
Вы, видимо, поторопились с выводами.

in4core 15.10.2012 13:47

Frost47rus
Код AS3:

if (layout.getChildByName('hit') == null)
dispatchEvent(new MouseEvent(MouseEvent.CLICK));
(_enabled == true) ? turnOn() : turnOff();

Мне не о чем с Вами говорить далее.

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

Вот код любой кнопки

Код AS3:

package pro.clonez.slots 
{
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.text.TextField;
 
        /**
        * ...
        * @author in4core lab
        */

        public class EvaluteButton extends MovieClip
        {
                public var tf:TextField;
                private var _isEnabled:Boolean = true;
 
                public function EvaluteButton()
                {
                        this.mouseChildren = false;
                        this.buttonMode = true;
                        this.tabChildren = false;
                        this.tabEnabled = false;
 
                        this.addEventListener(MouseEvent.MOUSE_OVER , this.over);
                        this.addEventListener(MouseEvent.MOUSE_OUT , this.out);
                        this.addEventListener(MouseEvent.CLICK , this.release);
                        this.addEventListener(MouseEvent.MOUSE_DOWN , this.down);
                }
 
                public function down(e:MouseEvent):void
                {
                        this.gotoAndStop('down');
                }
 
                public function release(e:MouseEvent):void
                {
                        if (stage)
                        {
                                if (this.hitTestPoint(stage.mouseX , stage.mouseY))
                                {
                                        this.over(e);
                                }
                                else
                                {
                                        this.out(e);
                                }
                        }
 
                }
 
                public function out(e:MouseEvent):void
                {
                        this.gotoAndStop('simple');
                }
 
                public function over(e:MouseEvent):void
                {
                        this.gotoAndStop('over');
                }
 
                public function disable():void
                {
                        this.removeEventListener(MouseEvent.CLICK , this.release);
                        this.removeEventListener(MouseEvent.MOUSE_OVER , this.over);
                        this.removeEventListener(MouseEvent.MOUSE_OUT , this.out);
                        this.removeEventListener(MouseEvent.MOUSE_DOWN , this.down);
                        this.mouseEnabled = false;
                        this.buttonMode = false;
                        this.gotoAndStop("inactive");
                        this._isEnabled = false;
                }
 
                public function enable():void
                {
                        this.addEventListener(MouseEvent.MOUSE_OVER , this.over);
                        this.addEventListener(MouseEvent.MOUSE_OUT , this.out);
                        this.addEventListener(MouseEvent.CLICK , this.release);
                        this.addEventListener(MouseEvent.MOUSE_DOWN , this.down);
                        this.mouseEnabled = true;
                        this.out(null);
                        this.buttonMode = true;
                        this._isEnabled = true;
                }
 
                public function get isEnabled():Boolean
                {
                        return _isEnabled;
                }
 
        }
 
}

Как мы видим при disabled - слушатели снимаются четко.

Имеем 2 кнопки. - и + . При определенных условиях нажатия 1й или второй, одна из них блокируется, либо не блокируется ни одна. Смотрим

Код AS3:

this._hud.mline.addEventListener(MouseEvent.CLICK , minusLine);
this._hud.pline.addEventListener(MouseEvent.CLICK , plusLine);

Код AS3:

private function minusLine(e:MouseEvent):void 
                {
                        this.dispatchEvent(new HUDViewEvent(HUDViewEvent.MINUS_LINE));
                }
 
                private function plusLine(e:MouseEvent):void
                {
                        this.dispatchEvent(new HUDViewEvent(HUDViewEvent.PLUS_LINE));
                }

Когда моделька упдейтится начинаем проверочку

Код AS3:

private function updateCurrentLine(e:HUDModelEvents):void 
                {
                        if (this._hudModel.currentLine === this._hudModel.numLines)
                        {
                                //this._hud.pline.removeEventListener(MouseEvent.CLICK , plusLine);
                                this._hud.pline.disable();
                        }
                        else if (this._hudModel.currentLine === 1)
                        {
                                //this._hud.mline.removeEventListener(MouseEvent.CLICK , minusLine);
                                this._hud.mline.disable();
                        }
                        else
                        {
                                if (!this._hud.pline.isEnabled)
                                {
                                        this._hud.pline.enable();
                                        //this._hud.pline.addEventListener(MouseEvent.CLICK , plusLine);
                                }
                                if (!this._hud.mline.isEnabled)
                                {
                                        this._hud.mline.enable();
                                        //this._hud.mline.addEventListener(MouseEvent.CLICK , minusLine);
                                }
                        }
                }

Выложил полный код, чтобы было видно где может быть косяк.
Видно - что кнопка подписана на 2 клика, первый происходит сразу же, второй(логика) по событию от модельки . Я специально унес в комментарии удаление второго слушателя, так было изначально - и при таком подходе мы получали следующее - over , down , disable (!!! сняли клик) , release , over . При подходе 2 ( убрав комментарии , тоесть снимая и второго слушателя ) - over , down , disable ! - все верно. Где же я косячу?

silin 15.10.2012 14:20

in4core, вот ты пишешь
Цитата:

Если кнопка подписана на 2 события клика, и одно из событий было удалено, то при нажатии все равно срабатывают оба
вобще-то хотелось бы взглянуть на такое, но дебажить твой проект при этом не очень хотелось и достраивать так называемый 'полный код' чтоб можно было запустить тоже не очень..
а вот минималистичный пример проблемы, который можно просто взять и запустить, был бы в тему, да

in4core 15.10.2012 14:34

silin - ну вроде как пример довольно минималистичный. Тут даже достраивать ничего не надо. Класс кнопки есть ( показал ) , а кнопки допустим подпишем на
Код AS3:

private function updateCurrentLine(e:HUDModelEvents):void

- вот и готов пример. Видим код кнокпи и код *внешнего* слушателя

Wolsh 15.10.2012 14:54

Frost47rus, Ваш клипопреобразователь имеет какое-то отношение к данной теме?
in4core, Вам надо выйти из телепатического транса и почувствовать, как мыслят обычные флэш-обыватели.
Хотя бы покажите место, откуда Вы получаете свой изумительный трейс. По какому конкретно событию он происходит. Что Вы делаете с кнопками, отчет. А вот в коде Модели Вам бы самому покопаться — боюсь другим будет лень, даже догадываясь, что причина где-то там..

Добавлено через 2 минуты
От Ваших thisов уже глаза щиплет..

in4core 15.10.2012 15:08

Wolsh - ненавистник зисов? ) А мне кажется это лучший код-стайл.
Соберу пожалуй седня пример для запуска.

Frost47rus 15.10.2012 15:24

Код AS3:

private var _isEnabled:Boolean = true;

приватные переменные обозначаются в конструкторе.

Код AS3:

private var _isEnabled:Boolean = true;
 
и тут же
 
public function get isEnabled():Boolean {
 return _isEnabled;
}

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

Код AS3:

this.tabChildren = false;
this.tabEnabled = false;

поясните, зачем?

Код AS3:

public function release(e:MouseEvent):void {
 if (stage) {
.....

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

Код AS3:

if (this.hitTestPoint(stage.mouseX , stage.mouseY)) 
                                {
                                        this.over(e);
                                }
                                else
                                {
                                        this.out(e);
                                }

это типа, если нажал и увел мышку в другую область и отжал?
это не надо проверять - такое поведение пользователя не приведёт к событию MouseEvent.CLICK - проверьте сами.

Код AS3:

public function enable():void
                {
                        this.addEventListener(MouseEvent.MOUSE_OVER , this.over);
                        this.addEventListener(MouseEvent.MOUSE_OUT , this.out);
                        this.addEventListener(MouseEvent.CLICK , this.release);
                        this.addEventListener(MouseEvent.MOUSE_DOWN , this.down);
                        this.mouseEnabled = true;
                        this.out(null);

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

Код AS3:

private function minusLine(e:MouseEvent):void

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

Код AS3:

if (this._hudModel.currentLine === this._hudModel.numLines)
                        {
                                //this._hud.pline.removeEventListener(MouseEvent.CLICK , plusLine);
                                this._hud.pline.disable();
                        }
                        else if (this._hudModel.currentLine === 1)
                        {
                                //this._hud.mline.removeEventListener(MouseEvent.CLICK , minusLine);
                                this._hud.mline.disable();
                        } else

вам самому понятна логика в этом дереве?

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


Код AS3:

if (layout.getChildByName('hit') == null)
dispatchEvent(new MouseEvent(MouseEvent.CLICK));
(_enabled == true) ? turnOn() : turnOff();

а тут - разберитесь для начала(вам, как я понял, это не по силам), а потом критикуйте ;)

Добавлено через 3 минуты
Цитата:

Сообщение от Wolsh (Сообщение 1099976)
Frost47rus, Ваш клипопреобразователь имеет какое-то отношение к данной теме?

да, непосредственно имеет. мы разбирались в том, что у кнопки нет двух одинаковых слушателей.

Wolsh 15.10.2012 15:49

Цитата:

да, непосредственно имеет. мы разбирались в том, что у кнопки нет двух одинаковых слушателей.
Мы разбирались не с Вашей "кнопкой", у которой, очевидно, не будет заявленной в теме проблемы, поскольку у нее нет собственного слушателя (странно, что мне приходится Вам это объяснять). Ваше убеждение, что именно таким странным образом весь мир и делает кнопки, является заблуждением. Давайте перенесем обсуждение Ваших кнопок на следующий раз и сконцентрируемся на обозначенной проблеме in4core с кнопкой, у которой ЕСТЬ внутренний слушатель клика. Примите, хотя бы гипотетически, что такие кнопки бывают. Вопрос как бы не в том, бывают ли такие кнопки, а в том, как рассылаются события. Спасибо за понимание.

Frost47rus 15.10.2012 15:57

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

in4core 15.10.2012 16:28

Frost47rus - мне просто смешны ваши заявления. Про геттеры и сеттеры я вообще молчу, это просто угар, вам видимо не вдомек, что геттеры без сеттеров бывают. Про приватные переменные которые обозначаются в конструкторе - дикий лол. , *мышиный эвент хэндлер назван совсем как не хэндлер* - да ну нафиг? че серьезно ? - а надо наверное - mouseClickHandler писать ? - давай досвидания.

Frost47rus - никого не хочу обижать или оскорблять. - но я прекращаю разговор с оппонентом в двух случаях , когда он слишком глуп, либо слишком умен. С вами я прекращаю общение.

Frost47rus 15.10.2012 16:41

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

ваш код не полный. начиная от "начинки" самой кнопки, заканчивая кучей не логичных проверок.

ещё раз повторюсь - вам нужно реструктурировать ваш код.
с нормальной структурой таких глупых вопросов не возникло бы, потому что ошибок бы не было.

пс: приватные не статические переменные логично прописывать в конструкторе, т.к. они являются частью любого из экземпляров и не будут доступны без создания хотя бы одного, что подразумевает пробег по конструктору. после компиляции разкомпильте свою свфку и посмотрите где все ваши переменные находятся. посмотрели? верно, в конструкторе.
"а надо наверное - mouseClickHandler писать ? "
не ёрничайте.
достаточно было бы
Код AS3:

onMinusLineClick(e:...

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

gloomyBrain 15.10.2012 17:07

Цитата:

Про геттеры и сеттеры я вообще молчу, это просто угар, вам видимо не вдомек, что геттеры без сеттеров бывают.
Уважаемый in4core, на эту тему лучше действительно Вам помолчать. Ибо бывают.
Что же касается вызова слушателя, который только что был удален - примера никто так и не увидел. Если есть желание продолжить общение - приведите минимальный пример кода.

in4core 15.10.2012 17:16

Цитата:

Уважаемый in4core, на эту тему лучше действительно Вам помолчать. Ибо бывают.
Уважаемый gloomyBrain - а вам стоит внимательнее читать что пишут, прежде чем высказываться. Я как раз и написал - что не то что бывают , а бывают и часто. перечитайте фразу

Добавлено через 2 минуты
Frost47rus
Цитата:

(_enabled == true) ? turnOn() : turnOff();
Как можно вообще лезть в дебаты , если когда написание if(someVar == true) вместо if(someVar) - является нормальным? - за программиста даже считать после такого нельзя.

Frost47rus 15.10.2012 17:40

Цитата:

Сообщение от in4core (Сообщение 1100014)
Как можно вообще лезть в дебаты , если когда написание if(someVar == true) вместо if(someVar) - является нормальным? - за программиста даже считать после такого нельзя.

это разумная привычка. скажем, если вы у obj.someBooleanParam будете проверять именно так, как вы написали, будут происходить нелепые чудеса, когда флеш вам null приравняет к false - и вы не сразу поймёте почему дальше у вас RTE.
и даже исходя из лишнего кода -7 моих лишних символов против десятков лишних строк.. не аргумент в вашу пользу ;)

Krusty 15.10.2012 17:58

В соответствии с рекомендациями, код
Код AS1/AS2:

if(someVar === true)
if(someVar === null)

более правильный, чем
Код AS1/AS2:

if(someVar)
if(!someVar)

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

strangedk 15.10.2012 18:13

Цитата:

Сообщение от in4core (Сообщение 1099999)
*мышиный эвент хэндлер назван совсем как не хэндлер* - да ну нафиг? че серьезно ? - а надо наверное - mouseClickHandler писать ? - давай досвидания.

Грубо и глупо одновременно. Да, мышинные события для наглядности стоит начинать с mouse

AlexLucas 15.10.2012 18:16

Цитата:

Сообщение от in4core (Сообщение 1099826)
вопрос снят.

Вопрос другого плана. Если кнопка подписана на 2 события клика, и одно из событий было удалено, то при нажатии все равно срабатывают оба. Как разрешить срабатывать только тому, которое не было удалено?! ( какой нить там preventDefault )

Код AS3:

public class Main extends Sprite 
        {
                private var btn:Sprite = new Sprite();
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        btn.graphics.beginFill(0xFF0000);
                        btn.graphics.drawCircle(20, 20, 20);
                        addChild(btn);
                        btn.addEventListener(MouseEvent.CLICK, evt1);
                        btn.addEventListener(MouseEvent.CLICK, evt2);
                }
 
                private function evt1(e:MouseEvent) {
                        trace('1');
                }
 
                private function evt2(e:MouseEvent) {
                        trace('2'); btn.removeEventListener(MouseEvent.CLICK, evt2);
                }
        }

Вот минимальный пример, который я воспроизвёл следуя вашему объяснению, при втором клике evt2 не срабатывает. Может вы его опять где-нибудь цепляете?

in4core 15.10.2012 18:32

AlexLucas - только что было написано что у тебя срабатывал, и после викреференс перестал. Что изменилось?

AlexLucas 15.10.2012 18:36

Показалось.

in4core 15.10.2012 19:10

Седня соберу пример. А то толку просто от разговор мало.

in4core 16.10.2012 01:52

Вложений: 1
вот готов минимальный пример. Можно даже потыкать)
Для cs4Вложение 28575
Можно увидеть, что изначально минус выставлен в disable , когда мы переводим его в disable второй раз, отрабатывает еще и второе событие клика

Wolsh 16.10.2012 03:08

Угу. Из-за дизаблинга минуса поменялся порядок подписки и соответственно приоритет.
Установите жесткий приоритет для "внутренней" подписки в enable:
Код AS3:

this.addEventListener(MouseEvent.CLICK , this.release  , false, 10 , true);

Сейчас у Вас "внешний" слушатель получает событие раньше, чем "внутренний". А у плюса наоборот.

in4core 16.10.2012 03:23

Wolsh спасибо, вот и нашли наверное корень зла. Отпишусь по результатам

Добавлено через 7 минут
Проверил работает. Но как сам считаешь , это все же костыль или нормальная практика? Просто никогда не приходилось работать с приоритетами

Wolsh 16.10.2012 04:06

Две подписки на одно событие. Какой-то обработчик должен быть вызван первым, а другой — вторым. Если не задать приоритет явно, первым будет вызван тот, который был подписан раньше. Поскольку ситуация изменения приоритета не всегда очевидна, могут возникать вот такие казусы. Но здесь нет мистики, бага и т.п. Все законно))

Simplifier 16.10.2012 04:12

Зачем тут приоритеты? e.stopImmediatePropagation(); в конец функции test добавь и все.
PS: Заодно и бесполезное условие
Код AS3:

if (j == 0) {
        j = 1;
}

убери. Хотя бы.

Точнее, в ветку if (j == 1) добавляй вызов

in4core 16.10.2012 11:40

Simplifier ))) это не код. это демонстарция работы приоритетов ) я бы такой код не написал)))


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

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