Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как понять, кто вызвал событие? (http://www.flasher.ru/forum/showthread.php?t=148901)

motoroller 14.01.2011 01:27

Как понять, кто вызвал событие?
 
Есть собственный cellRender для tileList где есть изображение и добавлены кнопки
В основном файле есть обработчик события:

Код AS3:

files.addEventListener(ListEvent.ITEM_CLICK, action);
 
private function action(event:ListEvent):void {
 // хочу понять куда кликнул пользователь просто на картинку или по кнопке ...
}


TanaTiX 14.01.2011 01:31

event.target в обработчике

motoroller 14.01.2011 01:51

[object TileList]

Добавлено через 5 минут
если делать так: trace(event.target.name) // все время выводит instance75

Куда бы ты не кликал в ячейке хоть на картинку хоть на кнопку :(

TanaTiX 14.01.2011 02:22

у объекта события есть 2 интересных свойства - target и currentTarget. Почитайте на досуге.

alatar 14.01.2011 05:12

TanaTiX, ListEvent отправляется собственно TileList'ом, соответственно и target и currentTarger будут указывать на TileList.
Код AS3:

files.addEventListener(ListEvent.ITEM_CLICK, action);
 
private function action(event:ListEvent):void {
  /*
    ваш CellRenderer. Вместо Object пропишите ваш тип.
    В самом CellRenderer сделайте переменную которая будет сигнализировать, что нажато
  */

  var renderer:Object = files.itemToCellRenderer(event.item);
}

Или сделайте свое всплывающее событие от CellRenderer и туда уже пихайте что хотите. Или заведите в данных дополнительное поле в которое записывайте, что нажато. Тогда в обработчике достаточно будет проверить это поле у event.item.

motoroller 14.01.2011 05:18

Вы думаете я стал бы писать сюда не попробовав
trace(event.Currenttarget.name)

Добавлено через 5 минут
Цитата:

Сообщение от alatar (Сообщение 964514)
TanaTiX, ListEvent отправляется собственно TileList'ом, соответственно и target и currentTarger будут указывать на TileList.
Код AS3:

files.addEventListener(ListEvent.ITEM_CLICK, action);
 
private function action(event:ListEvent):void {
  /*
    ваш CellRenderer. Вместо Object пропишите ваш тип.
    В самом CellRenderer сделайте переменную которая будет сигнализировать, что нажато
  */

  var renderer:Object = files.itemToCellRenderer(event.item);
}

Или сделайте свое всплывающее событие от CellRenderer и туда уже пихайте что хотите. Или заведите в данных дополнительное поле в которое записывайте, что нажато. Тогда в обработчике достаточно будет проверить это поле у event.item.

Код AS3:

// cellRender
// события для меню
b_delete.addEventListener (MouseEvent.CLICK, deleteFile);
 
private function deleteFile(event:MouseEvent):void {
    data.data.action = "delete";
}
 
//mainScript
 
files.addEventListener(ListEvent.ITEM_CLICK, action);
private function action(event:ListEvent):void {
          var action:String=event.item.data.action;
 
                                if(action=='delete') {
trace('работает')
}

Данная конструкция работает, но есть минус, что она запоминает прошлое действие, допустим было: удалить файл, но я его не удалил и в дальнейшем по нажатию на эту ячейку вызывается фунция удаления тк data.data.action = "delete", ну соотвественно пока не выбрано какое-либо другое действие с этой ячейкой

Скажи я что-то неверно делаю в принципе или эту схему можно как-то изменить?

TanaTiX 14.01.2011 05:27

Извиняюсь, я подумал, что речь идет об экземпляре класса. В 1м посте cellRender с маленькой буквы, вот и обознался, думаю уже в зависимости от регистра...

alatar 14.01.2011 05:33

Цитата:

или эту схему можно как-то изменить?
подписаться на MouseEvent.CLICK у картинки и у самого CellRenderer. Можно использовать один обработчик:
Код AS3:

private function deleteFile(event:MouseEvent):void {
if (event.currentTarget == b_delete)
    {
        data.data.action = "delete";
    {
    else
    {
        data.data.action = "none";
    }
}

Добавлено через 1 минуту
Хотя при таком раскладе у картинки можно и не подписываться, а просто отрубить ей мышь.

motoroller 14.01.2011 05:55

так попробую, а вообще это плохо или нет что повешано можно сказать два обработчика
из главного класса и cellrendera ?
Не будет ли что-либо дублироваться...
Так а если у меня еще не одна кнопка а много ...

alatar 14.01.2011 06:01

Цитата:

так попробую, а вообще это плохо или нет что повешано можно сказать два обработчика
В принципе, можно обойтись и одним, если повесить его на CellRenderer и проверять event.target == b_delete.
Цитата:

Так а если у меня еще не одна кнопка а много ...
Волшебных палочек не существует. Есть кнопка, значит кто-то должен ее обработать.


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

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