Форум 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 именно в этом.

enepx 24.01.2008 12:43

Ну а как решать? Если я сделаю ссылку на функцию без Delegate, то эта функция не увидит поля класса!

etc 24.01.2008 12:49

Где находятся m_selectedLayout и m_pPortal?

enepx 24.01.2008 12:58

Цитата:

Сообщение от __etc
Где находятся m_selectedLayout и m_pPortal?

Это поля этого же класса :confused: :
Код:

<...>
class com.<...>.SettingsBox extends VisibleComponent
{
<...>
        private var m_pPortal:Portal;
        private var m_selectedLayout:String;
<...>


etc 24.01.2008 13:06

Значит проблема в m_pPortal.

enepx 24.01.2008 13:11

Когда я кладу инициацию в draw(), то портал m_pPortal виден!

etc 24.01.2008 13:14

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

enepx 24.01.2008 14:01

варнинг
 
Просто поправьте, если я что-то напишу не так:
Когда я пишу строку:
Код:

m_bOk.onPress = Delegate.create(this, onOkPress);
то у меня сразу же анализируется функция onOkPress, и куда-то там себе запоминается, типа кэшится. Пример:
Код:

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

Во время инициации события onPress (первый кусок кода) переменная m_selectedLayout уже имеет значение, а m_pPortal - нет, она у меня линкуется позже (спец. функцией linkage(pPortal)). Но onPress на практике вызывается как раз после этой линковки (т.е. я могу нажать на кнопку Ок после полной инициации). А m_pPortal все равно не видит. Не пойму как выходить из этого положения. Выход есть конечно - переместить место инициализации onPress в ту функцию, которая выполняется после линковки, когда m_pPortal уже есть. Только вот m_selectedLayout все равно остается такой же как во время инициации.
Вообще это верно? :wacko:

wvxvw 24.01.2008 15:43

Ну, как говорит __etc, поставте this перед m_pPortal.
Еще - потрейсить в for-in this в onOkPress - так хоть можно будет понять, на что там this показывает.
Но, опять же, я пока тут не увидел целого куска кода в котором бы наблюдалась описанная проблема =/

enepx 24.01.2008 18:00

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

wvxvw 24.01.2008 20:52

Ну так пути решения:
трейсить this. а вдруг он не там\нет такой переменной в нем.
попытаться воспроизвести в сокращенном виде то, что не получается. Весь проект и не нужно. нужно только то, что не работает, а должно.

enepx 27.01.2008 19:13

Господа, я в шоке, но я до сих пор не решил сию проблему!! Помогите, я могу кинуть сорс, я вообще понять не могу! у меня переменная (поле класса) в некоторых методах видна, а в некоторых - нет. я делаю linkage в самом начале и после этого переменная должна быть везде видна!!! Или нет?

wvxvw 27.01.2008 20:09

Ну, я не знаю, на каком русском языке еще написать... =) Ну, покажите неработающий код. На предыдущих двух страницах его не было. При всем желании так помочь не получится...


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

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