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

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

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

Регистрация: Jun 2006
Сообщений: 28
По умолчанию борьба с EventDispatcher

мне хотелось бы создать класс типа radiobutton, кнопки с двумя возможными положениями "вкл/выкл" каждая и только одна кнопка может быть включена одновременно, т.е. одну включаешь - остальные выключаются

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

Код:
var rb1:radioButton = new radioButton();
var rb2:radioButton = new radioButton();
...
я пытаюсь использовать диспетчер событий внутри класса, чтобы после клика на instance запускалось событие и его бы слушали все instances этого класса.

однако запущенное событие не ловится. подскажите, пожалуйста, что я делаю не так и как это лучше сделать? спасибо

Код:
package sample{

    import flash.events.EventDispatcher;
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    import flash.events.Event;

    public class radioButtons extends MovieClip {

        var dispatcher:EventDispatcher = new EventDispatcher();

        public function radioButtons() {
            this.buttonMode = true;
            this.addEventListener(MouseEvent.CLICK, butClick);
            this.addEventListener("clicked", capture);
        }

        public function butClick(e:MouseEvent) {
            dispatcher.dispatchEvent(new Event("clicked"));
            trace(e.currentTarget + " has been clicked");
        }

        function capture(e:Event) {
            trace(e.currentTarget + " has received a click notification");
        }

    }

}

Старый 05.07.2010, 15:31
ins_nsk вне форума Посмотреть профиль Отправить личное сообщение для ins_nsk Найти все сообщения от ins_nsk
  № 2  
Ответить с цитированием
ins_nsk

Регистрация: Jul 2007
Сообщений: 30
выпускаешь евент dispatcher'ом, а ловишь MovieClip'ом

Добавлено через 14 минут
Накидал на коленке, компилировать не пробовал:

Код AS3:
package  {
	import flash.display.MovieClip;
	import flash.events.EventDispatcher;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class myRadio extends MovieClip {
 
		public static var dispatcher:EventDispatcher;
		public static var instances:Array;
 
		public function myRadio()
		{
			myRadio.checkInstance();			
 
			myRadio.instances.push(this);
 
			addEventListener(MouseEvent.CLICK, onMyClick);
			addEventListener("clicked", onSomeClick);
		}	
 
		private function onMyClick(e:MouseEvent):void
		{
			myRadio.dispatcher.dispatchEvent(new Event("clicked"));
 
		}
 
		private function onSomeClick(e:Event):void
		{
			// update me
		}
 
		public static function checkInstance():void
		{
			if(myRadio.dispatcher == null)
			{
				dispatcher = new EventDispatcher();
				dispatcher.addEventListener("clicked", sendClicked);
				instances = new Array();
			}
		}
 
		private static function sendClicked(e:Event):void
		{
			for each(var instance:MovieClip in instances)
			{
				instance.dispatchEvent(e);
			}
		}
	}	
}
Только надо собственный евент делать чтоб параметром передавать какой именно экземпляр был щёлкнут.


Последний раз редактировалось ins_nsk; 05.07.2010 в 15:54.
Старый 05.07.2010, 16:25
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

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

Старый 05.07.2010, 17:14
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 4  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
Цитата:
Сообщение от Wolsh Посмотреть сообщение
А если в форме нужно более одного набора радиокнопок? Не логичнее ли всетаки иметь класс НаборРадиоКнопок ?
И с каких пор названия классов стали писать с маленькой буквы?))
я так написал для большей наглядности, на самом деле не радиокнопки это вовсе, так что наборы не нужны

Добавлено через 8 минут
Цитата:
Сообщение от ins_nsk Посмотреть сообщение
выпускаешь евент dispatcher'ом, а ловишь MovieClip'ом
спасибо!
в списке вещей, которых я не понимаю, на первом месте вот это:

