Просмотр полной версии : Проблема области видимости
Привет, пишу следующий код:
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
а подробнее код можно? так сложно понять
Осталось выяснить, на что ссылается this в первой строке.
все внутри одного класса:
/*** 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;
тут selectedLayout видно, а m_pPortal.init - нет
>>
А с чего бы ее должно быть видно, если вы ее нигде не объявляете? =/
Поддерживаю Кразифлашера -- называть классы именами встроенных классов чревато.
Я делаю свой класс и импортирую его, я же все тестил и это именно мой класс. Импорт делегата я ессно сделал. И я все объявляю, я же прислал кусок кода! Просто видно то одно, то другое. если я помещаю m_bOk = Button.create... в одно место, то видно одно, а в другое - другое.
CrazyFlasher
23.01.2008, 18:02
переименнуйте класс...почти уверен, что проблема в этом
Переименовал в 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: :(
Так смысл Delegate именно в этом.
Ну а как решать? Если я сделаю ссылку на функцию без Delegate, то эта функция не увидит поля класса!
Где находятся m_selectedLayout и m_pPortal?
Где находятся m_selectedLayout и m_pPortal?
Это поля этого же класса :confused: :
<...>
class com.<...>.SettingsBox extends VisibleComponent
{
<...>
private var m_pPortal:Portal;
private var m_selectedLayout:String;
<...>
Значит проблема в m_pPortal.
Когда я кладу инициацию в draw(), то портал m_pPortal виден!
Тогда дежурные гадалки в отпуске. Весь код не виден, поэтому кофейная гуща не поможет.
Используйте this везде, очень полезно, особенно при таких проблемах.
Просто поправьте, если я что-то напишу не так:
Когда я пишу строку:
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:
Ну, как говорит __etc, поставте this перед m_pPortal.
Еще - потрейсить в for-in this в onOkPress - так хоть можно будет понять, на что там this показывает.
Но, опять же, я пока тут не увидел целого куска кода в котором бы наблюдалась описанная проблема =/
я сразу попробовал с this, ессно это не помогло. как я могу выложить сюда весь этот проект-то? там уже более 20 классов.
Ну так пути решения:
трейсить this. а вдруг он не там\нет такой переменной в нем.
попытаться воспроизвести в сокращенном виде то, что не получается. Весь проект и не нужно. нужно только то, что не работает, а должно.
Господа, я в шоке, но я до сих пор не решил сию проблему!! Помогите, я могу кинуть сорс, я вообще понять не могу! у меня переменная (поле класса) в некоторых методах видна, а в некоторых - нет. я делаю linkage в самом начале и после этого переменная должна быть везде видна!!! Или нет?
Ну, я не знаю, на каком русском языке еще написать... =) Ну, покажите неработающий код. На предыдущих двух страницах его не было. При всем желании так помочь не получится...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.