PDA

Просмотр полной версии : Проблема области видимости


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
Где находятся 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
Ну, я не знаю, на каком русском языке еще написать... =) Ну, покажите неработающий код. На предыдущих двух страницах его не было. При всем желании так помочь не получится...