Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.03.2009, 12:25
Kennysp вне форума Посмотреть профиль Отправить личное сообщение для Kennysp Найти все сообщения от Kennysp
  № 1  
Ответить с цитированием
Kennysp

Регистрация: Mar 2009
Сообщений: 28
По умолчанию Переход на Flex. Трудности со stage

Раньше работал во флеше, где имелся Document class, в котором был объект stage, к которому можно было делать addChild, addEventListener и т.д.

Сейчас решил пересесть на flex. Тут же столкнулся с проблемкой. Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null)

Есть какой нибудь способ в MXML указать главный класс, чтобы внутри него использовать stage, а не uicomponent?

Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.events.*;
 
	public class test2 extends Sprite
	{	
		public function test2():void	{			
			var spr: Sprite = new Sprite();
			spr.graphics.beginFill(0xFF0000);			
			spr.graphics.beginFill(0x00FF00, 100);
			spr.graphics.lineStyle(1, 0x000000, 100);
			spr.graphics.moveTo(200, 200);
			spr.graphics.lineTo(200, 300);
			spr.graphics.lineTo(300, 300);
			spr.graphics.lineTo(300, 200);			
			var mc: MovieClip = new MovieClip;
			mc.addChild(spr);
			stage.addChild(mc);
		}	
	}
}

Старый 23.03.2009, 12:46
fljot вне форума Посмотреть профиль Отправить личное сообщение для fljot Найти все сообщения от fljot
  № 2  
Ответить с цитированием
fljot

блогер
Регистрация: Jul 2007
Сообщений: 940
Записей в блоге: 3
хм у вас какая-то флекс-каша.

вот где здесь логика? связанный ход мысли?
Цитата:
Сообщение от Kennysp Посмотреть сообщение
Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null)
stage есть у всех визуальных компонент, и у application тоже. обычное поведение AS3'шных DisplayObject'ов. значение ненулевое, когда объект добавлен в display list. посмотрите на жизненный цикл флексовых компонент. вы, наверное, обращаетесь к stage слишком рано

Старый 23.03.2009, 13:20
Kennysp вне форума Посмотреть профиль Отправить личное сообщение для Kennysp Найти все сообщения от Kennysp
  № 3  
Ответить с цитированием
Kennysp

Регистрация: Mar 2009
Сообщений: 28
Ммммм...
Тогда такой вопрос: как указать главный класс во flex?
К примеру в CS3 нужно было прописать имя главного класса в поле Document Class и тогда при запуске флешки создавался экземпляр прописанного класса.

Теперь я создаю FLEX проект.
Создаю в нем файл mainClass.as
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
 
	public class test2 extends Sprite
	{		
		public function test2():void	{					
			var spr: Sprite = new Sprite();
			spr.graphics.beginFill(0xFF0000);			
			spr.graphics.beginFill(0x00FF00, 100);
			spr.graphics.lineStyle(1, 0x000000, 100);
			spr.graphics.moveTo(200, 200);
			spr.graphics.lineTo(200, 300);
			spr.graphics.lineTo(300, 300);
			spr.graphics.lineTo(300, 200);			
			var mc: MovieClip = new MovieClip;
			mc.addChild(spr);
			stage.addChild(mc); 
		}	
	}
}
В MXML файле пишу
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">
	
	<mx:Script>
		<![CDATA[					
			
			public function initApp():void{				
				import mainClass;
				var tmp = new mainClass();
			}
			
		]]>
	</mx:Script>
	
</mx:Application>
Строчка
Код AS1/AS2:
stage.addChild(mc);
естественно выдает ошибку
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Т.к. stage === null

Старый 23.03.2009, 13:31
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Дождитесь события ADDED_TO_STAGE.

Старый 23.03.2009, 13:32
2morrowMan вне форума Посмотреть профиль Отправить личное сообщение для 2morrowMan Найти все сообщения от 2morrowMan
  № 5  
Ответить с цитированием
2morrowMan
 
Аватар для 2morrowMan

Регистрация: Aug 2007
Сообщений: 467
А что такой код у вас во Флеше работал ?
__________________
Лучше быть умным и иногда делать глупости, чем глупым и постоянно умничать!

Старый 23.03.2009, 13:41
Kennysp вне форума Посмотреть профиль Отправить личное сообщение для Kennysp Найти все сообщения от Kennysp
  № 6  
Ответить с цитированием
Kennysp

Регистрация: Mar 2009
Сообщений: 28
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.

