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

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

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

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
По умолчанию возможно ли удаление объекта со stage из другого класса

в основном классе приложения есть объект (экземпляр класса FloatingCont):


Код AS3:
	public class Main extends Sprite
	{
		private var _floatingCont:FloatingCont = new FloatingCont();
 
		public function Main() 
		{
			stage.addChild(_floatingCont);
 
		}
 
}
пытаюсь из другого класса удалить объект _floatingCont:

Код AS3:
 
	public class CodeExamples extends Sprite
 
	{
		private var _clickableHeadingExTf:MyButton = new MyButton();
 
 
		public function CodeExamples() 
		{
 
			_clickableHeadingExTf.addEventListener(MouseEvent.CLICK, clickListener);
		}
 
		private function clickListener(e:MouseEvent):void 
		{
			if (stage.contains(_floatingCont)) {
				stage.removeChild(_floatingCont);
			}
 
			switch(e.target) {
 
 
			}
 
		}
 
 
 
	}
 
}
выдаёт ошибку...
получается, что stage.addChild(_ someObject) - работает, stage.removeChildAt(i) - работает, а можно ли как-нибудь сделать stage.removeChild(_someObject) из другого класса?


Последний раз редактировалось nelco; 20.09.2015 в 20:34.
Старый 20.09.2015, 14:55
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
В другом классе нет ссылки на _floatingCont, соответственно и удалять нечего.
И вообще метод contains вернет true, даже если фактически объект не содержится в самом контейнере, а содержится в каком-то из его дочерних. У contains есть второй параметрб который как раз отключает рекурсивную проверку.
Но вообще лучше не использовать contains, а использовать
Код AS3:
if (_floatingCont.parent) _floatingCont.parent.removeChild(_floatingCont);
То есть проверять наличие родителя.

И еще одно. Не надо путать stage и документ класс.
Вначале в Main написано addChild(_floatingCont);
Это совсем не означает, что объект добавился на stage.
Код AS3:
addChild(_floatingCont);
равнозначно записи
Код AS3:
this.addChild(_floatingCont);
а не
Код AS3:
stage.addChild(_floatingCont);
Значит _floatingCont добавляется в объект Main, а не на сцену. То же самое касается и всех других контейнеров. На сцену объект попадет только при явном указании на это, как в
Код AS3:
stage.addChild(_floatingCont);
п.с. Советую почитать что такое инкапсуляция и зачем она нужна

Старый 20.09.2015, 15:11
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 3  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
Цитата:
Не надо путать stage и документ класс
- это уловил, спасибо, важно!

если я не могу удалять из класса объект, который находится в Main или в Stage, то как мне тогда менять содержимое на stage или в Main? диспатчить события в Main и там ставить слушатели и выполнять нужные действия? нельзя как-нибудь "расшарить" объекты в Main, для другого класса?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
диспатчить события в Main и там ставить слушатели и выполнять нужные действия?
Да.
Цитата:
нельзя как-нибудь "расшарить" объекты в Main, для другого класса?
Можно, но это будет неправильный подход. Нарушение инкапсуляции. Не нужно учиться сразу плохому. Это потом приведет к очень большим проблемам в архитектуре. Ладно какое-нибудь маленькое приложение, где легко все отследить и поправить. А если большое?
Говорю по опыту, лучше слать события) И вообще, тут уже много раз поднимались темы MVC, да и вообще нагуглить это очень просто. Так вот - это очень важная штука. Ее тоже нужно по возможности изучить как можно быстрее

Старый 20.09.2015, 16:47
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну, MVC не MVC, но без хотя бы общего понимания ООП в AS3 будет крайне неуютно — ночь темна и полна ужаса, потому что AS3 построен на концепции ООП и старается поддерживать ее всеми силами, даже костылями. И пока основные понятия ООП для Вас темный лес, будет совершенно непонятно, как и, главное, почему все устроено именно так. Но начинать с ООП не получится, увы. Сначала надо какую-то синтаксическую базу освоить.
В двух словах по этой ситуации: если объект А создал объект В, то ссылка на объект В известна только ему одному. Важно понять, что НЕТ никакого общего реестра всех объектов, в который можно обратиться из любого места к любому объекту. Чтобы другие объекты могли получить эту ссылку, соответствующая переменная в объекте А должна "быть расшареной", на языке программистов — иметь модификатор доступа public. Модификаторы доступа определяют область видимости переменной. А если еще точнее — свойства. Свойствами называются переменные, объявленные в теле класса (переменные могут также объявляться в теле функций, и тогда доступ к ним возможен только в теле функции — такие переменные называются локальными и свойствами "всего" экземпляра не являются). Если переменная объявлена в теле класса, она доступна как минимум во всем коде класса, то есть во всех его функциях (методах). Даже если Вы не укажете модификатор явно, он будет назначен автоматически (по-умолчанию internal — доступен всем членам пакета). Модификатор public делает свойство доступным всем [у кого есть ссылка на экземпляр], а модификатор private закрывает доступ к свойству для всех других объектов, делая свойство "внутренним" для самого экземпляра (опустим тонкости и подробности).
Итак, в данной ситуации Вам нужно объявить не private, а
Код AS3:
public var floatingCont:FloatingCont = new FloatingCont();
(обратите внимание, что _ перед публичной переменной не ставится)
и далее обращаться к ней, как к свойству(!) объекта-хозяина, то есть мейна, который для всех детей доступен по ссылке root:
Код AS3:
if (root.floatingCont.parent == root) {
	root.removeChild(root.floatingCont);
}
//я здесь опускаю морализаторство; все сказанное товарищами выше безусловно верно, и делать ТАК нельзя. Я просто демонстрирую, как оно работает, на Вашем примере. В AS3 вообще понятия "оно работает" и "хороший код" совершенно не обязательно тождественны
__________________
Reality.getBounds(this);

