Расширение класса Flex FileReference для включения другого свойства

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

Я также хочу иметь возможность без проблем преобразовывать существующие объекты FileReference в этот класс. У меня есть:

var fr:SmxFR = e.target as SmxFR

и я хочу, чтобы это сработало; сейчас он просто возвращает ноль.

Пустой, только что созданный объект SmxFR имеет расширенное свойство, но все его унаследованные свойства и объекты возвращают Error: Error #2037: Functions called in incorrect sequence, or earlier call was unsuccessful.

Я использую этот класс SmxFR.as:

package
{
import flash.net.FileReference;

public class SmxFR extends FileReference
{
    public var housenum:String = "";
    public function SmxFR()
    {
        super();
    }       
}
}

На самом деле, держал это как можно проще. Может кто-нибудь помочь мне разобраться в этом? Спасибо.


Редактировать:

По запросу это создание экземпляра, которое приводит к вышеупомянутой ошибке во всех унаследованных объектах:

var fr:SmxFR = new SmxFR();

Я получаю от этого живое свойство дескриптора, а все остальные (то есть унаследованные) свойства бросают Error #2037.


Итак, может быть, то, что я хочу сделать, потребует переопределения FileReferenceList? Если исходные объекты должны быть созданы для SxmFR, это то, что мне нужно сделать, поскольку я использую FRL, чтобы позволить пользователю выбрать несколько файлов одновременно. Вы, ребята, уверены, что нет возможности поститься с FileReference до моего класса?


person jeffcook2150    schedule 12.11.2009    source источник
comment
был ли e.target создан как класс SmxFR?   -  person jochil    schedule 12.11.2009
comment
Нет, он был создан как FileReference. Я хочу иметь возможность легко выполнять трансляцию из FileReference в SmxFR.   -  person jeffcook2150    schedule 12.11.2009
comment
Вы должны создать его как SmxFR. Все объекты SmxFR тоже являются объектами FileReferene, но не наоборот.   -  person Amarghosh    schedule 12.11.2009
comment
Амаргош, просмотрите мои правки и ответьте Йохену Хильгерсу. Мне нужно переопределить FileReferenceList?   -  person jeffcook2150    schedule 12.11.2009
comment
Это не поможет. использовать настраиваемые события - я обновил свой ответ.   -  person Amarghosh    schedule 13.11.2009


Ответы (3)


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

Мое решение: вместо расширения FileReference расширьте Event и добавьте к нему свои свойства.

var myEvent:MyExtendedEvent = new MyExtendedEvent();
myEvent.myCustomProperty = myValue;
dispatchEvent(myEvent);

Затем в своем обработчике вы просто пишете:

function myEventHandler(e:MyExtendedEvent):void {
     trace(e.myCustomProperty);
}

Намного более безболезненно идти по этому пути! Дополнительным преимуществом является то, что если какой-либо другой разработчик Flash где-либо когда-либо посмотрит на ваш код, он не столкнется с нестандартной настраиваемой FileReference. :)

person Myk    schedule 12.11.2009
comment
Я пробовал это, но исходный слушатель находится на Event.COMPLETE. Я хочу, чтобы пользовательские события запускались при отправке. Таким образом, я должен отправить событие, когда Event.COMPLETE срабатывает для этого FileReference ... проблема в том, что даже если мой ответ для fr.Event.COMPLETE - отправить событие ... У меня все еще нет параметра Я хочу пройти. Вы понимаете или знаете, как помочь? Мне действительно нужно это сделать. - person jeffcook2150; 13.11.2009
comment
Ваш полный обработчик должен быть в состоянии помочь вам - вы ведь знаете, что можете ссылаться на Event.currentTarget, верно? Событие содержит ссылку на отправивший его объект. Итак, если вам нужен доступ к свойству myVal, и это свойство объекта диспетчеризации, вы можете сделать что-то вроде этого: function completeHandler (e: Event): void {var myVal: Object = e.currentTarget.valueYouWant; var myEvent: MyCustomEvent = новый MyCustomEvent (); myEvent.myVal = myVal; dispatchEvent (myEvent); } Имеет ли это смысл? Потратьте некоторое время на то, чтобы по-настоящему понять модель событий, вы многому научитесь. - person Myk; 13.11.2009

Когда e.target создается как FileReference, вы не можете преобразовать его в SmxFR, потому что он не находится в строке наследования. Другим способом вы можете использовать объект SmxFR в FileRefernce.

person jochil    schedule 12.11.2009
comment
Хм, я использую FileReferenceList, чтобы пользователь мог выбирать сразу несколько файлов. Полагаю, мне придется переопределить это, чтобы отображать SmxFR объектов вместо FileReference объектов в FileReferenceList.fileList? - person jeffcook2150; 12.11.2009
comment
Да, лучше всего продлить мероприятие, чтобы делать то, что вы хотите. См. Мое предложение о написании статьи. Двигайте машину, а не дорогу. ;) - person Myk; 13.11.2009

Расширение FileReferenceList бесполезно. Метод FileReferenceList.browse() создает массив объектов FileReference, когда пользователь выбирает несколько файлов - это происходит внутри (может быть в его частных методах), и вы не можете изменить это поведение и заставить его вместо этого создавать объекты SxmFR. Используйте настраиваемые события, как предложил Myk.


В этой статье говорится о звуковых объектах, но это может быть применимо и к FileReference объектам. Может быть, вы не сможете их повторно использовать. Опубликуйте код, в котором вы используете класс SmxFr, и получите указанную ошибку.

person Amarghosh    schedule 12.11.2009