Добавлено через 9 минут
Переписал manClass.as:
Код AS1/AS2:
package {
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.*;
 
	public class mainClass extends Sprite	{		
 
		public function mainClass():void	{					
			trace('mainClass', stage);
			addEventListener(Event.ADDED_TO_STAGE, init);			
		}
 
		public function init():void	{				
			trace('init');
			var spr: Sprite = new Sprite();
			spr.graphics.beginFill(0xFF0000);			
			spr.graphics.beginFill(0x00FF00, 100);
			spr.graphics.lineStyle(1, 0x000000, 100);
			spr.graphics.moveTo(200, 200);
			spr.graphics.lineTo(200, 300);
			spr.graphics.lineTo(300, 300);
			spr.graphics.lineTo(300, 200);			
			var mc: MovieClip = new MovieClip;
			mc.addChild(spr);
			stage.addChild(mc); 
		}	
	}
}
Конструктор mainClass вызывается, а вот событие ADDED_TO_STAGE не происходит (функция init не вызывается), ну и строчка
Код AS1/AS2:
trace('mainClass', stage);
выдает mainClass null

А строчка
Код AS1/AS2:
trace('initApp', stage);
в MXML файле в функции initApp
Выдает initApp [object Stage]
Т.е. в MXML stage существует, а в mainClass переменная stage == null

Старый 23.03.2009, 13:52
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Kennysp Посмотреть сообщение
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.
Потому что это был рутовый класс, он уже был на сцене.

А у вас событие не вызывается потому что mainClass не добавлен в display list.

Старый 23.03.2009, 14:38
Kennysp вне форума Посмотреть профиль Отправить личное сообщение для Kennysp Найти все сообщения от Kennysp
  № 8  
Ответить с цитированием
Kennysp

Регистрация: Mar 2009
Сообщений: 28
__etc, да вы правы.
Все заработало.
Опишу что нужно было сделать, может кому поможет в будущем =)

Во-первых надо было сделать addChild:
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">
	
	<mx:Script>
		<![CDATA[					
			import mainClass;
			public function initApp():void{				
				var tmp = new mainClass();
                                this.addChild(tmp);
			}
			
		]]>
	</mx:Script>
	
</mx:Application>
Во-вторых класс должен быть наследником UIComponent, ну и действительно надо дождаться ADDED_TO_STAGE:
Код AS1/AS2:
package
{
	import mx.core.UIComponent;	
	import mx.events.FlexEvent;
	import mx.core.Application;
 
 	import flash.events.Event;
 	import flash.display.Sprite;
 	import flash.display.MovieClip;
 
	public class mainClass extends UIComponent {
 
		public mainClass Component() {
			this.addEventListener( Event.ADDED_TO_STAGE , init );		
		}
 
		private function init( event:Event ) : void{
			trace( this , "init called" , stage );
			var spr: Sprite = new Sprite();
			spr.graphics.beginFill(0xFF0000);			
			spr.graphics.beginFill(0x00FF00, 100);
			spr.graphics.lineStyle(1, 0x000000, 100);
			spr.graphics.moveTo(200, 200);
			spr.graphics.lineTo(200, 300);
			spr.graphics.lineTo(300, 300);
			spr.graphics.lineTo(300, 200);			
			var mc: MovieClip = new MovieClip;
			mc.addChild(spr);
			stage.addChild(mc); 
		}
 
	}
}

PS Спасибо всем откликнувшимся

Старый 29.03.2009, 20:49
xdoom вне форума Посмотреть профиль Отправить личное сообщение для xdoom Найти все сообщения от xdoom
  № 9  
Ответить с цитированием
xdoom
 
Аватар для xdoom

Регистрация: Apr 2008
Адрес: black sea
Сообщений: 137
Отправить сообщение для xdoom с помощью MSN Отправить сообщение для xdoom с помощью Skype™
Код AS3:
		public mainClass Component() {
			this.addEventListener( Event.ADDED_TO_STAGE , init );		
		}
... Чё то странное.. )

Даже если убрать странности получается так ...
Severity and Description Path Resource Location Creation Time Id
1008: variable 'tmp' has no type declaration. tnt/src tnt.mxml line 15 1238341897735 120
1008: variable 'tmp' has no type declaration. tnt/src totry.mxml line 8 1238341899554 122

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


Последний раз редактировалось xdoom; 29.03.2009 в 20:54.
Старый 16.05.2011, 02:48
Dmitriy913 вне форума Посмотреть профиль Отправить личное сообщение для Dmitriy913 Найти все сообщения от Dmitriy913
  № 10  
Ответить с цитированием
Dmitriy913

Регистрация: Feb 2011
Сообщений: 21
Тема старая, но всё равно напишу.
xdoom, "variable 'tmp' has no type declaration" - переменная 'tmp' не имеет определения типа.
надо в коде писать
Код AS3:
var tmp:<тип> = new mainClass();
Тип может быть mainClass либо UIComponent наверное =)

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:57.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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