Просмотр полной версии : Как изменить значение текстового поля (mxml-файл) из класса (as-файл) по событию?
Serg_Mars
28.08.2008, 16:35
Доброго времени суток, друзья.
Только начал разбираться с флэшем, поэтому, пожалуйста отнеситесь с пониманием и не бейте больно )
Помогите разобраться в ситуации.
У меня есть класс, созданный в отдельном файле as. Внутри этого класса создаётся таймер, срабатывание которого я отлавливаю.
Есть также интерфейс, задизайненный в mxml-файле.
Я хочу по таймеру объекта вышеобозначенного класса изменять значение текстового поля на интерфейсе.
Проблема в том, что я не знаю, каким образом из as-файла обратиться к конкретному элементу интерфейса. Я могу передать его в конструктор класса
var QGE:QGEng = new QGEng(log); log - это TextArea
но не могу передать в обработчик события timer.addEventListener(TimerEvent.TIMER, onTimer);
вот если бы можно было в вызов onTimer передать параметры, то было бы супер. Но как я понимаю этого сделать нельзя. Или можно каким-то способом, которого я не знаю.
Помогите разобраться, пожалуйста.
таймер у вас в классе QGEng? тогда в конструкторе запишите ссылку на log в свойство класса, в обработчике onTimer() тогда будет доступ к log.
или лучше таймером дистапчить событие, а которое будет подписан ваш mxml компонент. таким образом их связь не такая неразрывная получится. вдруг по таймеру не только одно поле надо будет изменять, да?
Serg_Mars
28.08.2008, 18:31
а каким образом передавать log по ссылке?
если я присваиваю свойству класса log вот таким образом:
txt:TextArea = log, txt - свойство класса QGEng.
а потом пытаюсь изменить txt.text,
то он ругается Error #1009: Cannot access a property or method of a null object reference.
А как подписать mxml компонент в событие таймера?
а каким образом передавать log по ссылке?
если я присваиваю свойству класса log вот таким образом:
txt:TextArea = log, txt - свойство класса QGEng.
а потом пытаюсь изменить txt.text,
то он ругается Error #1009: Cannot access a property or method of a null object reference.
проверьте, что у вас в txt после присваивания
А как подписать mxml компонент в событие таймера?
да также как и чистом as3. создаёте экземпляр QGEng и подписываетесь на его событие (это событие должен диспатчить QGEng внутри метода QGEng.onTimer() )
CrazyFlasher
28.08.2008, 20:29
не надо ничего передавать...читайте про data binding
[Bindable] а также про singleton
Molecula
29.08.2008, 02:19
Да, можно через Бинд делать:
Основное:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.binding.utils.ChangeWatcher;
import mx.binding.utils.BindingUtils;
private var co:Core;
private var __nameWatcher:ChangeWatcher;
private function init():void{
this.co = new Core();
this.addChild(this.co);
this.__nameWatcher = BindingUtils.bindProperty(ta, "text", this.co, "s");
ta.text = 'Hello Budda!';
}
private function onClick(e:MouseEvent):void{
this.co.pizdun();
}
]]>
</mx:Script>
<mx:TextArea id="ta" x="44" y="56"/>
<mx:Button x="44" y="118" label="Button" click="onClick(event)"/>
</mx:Application>
AS:
package{
import mx.core.UIComponent;
public class Core extends UIComponent{
[Bindable] public var s:String;
public function Core(){
super();
}
public function pizdun():void{
s = 'Hi';
}
}
}
Serg_Mars
29.08.2008, 11:51
спасибо за советы.
заработало при помощи связывания свойств классов.
про singleton начал читать, почти сломал себе мозг и решил оставить на потом :)
Molecula
29.08.2008, 14:30
А синглтон зачем, есть же BindingUtils.
Serg_Mars
29.08.2008, 14:35
CrazyFlasher советовал почитать про него.
Но, насколько я понял, синглон это не про то, что мне надо.
CrazyFlasher
29.08.2008, 15:33
singleton это на будущее...полезная вещь...здесь достаточно ознакомится с data binding
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.