Старый 20.09.2015, 18:11
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Мне кажется, у автора до сих пор проблемы с пониманием концепции дисплей листа...
Wolsh, скиньте ему то, что вы когда-то скидывали, дерево дисплей листа, вроде, чтобы он наглядно увидел, как оно всё на самом деле устроено, и расскажите про матрицы, ColorTransform, как они влияют на контейнер, фильтры и другие свойства DO.
__________________
There is no thing in this world that is not simple.

Старый 20.09.2015, 19:27
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 7  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
Цитата:
Мне кажется, у автора до сих пор проблемы с пониманием концепции дисплей листа...
как я понимаю: DisplayList состоит весь из DOC-ов, корень - это Stage (создаётся автоматически), внутри него все объекты-DOC или DO , самый первый идёт Main.as потом дальше все вложено друг в друга, может быть вложено в Main, а может напрямую в Stage, вопрос в том, куда правильно всё отправлять? в Main или в Stage? судя по тому, что обращаться к stage (хотя бы для stage.addChild) можно из любого класса, то правильнее направлять DOC-ы сразу в Stage?... не понимаю только почему нельзя менять (удалять) DOC-ы, находящиеся в Stage из других классов, ведь это было бы удобно: класс обращается к stage, смотрит, есть ли там DOC с нужным именем (опять же непонятно как обращаться к DOC-y как если только не по имени переменной) и редактирует его... но сейчас, как выяснилось, это не правильно и непонятно как вообще (удалять контейнеры, находящиеся в Stage вызовом stage.removeChild(_objectName) не работает)...
например мне нужно удалить DOC, находящийся в Stage, например в Stage у него имя _floatingCont, мне нужно в классе (из которого я хочу удалить _floatingCont, находящийся в Stage) писать dispatchEvent("deleteFloatingCont"), а в stage регистрировать слушатель, который будет принимать событие "deleteFloatingCont" и только тогда удалять этот _floatingCont? но опять же, мне нужно, например, проверять содержит ли Stage этот _floatingCont, и если содержит, то удалять прошлый экземпляр (removeChild) и потом создавать новый экземпляр _floatingCont... как тогда проверить из другого класса, содержит ли Stage объект _floatingCont, если у класса нет доступа к такой "проверке" :\\

Wolsh, прочитал Ваш ответ, буду пробовать так, как Вы написали, пока не пойму как делать правильно... :\\

Добавлено через 25 минут
СaseyRyan, что такое MVC не знаю, в книжке Мука про это ещё не было ничего, нагуглю обязательно... спасибо за ответы!


Последний раз редактировалось nelco; 20.09.2015 в 20:33.
Старый 20.09.2015, 22:04
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Эмм.. не помню, чтобы я что-то "скидывал".. вот здесь есть схемка.
А здесь подборка "почему stage.addChild() это Зло".
__________________
Reality.getBounds(this);

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

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
Код AS3:
package testProject 
{
	import as3Tutorial.scr.FloatingCont;
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
		public var floatingCont:FloatingCont = new FloatingCont();
		private var _someClass:SomeClass = new SomeClass();
 
 
		public function Main() 
		{
		addChild(floatingCont);	
		addChild(_someClass);
		}
 
	}
 
}

Код AS1/AS2:
package testProject 
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
 
	public class SomeClass extends Sprite
	{
		private var _someText:TextField = new TextField();
 
		public function SomeClass() 
		{
			_someText.text = "button";
			_someText.textColor = 0x800000;
			addChild(_someText);
 
			_someText.addEventListener(MouseEvent.CLICK, onClickListener);
		}
 
		private function onClickListener(e:MouseEvent):void 
		{
		trace (root) // выводит [object Main]
		trace (root.floatingCont); // Access of possibly undefined property floatingCont through a reference with static type flash.display:DisplayObject
 
		}
 
	}
 
}
всё равно нет доступа к floatingCont, созданному с атрибутом public

Цитата:
Модификатор public делает свойство доступным всем [у кого есть ссылка на экземпляр]
у меня в классе SomeClass нет же ссылки на экземпляр?

Старый 21.09.2015, 12:36
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 10  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
как один из вариантов передачи ссылки

Код AS3:
package testProject 
{
	import as3Tutorial.scr.FloatingCont;
	import flash.display.Sprite;
 
	public class Main extends Sprite
	{
		public var floatingCont:FloatingCont;
		private var _someClass:SomeClass; 
 
 
		public function Main() 
		{
 floatingCont= new FloatingCont();
_someClass= new SomeClass(floatingCont);
		addChild(floatingCont);	
		addChild(_someClass);
		}
 
	}
 
}
Код AS3:
package testProject 
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
 
	public class SomeClass extends Sprite
	{
		private var _someText:TextField = new TextField();
                public var floatingCont:FloatingCont;
		public function SomeClass(_floatingCont:FloatingCont ) 
		{
                        floatingCont = _floatingCont
			_someText.text = "button";
			_someText.textColor = 0x800000;
			addChild(_someText);
 
			_someText.addEventListener(MouseEvent.CLICK, onClickListener);
		}
 
		private function onClickListener(e:MouseEvent):void 
		{
		trace (root) // выводит [object Main]
		trace (root.floatingCont); // Access of possibly undefined property floatingCont through a reference with static type flash.display:DisplayObject
 
		}
 
	}
 
}
Добавлено через 2 минуты
можно ещё set/get, можно через наследование и т.д.

Добавлено через 3 минуты
хотя стоит ещё добавить слушателя сцены, а то мож ошибки посыпать

Добавлено через 5 минут
код нге проверял, мож чё не так, но смысл надеюсь понятен

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

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

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


 


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


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