Форум 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)
-   -   Композиция (http://www.flasher.ru/forum/showthread.php?t=92751)

TbIKBA 05.03.2007 19:31

Композиция
 
Сталкиваюсь с такой бедой уже несколько раз, надоело - хочу разобраться!
Есть Класс которий аттачит МС в котором кнопке ( на самом деле мувику) нужно присвоить онРоллОвер и прочие онПресс, чтоб по ним вызывалась функция из этого же класса. вот тут и беда. как дать бедной кнопке понять что нужно функцию вызывать из класса а не искать толко в "себе". Делать класс статичным тоже не очень хороший выход. Как кто реализует такие доступы?

для примера:
Код:

class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                container.btn.onPress = function() {
                        update(); // вот это и не запускается :(
                };
        }
        public function update() {
                trace("UPDATE");
        }
}


iNils 05.03.2007 19:48

Используют класс Delegate

TbIKBA 05.03.2007 20:02

А если не сложно на можешь на моём примере показать? а то чтот я читаю и не вкуриваю совершенно как она работает.. :confused:

iNils 05.03.2007 20:06

Код:

import mx.utils.Delegate
class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                container.btn.onPress = Delegate.create (this, update);
        }
        public function update() {
                trace("UPDATE");
        }
}


Ariel 05.03.2007 22:36

Simplier
 
А что, по-простому уже не модно?
Код:

class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                container.btn.onPress = update;
        }
        private function update() {trace("UPDATE");}
}


iNils 05.03.2007 22:49

Цитата:

Сообщение от Ariel
А что, по-простому уже не модно?
Код:

class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                container.btn.onPress = update;
        }
        private function update() {trace("UPDATE");}
}


Области видимости разные

Ariel 05.03.2007 23:06

Better
 
Были разные. Теперь область видимости одна. Работает. А все потому что присутствовала порочная методика определения метода в методе...

etc 06.03.2007 01:04

Ariel, свой код нужно проверять перед публикацией. Он не рабочий. Трейс сработает, да. А вот trace(this) выведет совсем не то, что ожидалось. Области разные.

sem1313 06.03.2007 01:32

iNils, ты привел пример про область видимости функций, а как быть с областью видимости объектов, заданных в этом же классе?

iNils 06.03.2007 01:36

Если я верно понял вопрос, то я не использую классический Delegate, а использую свой в котором можно передавать аргументы (вообще есть и другие реализации). Если мне нужно, что бы внутри update я мог ссылать на объект который вызвал этот update, то я указываю его в качестве параметра. А писать как предложил Ariel в корне не верно.

sem1313 06.03.2007 01:52

iNils, ты кому отвечал?

Повторю вопрос. На пальцах пример, есть class в котором реализованна функция, в этой функции еще функция, которая нуждается в свойствах переменных определенных в классе... вот до них достучаться нельзя. Или я просто не умею. Delegate тут не поможет, потому как он обращается к функциям, а мне надо к объектам.

Короче, iNils, дай мне свою асю или мыло в личку. Я тебе скину исходник, в котором в Fla все работает, а в классе не хочет. Спасибо

Ariel 06.03.2007 02:28

2 __etc ::

Наезд таки несправедлив. Хотя, скорее всего, непонятка происходит..

1) Код рабочий. О чем в посте и подписано.
2) trace(this) в моем коде отсутствует.
3) Целью публикации моего примера была простая реализация перегрузки события onPress. Для решения этой задачи Делегат не нужен.

etc 06.03.2007 02:39

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

1) Рабочий в пределах трейса;
2) Лишь только по этому работает;
3) Плохой пример, абсолютно. В дальнейшем возникнут основательные проблемы, за которые спасибо не скажут.

Спорить будем?

Ariel 06.03.2007 03:10

best code
 
2 __etc ::

Любой код должен решать поставленную перед ним задачу. Функционал обработчика события onPress определен не был. Да и спорить с Вами, уважаемый, себе дороже.. :) Еще плюсов навешаете или забаните под горячую руку.. Скажем, за неуважение к корифеям.. :away: Вообще, создается впечатление, что за увлекательным занятием наказывания юзер0в Вы проводите довольно значительную часть жизни. Народ вылетает с форума только так!

