Hello :)
Chez moi tout fonctionne avec un exemple un peu plus simple... (trop
compliqué ton exemple pour isoler convenablement le problème)
A mon sens tu utilises beaucoup trop de variable locales et tu n'utilises
pas du coup de gestion des weak references dans tes addEventListener lorsque
tu écoutes les select et cancels... donc cela peut être une cause du
problème. Pour le reste ... faudrait nous préciser sur quelle version du
player tu bosses etc ? Car impossible de dire si ton code à un bug venant du
player ou autre.
Voilà mon bout de code en 2 classes pour tester ton cas de figure :
#classe Explorer
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.net.FileReferenceList;
/**
* Explores and selects one or multi files.
*/
public class Explorer extends EventDispatcher
{
public function Explorer()
{
_file = new FileReference() ;
_file.addEventListener( Event.SELECT , _select);
_file.addEventListener( Event.CANCEL , _cancel);
_files = new FileReferenceList() ;
_files.addEventListener( Event.SELECT , _select);
_files.addEventListener( Event.CANCEL , _cancel);
}
public static const TXT:FileFilter = new FileFilter( "txt" , "*.txt"
) ;
public static const CSV:FileFilter = new FileFilter( "csv" ,
"*.txt;*.csv" );
public static const JPG:FileFilter = new FileFilter( "jpeg",
"*.jpg;*.jpeg" ) ;
public static const GIF:FileFilter = new FileFilter( "gif" ,
"*.gif");
public static const SWF:FileFilter = new FileFilter( "swf" ,
'*.swf');
public static const FLV:FileFilter = new FileFilter( "flv" ,
'*.flv');
/**
* Indicates if the explorer select multi-files or one.
*/
public function get files():Array
{
return multi ? _files.fileList : [ _file ] ;
}
/**
* Indicates if the explorer select multi-files or one.
*/
public var multi:Boolean ;
public function browse( filters:Array = null ):Boolean
{
if ( multi )
{
return _files.browse( filters ) ;
}
else
{
return _file.browse( filters ) ;
}
}
/**
* @private
*/
private function _cancel( e:Event ):void
{
trace( e.type ) ;
}
private function _select( e:Event ):void
{
trace( e.type + " : " + files.length ) ;
}
/**
* @private
*/
private var _file:FileReference ;
/**
* @private
*/
private var _files:FileReferenceList = new FileReferenceList() ;
}
}
#classe main ExampleExplorer
package
{
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class ExampleExplorer extends Sprite
{
public function ExampleExplorer()
{
stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDown ) ;
}
public var explorer:Explorer = new Explorer() ;
public function keyDown( e:KeyboardEvent):void
{
var code:uint = e.keyCode ;
switch( code )
{
case Keyboard.UP :
{
explorer.browse() ;
break ;
}
case Keyboard.RIGHT :
{
explorer.multi = false ;
explorer.browse( [ Explorer.JPG ]) ;
break ;
}
case Keyboard.LEFT :
{
explorer.multi = true ;
explorer.browse( [ Explorer.JPG ]) ;
break ;
}
}
}
}
}
J'ai bien au final le select qui est notifié dans les 2 cas (multi = true et
multi = false)
Tu devrais essayer de simplifier ton code (notation, utilisation de variable
pour pas grand chose, etc..) et d'isoler ton bug. Sinon si mon code au
dessus, surtout que tu nous dis qu'en essayant à part la classe
FileReferenceList tu arrives à intercepter la propagation de Event.SELECT..
donc simplifie et cela marchera mieux à mon sens :)
EKA+ :)
Le 24 mai 2009 19:02, goabonga <[email protected]> a écrit :
>
> bonjour les codeurs , je me suis lancé dans l'écriture de petit outils
> utilisant les nouvelles propriété de l'objet FileReference ( data,
> save ) , très pratique , mais avants d'arriver jusqu'a ces deux
> methodes, je me suis retrouvé face a ce que je pourrais appeler un
> bug !
>
> je vous explique mais en code :
>
> package local.file {
>
> import flash.events.Event;
> import flash.events.IEventDispatcher;
> import flash.net.FileFilter;
> import flash.net.FileReference;
> import flash.net.FileReferenceList;
>
> /**
> * @author goabonga
> */
> public class AsFileSelector{
> //
> public static const TextFile : FileFilter = new
> FileFilter('Texte',
> '*.txt');
> public static const CsvFile : FileFilter = new
> FileFilter('Csv',
> '*.txt;*.csv');
> public static const JpgFile : FileFilter = new
> FileFilter('Image
> jpeg (*.jpg,*.jpeg)', '*.jpg;*.jpeg');
> public static const GifFile : FileFilter = new
> FileFilter('Image
> gif', '*.gif');
> public static const SwfFile : FileFilter = new
> FileFilter('Flash
> movie', '*.swf');
> public static const FlvFile : FileFilter = new
> FileFilter('Video
> flv', '*.flv');
>
> /**
> * AsFileSelector
> */
> public function AsFileSelector() {
>
>
> }
>
> /**
> *
> */
> public function select(multi : Boolean = false,filter :
> Array =
> null) : Boolean {
> var o : Boolean;
>
> if(multi) {
> trace('mode multi');
> o = multi_selector(filter);
> } else {
> trace('mode single');
> o = single_selector(filter);
> }
> return o;
> }
>
> /**
> *
> */
> private function single_selector(filter : Array ) : Boolean
> {
> var o : Boolean;
> if(filter != null) {
> trace('with filter : ' + filter);
> }
>
> var selector : FileReference = new FileReference();
> configureListeners(selector);
> o = selector.browse(filter);
> return o;
> }
>
> /**
> *
> */
> private function multi_selector(filter : Array ) : Boolean {
> var o : Boolean;
> if(filter != null) {
> trace('with filter : ' + filter);
> }
>
> var selector : FileReferenceList = new
> FileReferenceList();
> configureListeners(selector);
> o = selector.browse(filter);
> return o;
> }
>
> /**
> *
> */
> private function configureListeners(dispatcher :
> IEventDispatcher) :
> void {
> dispatcher.addEventListener(Event.SELECT,
> selectHandler);
> dispatcher.addEventListener(Event.CANCEL,
> cancelHandler);
> }
>
> /**
> *
> */
> private function cancelHandler(event : Event) : void {
> trace("cancelHandler: " + event);
> }
>
> /**
> *
> */
> private function selectHandler(event : Event) : void {
> trace('e : ' + event);
> if(event.target is FileReference) {
> var file : FileReference =
> FileReference(event.target);
> trace("selectHandler: name=" + file.name);
> } else {
> var files : FileReferenceList =
> FileReferenceList(event.target);
> trace("selectHandler: length=" +
> files.fileList.length);
> }
> }
> }
> }
>
>
>
>
>
>
> puis pour tester :
>
>
> package test {
> import local.file.AsFileSelector;
>
> import flash.display.Sprite;
> import flash.events.Event;
> import flash.events.KeyboardEvent;
> import flash.net.FileReferenceList;
>
> /**
> * @author goabonga
> */
> public class TestFileSelector extends Sprite {
>
> public function TestFileSelector() {
> var selector : AsFileSelector = new
> AsFileSelector();
> trace();
>
> var on_keydown : Function = function(e :
> KeyboardEvent):void {
> //press s
> if(e.keyCode == 83 ) {
> trace(selector.select());
> /**
> * mode single
> * true
> * e : [Event type="select"
> bubbles=false cancelable=false
> eventPhase=2]
> * selectHandler: name=Chris.jpg
> */
> }
> //press i
> if(e.keyCode == 73) {
> trace(selector.select(false,
> [AsFileSelector.JpgFile]));
> /**
> * mode single
> * with filter : [object FileFilter]
> * true
> * e : [Event type="select"
> bubbles=false cancelable=false
> eventPhase=2]
> * selectHandler: name=Chris.jpg
> */
> }
> //press m
> if(e.keyCode == 77 ) {
> trace(selector.select(true,
> [AsFileSelector.JpgFile]));
> /**
> * mode multi
> * with filter : [object FileFilter]
> * true
> */
> }
> //press t
> if(e.keyCode == 84 ) {
>
> var files : FileReferenceList = new
> FileReferenceList();
> var f : Function = function(e :
> Event):void {
> trace('e:' + e);
> trace('e:' + (e.target as
> FileReferenceList).fileList);
> /**
> * e:[Event type="select"
> bubbles=false cancelable=false
> eventPhase=2]
> */
> };
> files.addEventListener(Event.SELECT,
> f);
>
> files.browse([AsFileSelector.JpgFile]);
> }
> //press n
> if(e.keyCode == 78 ) {
> trace(selector.select(true));
> /**
> * mode multi
> * true
> */
> }
> };
>
> stage.addEventListener(KeyboardEvent.KEY_DOWN,
> on_keydown);
> }
> }
> }
>
>
>
>
> le truc que je ne comprend pas ? c'est que lorsque j'appelle m'a
> function :
> select(true pour le mode multiple , ...) ben je n'arrive pas a ecouter
> le Event.Select pourtant quand on regarde dans ma class permettant
> d'effectuer mes test si je lance un simple :
>
> var files : FileReferenceList = new FileReferenceList();
> var f : Function = function(e : Event):void {
> trace('e:' + e);
> trace('e:' + (e.target as FileReferenceList).fileList);
> /**
> * e:[Event type="select" bubbles=false cancelable=false eventPhase=2]
> */
> };
> files.addEventListener(Event.SELECT, f);
> files.browse([AsFileSelector.JpgFile]);
>
>
>
> tout fonctionne à merveille ?
> Voila j'espère que je n'ai pas dis n'importe quoi et que vous
> arriverez a me comprendre .
>
> @chris
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe Groupe "FCNG" de
Google Groupes.
Pour transmettre des messages à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour résilier votre abonnement à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour afficher d'autres options, visitez ce groupe à l'adresse
http://groups.google.com/group/FCNG?hl=fr
-~----------~----~----~----~------~----~------~--~---