Форум 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=124411)

F_attaka 29.04.2009 06:45

не могу вытащить переменную из кнопки
 
hi
класс Btn расширяет MovieClip class c целью добавить переменные. swf с рядом символов, имеющих такие классы - кнопки, стрелки и т.п. загружается как внешняя библиотека символов в главный swf. там создается array из загруженных классов -[[class Arrow_01],[class Btn_LeftMain],[class BtnRightMain],[class Btn_01]].
Я не могу получить данные из полей экз-ов Btn при наступлении события MouseEvent.CLICK
Код AS3:

var i : Number;
                        for(i = 0;i < 4;i++) {
 
                                var t:DisplayObject  =new visualAssets[2]();               
 
                                t["xx"]=i;
                                t.addEventListener(MouseEvent.CLICK, onMouseСlickHandler);
 
                                trace("t[xx] :"+t["xx"])//отлично трейсит

хэндлер таков:
Код AS3:

private function onMouseClickHandler(evt:Event) : void {
        var b:DisplayObjectСontainer=evt.target as DisplayObjectContainer;
 
        trace("b[xx]:" +b['xx']) //не работает! b["xx"] пробовал. Если привести к реальному названию класса Flash ругается -нет класса такого.
 
                }       
        }

класс Btn имеет внутри public var xx;

я уж не говорю о приведении к типу класса. Я делаю в FDT, создаю даже swc, где виден класс Btn. но при компиляции во Флэш переменную не вытащить, а прbведение к классу приводит к ошибке -нет такого класса. Хотя FDT корректно себя ведет.

1. В чем ошибка? просто намекнуть можно.
2. var t: DisplayObjectContainer =new visualAssets[2](); как бы это привести к такому
var t: visualAssets[2].toString()=new visualAssets[2](); то есть чтобы сразу и тип объекта задавался

Спасибо! Особо разжевывать не надо намек (не в help) был бы суперпомощью. Поучения бесцеремонные просьба оставлять при себе.

Добавлено через 49 минут
так конечно работает, но это как коряво. Хотя точно отвечает задаче -указать раздел, висящий на кнопке для сообщения медиатору.
Код AS3:

private function onMouseClickHandler(evt:Event) : void {
        var b:Object=evt.target as Object;
 
        trace("b[xx]:" +b['xx']) //работает! b["xx"] пробовал. но не нравиться кастомизация к "Объект"
 
                }       
        }


etc 29.04.2009 07:44

1. В подходе. Что вы там в xx хранить собрались? Для связи вьювер<->данные пишут хеш, используя, например, Dictionary;
2. Никак. Можно наследовать все кнопки от одного базового класса или на каждую повесить интерфейс, у которого есть геттер xx. Но для работы, как с DisplayObject, всё равно придется кастить.

F_attaka 29.04.2009 09:04

1. кнопка всегда хранит что-то. Как минимум ID. Как максимум -больше ничего. Или?

2. если много классов интерфейса -то ведь логично, зная их положение в Array или в Dictionary, не задавать вручную тип. Хотя по длине кода -тоже и выходит... Но явно ручками задавать как-то не хочется. Хочется, чтобы скрипт вытянул название класса и сам типизировал создаваемый объект, а я для этого только подставил позицию нужного класса в arrayOfClasses .

в целом это просто кнопка для смены раздела. Можно, конечно, расширить MovieClip и загрузить просто графику в класс и не заморачиваться. но задела тема переменных в загруженном swf.

etc 29.04.2009 09:10

1. Ничего не хранит;
2. Типизировал к чему? Объект от этого не изменится.

з. Ы. Я вообще на работе.

F_attaka 29.04.2009 09:35

1. в любом случае надо знать какая кнопка, для разных целей, хотя бы остальные поставить на новые координаты. Как скрипт идентифицирует нажатую кнопку? если она сама не сообщит или ее не отследят (но все равно надо ее идентифицировать ведь).Везде кнопка имеет уникальный id, ИМХО. да не я один такой. вот примитивно, конечно, в части кнопки -http://hubflanger.com/building-a-flash-site-using-puremvc/ 8 абзац. передается ID .
собственно по этому и ползу тьюториалу.
Код AS3:

private function onMouseDownHandler(evt:Event) : void {
                // DISPATH EVENT TO PureMVC
                var b:Object=evt.currentTarget as Object;
                dispatchEvent(new MenuBtnEvent(MenuBtnEvent.MENU_BTN_PRESS, b["ID"]));
                }       
        }

2. 2. var t: DisplayObjectContainer =new visualAssets[2](); как бы это привести к такому
var t: visualAssets[2].toString()=new visualAssets[2](); то есть чтобы сразу и тип объекта задавался. Автокомлит в том же FDT работает ведь когда есс-но тип задан объекта. Я же не подставлю t.xx если это не кастом класс, содержащий setter "xx" , допустим. А если это через 300 строк кода сквозняком идет и проверки нет, так как тип не задан объекта?

etc 29.04.2009 09:40

1. По хешу Dictionary button -> id. PureMVC — не панацея и не эталон программирования. И автор туториала не знает, что такое Dictionary, либо просто не умеет им пользоваться.

F_attaka 29.04.2009 10:21

хорошо, я подумаю. Dictionary использовал, но не злостно.
откуда такие идеи- кто из мэтров -где читать? или он передо мной? :).
создавая меню, все кнопки помещаем в dictionary. в хэндлере проверяем, какая нажата была и отдаем все данные, с ней ассоциированные, из Dictionary?

спасибо за идеи. если я правильно их понял. делал я и так -подобно вернее... если я правильно вас понял...

etc 29.04.2009 10:35

Уникальным идентификатором кнопки является простая ссылка на неё. Поэтому ключами Dictionary будут ссылки на кнопки, а значениями — данные. Например, ID или номер кнопки или ещё как угодно.

F_attaka 29.04.2009 10:59

конечно. и не надо никаких расширений в этом случае MovieClip.
спасибо!


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

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