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

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

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

Регистрация: Apr 2009
Сообщений: 141
По умолчанию не работает конструкция (this.parent as MovieClip).имя_функции_родителя

почему может не работать функция, вызывающая функцию родителя:
Код AS3:
			function quest_btn_click(event:MouseEvent):void
			{
				(this.parent as MovieClip).quest_click();
			}
выдаёт: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at MethodInfo-306()

при установке точки останова на эту строку
- в поле Name находится this, на котором нет плюсика для открытия (то есть он есть но когда на него нажимаешь - он пропадает),
- в поле Value стоит только: global(@2cb80f9)

подумал, что все из-за того что стоит в обработчике кнопки, но следующая конструкция тоже не работает:
Код AS3:
			function quest_btn_click(event:MouseEvent):void
			{
				quest_click_th();
			}
 
			function quest_click_th():void
			{
				(this.parent as MovieClip).quest_click();
			}
зы компилятор никак не ругается

Старый 25.10.2013, 21:38
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Посмотрите трейсом кто родитель this.parent в обработчики событий.
Может просто оказаться, что родитель не тот.

Старый 26.10.2013, 10:56
Agni вне форума Посмотреть профиль Отправить личное сообщение для Agni Найти все сообщения от Agni
  № 3  
Ответить с цитированием
Agni

Регистрация: Apr 2009
Сообщений: 141
в том то и дело - показывает, что нет родителя

обычно конструкция вызова функции родителя работает, но иногда не работает, обычно нахожу способ как это обойти, но хотелось бы понять - из-за чего может такое происходить

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Это нужно делать так:
Код AS3:
function quest_click_th():void {
	MovieClip(this.parent).quest_click();
}
Или лучше так:
Код AS3:
function quest_click_th():void {
	var clip:MovieClip    = this.parent as MovieClip;
 
	if(clip){
		clip.quest_click();
	}else{
		trace('В this.parent отсутствует клип, потому-что нас никуда не добавили.');
	}
}
Добавлено через 27 минут
п.с.

Только вместо:
MovieClip - Приводите к тому классу, к которому принадлежит ваш экземпляр, имеющий метод quest_click
__________________
Дети не должны знать о своих родителях

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
(один из хороших примеров, почему надо всеми силами избегать ситуаций когда дети командуют родителями).
Вы приводите парент к МувиКлип. Отлично, это же суперкласс и, что очень приятно, динамический, так что компилятор молча проглатывает вызов неизвестного метода, которого нет у Класса МувиКлип. Все красиво, но ровно до тех пор, пока у конкретного парента ДЕЙСТВИТЕЛЬНО есть такой метод, а вот этого класс-ребенок никак не может гарантировать, ведь создать его экземпляр мог совсем другой наследник МувиКлипа, у которого сроду не было метода quest_click(). По-хорошему нужна безопасная типизация, то есть приведение парента не к динамическому классу, а к конкретному классу, гарантированно имеющему метод quest_click(). Но тогда получается, что ребенок должен "знать" (импортировать) класс своего родителя, и использовать класс ребенка можно только всегда с одним и тем же классом родителя.
Используйте События. Тем более, когда о событиях и идет речь.
__________________
Reality.getBounds(this);

Старый 26.10.2013, 12:26
Agni вне форума Посмотреть профиль Отправить личное сообщение для Agni Найти все сообщения от Agni
  № 6  
Ответить с цитированием
Agni

Регистрация: Apr 2009
Сообщений: 141
Цитата:
Сообщение от Tails Посмотреть сообщение
Это нужно делать так:
....
Только вместо:
MovieClip - Приводите к тому классу, к которому принадлежит ваш экземпляр, имеющий метод quest_click
в руте, в классе main создается menu (в нем есть несколько работающих обращений к родителю, которые работают), в котором есть кнопка, при нажатии на которую хочу вызвать метод из класса main,
как привести к руту (или как правильнее сказать?) не понимаю
почему может не работать? может из-за того что вызывается из кнопки (которая уже в меню, а НЕ создавается динамически, на этапе выполнения)

Цитата:
Сообщение от Wolsh Посмотреть сообщение
...
Используйте События. Тем более, когда о событиях и идет речь.
обратится к родителю элемента, вызывающего данное Событие? но мне показывает, что у кнопки нет родителя

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вам показывают, что родитель — не МувиКлип.
Может, Вы лепите кнопку на stage, или в какой-то Sprite.
Цитата:
обратится к родителю элемента, вызывающего данное Событие?
Не надо ни к кому обращаться. Тот, кто создает кнопки, подписывается на события от них и в обработчиках этих событий делает то что нужно. Кнопка думать не должна. Она должна уметь красиво нажиматься, и все.
__________________
Reality.getBounds(this);

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

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

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


 


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


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