PDA

Просмотр полной версии : Проблема с вложенностью объекта


romantique
13.07.2007, 11:52
У меня есть такой класс:
class MyClass
{
private var Document:XML;

public function MyCal(){}

public function run()
{
this.Document = new XML();
this.Document.onLoad = __onLoadFunction;
this.Document.load("some.xml");
}

private function __onLoadFunction(success)
{
trace(this); traces XML why???
}
}

Как видно приписываю хандлеру объекта XML приватную функцию из MyClass.

В этой __onLoadFunction функции this должно означать экзэмпляр MyClass, разве нет ??? Но trace() говорит что this означает экзэмпляр XML.

Ну да хрен с ним, пусть в __onLoadFunction оно означает Document (экзэмпляр XML class), тогда разве я не могу доступиться до экзэмпляра MyClass с помощью _parent?. trace() говорит что_parent undefined. Кроме того, не смотря на то, что trace(this) печатает сам XML документ, любой метод, к примеру this.load() уже не может быть найден, ничего не понимаю...

Как мне достучаться до экзэмпляра MyClass изнутри __onLoadFunction ?????

silin
13.07.2007, 12:37
все как написано:
onLoad (который у тебя ссылается на __onLoadFunction) вызывается в контексте Document..
_parent будет у Document, только если ты его сам определишь..
обычное решение:
Document.onLoad =mx.utils.Delegate.create(this, __onLoadFunction);

romantique
13.07.2007, 12:50
Получается в контексте работы __onLoadFunction функции слово this означает именно Document??? Но тогда почему я не могу вызвать ничего от this??? К примеру getBytesTotal. А еще что странно вызывается только toString.

trace(this instanceof XML) говорит true.

romantique
13.07.2007, 12:55
**Error** C:\Dev\ExPlain\SequenceLoader.as: Line 32: There is no method with the name 'mx'.
this._Document.onLoad = mx.utils.Delegate.create(this,this.__onLoadFunction);

etc
13.07.2007, 13:23
romantique, синий цвет специально для того, чтобы сломать глаза читающим?

romantique
13.07.2007, 13:30
romantique, синий цвет специально для того, чтобы сломать глаза читающим?
я думал форум белого цвета, забыл :-D

etc
13.07.2007, 13:37
Не представляю, как можно было не заметить, что форум другого цвета.

mx.utils.Delegate должен быть.

romantique
13.07.2007, 13:44
И всё таки к вопросу: что значит this во время работы __onLoadFunction ???

etc
13.07.2007, 13:47
В AS1/AS2 при присвоении метода одного объекта к другому, область видимости меняется на область видимости последнего. Для решения этой проблемы существует класс Delegate, пример использования которого уже написан.

romantique
13.07.2007, 13:54
Встроенного почему то не было, нашёл код в глобе, заюзал! Спасибо огромное, дышется легче:)

etc
13.07.2007, 13:59
Либо вы меня не так поняли, либо я не знаю. this ссылается на XML, у него нет методов класса MyClass.

romantique
13.07.2007, 15:59
Всё верно, this внутри функции __onLoadFunction ссылается на объект типа XML, который является вложенным в объект класса MyClass. Но в том и странность, что если я от этого this возьму какую то функцию кроме toString, скажем getBytesTotal (это функция - метод класса XML), то еще во время компиляции мне говорят, что такой функции нет. То есть флэш говорит, что это вроде бы одновременно и объект XML, но и вызывать методы, свойственные XML не хочет! Я знаком с ООП не по наслышке, за flash честно говоря сел недавно, в частности за ActionScript 2.0. Вот и натолкнулся на эту странность. Ну бог с ним, что когда приписываю нандлеру XML'я функцию другого класса, видимость меняется на XML'ную. Но то что при этом компилятор ругается, что нету таких методов у XML'я, хотя они есть в ActionScript Dictionary.

// внутри __onLoadFunction
trace(this instanceof XML); // true
trace(this.getBytesTotal()); // функция не найдена

какая-то несостыковочка, хоть и getBytesTotal прямяком из XML.

etc
13.07.2007, 16:01
Ответ уже был дан, как решить данную проблему.

romantique
13.07.2007, 16:03
Да решение то найдено, за что спасибо большое и поклон. Но странность для меня осталась...

etc
13.07.2007, 16:04
import mx.utils.Delegate;
class MyClass {
private var document:XML;

public function myCal():Void {
}

public function run():Void {
this.document = new XML();
this.document.onLoad = Delegate.create(this, this.__onLoadFunction);
this.document.load("some.xml");
}

private function __onLoadFunction(success:Boolean):Void {
trace(this);
}
}

А компилятор понятия не имеет о том, в какой области видимости вызывается метод, поэтому и ругается.

this.create
13.07.2007, 16:20
Не представляю, как можно было не заметить, что форум другого цвета. Какого цвета форум определено в профиле пользователя. У меня, например, тоже белый цвет фона, черные буквы.

Да решение то найдено, за что спасибо большое и поклон. Но странность для меня осталась...
Недавно обсуждалось. Метод получит область видимости непосредственно при выполнении, заранее не известно что за объект будет: MovieClip, XML ...

etc
13.07.2007, 16:21
Какого цвета форум определено в профиле пользователя. У меня, например, тоже белый цвет фона, черные буквы.
Ну не белый… Тем не менее, на белом тоже не фонтан.