etc 06.03.2007 03:18

Цитата:

Сообщение от Ariel
2 __etc ::

Любой код должен решать поставленную перед ним задачу. Функционал обработчика события onPress определен не был.

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

з.Ы. Всё остальное твое написанное — флейм, тянущий на +4 и +5, к сведению. Если уж на то пошло, то бан получают либо совсем безбашенные товарищи, либо рекламщики, коих не так уж и много (я-то знаю). Так что, во избежании лишних квадратных скобочек под никами, сие обсуждение закрыто. Причем тут кривой код приведенного «решения» и какая связь между моей деятельностью, вообще непонятно. Если это аргумент «протев», то смахивает на какую-то совершенно левую отмазку от собственной некомпетентности (ну или просто ляпа, кои возможны у любого человека).

iNils 06.03.2007 03:23

Цитата:

Сообщение от Ariel
Да и спорить с Вами, уважаемый, себе дороже.. :) Еще плюсов навешаете или забаните под горячую руку..

Не стоит путать административный спор с предметным спором.

TbIKBA 06.03.2007 15:57

Да уж.. развели дисскуссию... я всетки вернусь к своим баранам.
Непонимание работы класса Делигейт (не смог я передать ни обьект ни его свойства с помощью этого класса) и поиск по этой теме навели меня на простой пример со ссылкой на обьект. Есть ли какие-то приемущесва/недостатки этого способа по сравнению с использованием класса Делигейт в данном конкретном случае. Или забегая вперёд может что-то возникнет в будущем чего я пока не предусмотрел.

вот пример моего исправленного кода:
Код:

class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                var ref:Object = this; //  простая ссылка на мой класс
                container.btn.onPress = function() {
                        ref.update(this);
                };
        }
        public function update(obj:Object) {
                trace(obj._x);
        }
}


etc 06.03.2007 16:15

Методы в методе объявляют в AS1, но никак не в AS2/AS3. Почему? Потому что появляются паразитные ссылки, которые приведут к тому, что экземпляр класса не получится удалить. Более того, подобная конструкция очень хрупкая, нарушить области видимости и прийти к полному хаосу можно ещё быстрее. Кроме того, сбивает с толку this, который ссылается не на экземпляр класса, а на кнопку. Ну и в конце-концов, такой код типизировать проблематично.
iNils привел рабочий код.

TbIKBA 07.03.2007 13:46

Ок, спасибо за разъяснение. У меня наверно последний вопрос, как мне из функции "update" обратится к вызвовшему её клипу, в данном случае "container.btn" ???
Спасибо.

TbIKBA 07.03.2007 13:52

Правильно ли будет просто сохранить ссылку на етот клип?
Код:

import mx.utils.Delegate;
class MyClass {
        private var container:MovieClip;
        private var btnContainer:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                btnContainer = container.btn;
                btnContainer.onPress = Delegate.create(this, update);
                };
        }
        public function update() {
                trace(btnContainer);
        }
}


etc 07.03.2007 14:11

Зачем??
У вас есть ссылка на клип container, она же доступна и в update (области видимости не изменялись).
Т.е.
Код:

import mx.utils.Delegate;
class MyClass {
        private var container:MovieClip;
        public function MyClass(target:MovieClip) {
                container = target.attachMovie("mc", "mc", target.getNextHighestDepth());
                container.btn.onPress = Delegate.create(this, update);
        }
        public function update() {
                trace(container.btn);
        }
}


TbIKBA 07.03.2007 15:41

Да действительно, сменил шило на мило...
Спасибо.

etc 07.03.2007 15:49

А по-хорошему, обращаться к вложенным клипам вот так вот нехорошо.

TbIKBA 07.03.2007 20:20

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

etc 07.03.2007 20:28

Я бы сделал класс для этого клипа и событийную модель.


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

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