Расширение класса Flex FileReference для включения другого свойства - PullRequest
0 голосов
/ 12 ноября 2009

Я хочу расширить класс 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();
    }       
}
}

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


Edit:

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

var fr:SmxFR = new SmxFR();

Из этого я получаю свойство live handle, а все остальные (то есть унаследованные) свойства бросают Error #2037.


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

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

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

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

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

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

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

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

0 голосов
/ 12 ноября 2009

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

0 голосов
/ 12 ноября 2009

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


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

...