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

enepx 22.01.2008 17:04

Проблема области видимости
 
Привет, пишу следующий код:
Код:

m_bOk.onPress = Delegate.create(this, onOkPress);
где m_bOk - мувик (кнопка OK), а onOkPress:
Код:

private function onOkPress():Void {
        m_pPortal.init(m_selectedLayout);
        kill();
}

Проблема в том, что в зависимости от того, где находится первый кусок кода (m_bOk.onPress =...) функция onOkPress по-разному видит из нее :( Например, в одном случае не видит m_pPortal.init, в другом - m_selectedLayout.
Может так не "реагируют" на события в АС2? :wacko:

CrazyFlasher 22.01.2008 18:09

а подробнее код можно? так сложно понять

etc 22.01.2008 18:11

Осталось выяснить, на что ссылается this в первой строке.

enepx 22.01.2008 18:22

читайте комменты
 
все внутри одного класса:
Код:

/*** SettingsBox.as
 * @author Eugene Nepomnyaschy
 */
class com.<...>.SettingsBox extends VisibleComponent
{
<...>
        private var m_bOk:Button;
        private var m_bCancel:Button; //Это мой класс, а не встроенный
<...>

        static public function create(pOwner:MovieClip, strName:String, nDepth:Number):SettingsBox {
                pOwner.createEmptyMovieClip(strName, nDepth);
                pOwner[strName].__proto__ = new SettingsBox(pOwner[strName]);
                return pOwner[strName];
        }

        public function SettingsBox(pThis:MovieClip) {
                super(pThis);
                init();
        }
       
        public function linkage(pPortal:Portal):Void {
                m_pPortal = pPortal;
        }
       
        private function init():Void {

<...>
                m_bOk = Button.create(m_mcBoxContainer, "buttonOk", 3);
                m_bOk.setSize(100, 20);
                m_bOk.setText("Ok");
               
                m_bCancel = Button.create(m_mcBoxContainer, "buttonCancel", 4);
                m_bCancel.setSize(100, 20);
                m_bCancel.setText("Cancel");
                m_bCancel.onPress = Delegate.create(this, onCancelPress); //тут же должен для кнопки ОК, но я его убрал в "более поздние" функции, т.к. отсюда он вообще ничего не видит (из того, что надо)

<...>
        }
       
        private function onOkPress():Void {
                trace("onOkPress "+m_selectedLayout); //тут selectedLayout видно, а m_pPortal.init - нет ((
                m_pPortal.init(m_selectedLayout);
                kill();
        }

        private function onCancelPress():Void {
                kill();
        }
       
        public function select(sLayoutType:String):Void {
                var nIndex:Number;
<...>
                deselectAll();
                m_aLayouts[nIndex].select();
                m_selectedLayout = sLayoutType;
                m_bOk.onPress = Delegate.create(this, onOkPress);
        }
}


CrazyFlasher 23.01.2008 15:11

Код:

m_bOk = Button.create(m_mcBoxContainer, "buttonOk", 3);
начнём с того, что не надо обзывать свои классы названиями встроенных классов. Ищите внутри Button проблему. Скорее всего она там

ах да...а вот это строчка есть?
Код:

import mx.utils.Delegate;

wvxvw 23.01.2008 16:00

тут selectedLayout видно, а m_pPortal.init - нет
>>
А с чего бы ее должно быть видно, если вы ее нигде не объявляете? =/
Поддерживаю Кразифлашера -- называть классы именами встроенных классов чревато.

enepx 23.01.2008 17:52

Я делаю свой класс и импортирую его, я же все тестил и это именно мой класс. Импорт делегата я ессно сделал. И я все объявляю, я же прислал кусок кода! Просто видно то одно, то другое. если я помещаю m_bOk = Button.create... в одно место, то видно одно, а в другое - другое.

CrazyFlasher 23.01.2008 18:02

переименнуйте класс...почти уверен, что проблема в этом

enepx 24.01.2008 12:19

аааа
 
Переименовал в MyButton, перенес инициализацию события onPress в init():
Код:

m_bOk = MyButton.create(m_mcBoxContainer, "buttonOk", 3);
m_bOk.setSize(100, 20);
m_bOk.setText("Ok");
m_bOk.onPress = Delegate.create(this, onOkPress);

m_bCancel = MyButton.create(m_mcBoxContainer, "buttonCancel", 4);
m_bCancel.setSize(100, 20);
m_bCancel.setText("Cancel");
m_bCancel.onPress = Delegate.create(this, onCancelPress);

Не помогло :(
Этот код:
Код:

private function onOkPress():Void {
        trace("onOkPress m_selectedLayout = "+m_selectedLayout);
        trace("onOkPress m_pPortal.init = "+m_pPortal.init);
        m_pPortal.init(m_selectedLayout);
        kill();
}

Выдает в output:
Код:

onOkPress m_selectedLayout = 50.50 //это типа ок!
onOkPress m_pPortal.init = undefined

Если перемещаю инициализацию m_bOk.onPress в метод draw() моего класса, то в output:
Код:

onOkPress m_selectedLayout = 33.33.33 //это неверно! значение не изменилось, а оно у меня меняется в методе select(). Т.е. берется значение, которое я ставлю во время инициализации класса, но по правде у меня другое значение!
onOkPress m_pPortal.init = [type Function]

Вообще, почему от места инициализации onPress = Delegate... меняется область видимости? Как так? :umnik2: :(

iNils 24.01.2008 12:27

Так смысл Delegate именно в этом.


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

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