Код AS3:
public function myRadio()
		{
			myRadio.checkInstance();
использование имени класса внутри описания класса, это не то же самое что
Код AS3:
	this.checkInstance();
?

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Класс и его Экземпляр (instance) - две большие разницы.
Конкретно метод checkInstance объявлен как static, т.е. является методом Класса, а не отдельного Экземпляра.
ins_nsk предлагает использовать собственные методы Класса вместо создания отдельного экземпляра класса-менеджера (поэтому мое замечание выше, что такой менеджер будет только один, невозможно сделать несколько наборов). У него Класс хранит в своем собственном массиве ссылки на все создаваемые Экземпляры кнопок, и управляет их связанным поведением.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 05.07.2010 в 18:26.
Старый 05.07.2010, 18:36
ins_nsk вне форума Посмотреть профиль Отправить личное сообщение для ins_nsk Найти все сообщения от ins_nsk
  № 6  
Ответить с цитированием
ins_nsk

Регистрация: Jul 2007
Сообщений: 30
Wolsh, ну почему же один, нужно просто немного расширить функциональность.

var myElement1:myRadio = new myRadio("group1");
var myElement2:myRadio = new myRadio("group1");
var myElement3:myRadio = new myRadio("group1");

var myElement4:myRadio = new myRadio("group2");
var myElement5:myRadio = new myRadio("group2");
var myElement6:myRadio = new myRadio("group2");

Статический массив экземпляров сделать ассоциативным массивом массивов.

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

Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
Могу посоветовать очень хорошую СДК, там уже написаны радиобаттоны. Называется она Flex

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Хех, ну опосля то можно много чего добавить, например создание групп по xml)))
Претензия была к данному коленочному классу (а точнее к самому подходу "кнопки все решают сами").
И у меня еще масса вопросов есть.
1. Не хватает обработки удаления кнопки.
2. Не лучше ли при клике по кнопке вызывать напрямую некий метод Класса (передавая ему ссылку на кликнутую кнопку), который пробежится по массиву и переведет остальные кнопки в нужное состояние? В Вашем варианте, как я понял, кликнутая кнопка также получает событие "кликед", и соотв. переключится в ненажатое состояние))) Стоит ли городить в каждой кнопке огороды проверок и тем более изобретать отдельное событие...
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 05.07.2010 в 19:12.
Старый 05.07.2010, 20:02
aliim вне форума Посмотреть профиль Отправить личное сообщение для aliim Найти все сообщения от aliim
  № 9  
Ответить с цитированием
aliim

Регистрация: Jun 2006
Сообщений: 28
совсем забыл про эти статические переменные, очень полезная в хозяйстве вещь

по здравом размышлении диспетчер оказался лишним, вот что получилось в результате:

Код AS3:
// file test.as 
 
package {
 
	import flash.display.MovieClip;
	import flash.events.Event;
	import radioButton;
 
	public class test extends MovieClip {
 
		public function test() {
			addEventListener(Event.ADDED_TO_STAGE,init);
		}
 
		private function init(event:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE,init);
 
			var rb1:radioButton = new radioButton(50);
			var rb2:radioButton = new radioButton(100);
			var rb3:radioButton = new radioButton(150);
 
			addChild(rb1);
			addChild(rb2);
			addChild(rb3);
 
		}
 
	}
 
}
 
 
 
// file radioButton.as
 
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
 
	public class radioButton extends MovieClip {
 
		private static var num:Number = 0;
		private static var instances:Array = new Array();
 
		public function radioButton(x:Number) {
 
			instances.push(this);
			num++;
			name = "button" + String(num);
 
			graphics.beginFill(0xff0000, 1);
			graphics.drawRect(0,0,30,30);
			graphics.endFill();
			this.x = x;
			this.buttonMode = true;
 
			this.addEventListener(MouseEvent.CLICK, mouseClick);
		}
 
		private function mouseClick(e:MouseEvent) {
			trace("\n" + e.currentTarget.name + " has been clicked");
			for (var i in instances) {
				if (instances[i] != e.currentTarget) {
					instances[i].switchIt();
				}
			}
		}
 
		private function switchIt() {
			trace(this.name + " has been told to switch");
		}
 
	}
 
}
 
 
 
// output
 
button1 has been clicked
button2 has been told to switch
button3 has been told to switch
 
button2 has been clicked
button1 has been told to switch
button3 has been told to switch
 
button3 has been clicked
button1 has been told to switch
button2 has been told to switch
как раз то, что мне нужно, всем спасибо!

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

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

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


 


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


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