2016-04-13 9 views
0

Ich versuche, einen Dateidialog mit file.browseForOpen zu öffnen. Meistens funktioniert es aber in der sehr seltenen Situation (wie in Meetings) erscheint der Dateibrowser einfach nicht und blockiert nicht (wie ein Modal).Warum kann browseForOpen den Dateidialog nicht anzeigen, aber behaupten, dass er geöffnet ist, wenn er aufgerufen wird?

Wenn ich den Knopf drücke, der den Code an diesem Punkt aufruft, erhalte ich einen Fehler, der besagt, dass "es nur eins geben kann".

Es gibt keine Unterfenster und ich kann den Dialog nicht finden, auch nachdem das Hauptfenster minimiert wurde, aber der Fehler besteht darauf, dass er offen ist. Ich habe einen Code geschrieben, der die Schaltfläche deaktiviert hat, wenn der obige Code aufgerufen wird, und ihn dann bei jedem der Ereignisse aktiviert, aber wenn dieser Fehler auftritt, wird die Schaltfläche dauerhaft deaktiviert.

Es gibt weitere 10.000 Codezeilen, von denen einige auch dann noch laufen, wenn der Dateibrowser geöffnet ist. Keiner von ihnen scheint mit dem Dateibrowser verwandt zu sein, also habe ich den folgenden Code in ein neues Projekt verschoben, um ihn zu testen, und konnte den Fehler nicht replizieren.

var filter:FileFilter = new FileFilter("Image/Video", "*.jpg;*.png;*.mp4;"); 
var imagesFilter:FileFilter = new FileFilter("jpg/png", "*.jpg;*.png"); 
var docFilter:FileFilter = new FileFilter("mp4", "*.mp4;"); 
var filters:Array = [filter, imagesFilter, docFilter]; 

var fileBrowser:File = File.userDirectory; 
fileBrowser.addEventListener(FileListEvent.SELECT_MULTIPLE, onFileSelected); 
fileBrowser.addEventListener(Event.CANCEL, clean); 
fileBrowser.addEventListener(IOErrorEvent.IO_ERROR, clean); 
fileBrowser.browseForOpen("Select Slides", filters); 

Kennt jemand alles, was mir von einer ‚Nadel im Heuhaufen‘ erschöpfende Suche retten könnte? Hat sonst noch jemand das gleiche Problem erlebt? Ich konnte keine Lösungen finden, wenn ich suche "Dateidialog öffnet sich, aber ist nicht sichtbar" oder mehr als 30 Variationen dieser Suche einschließlich "Dateidialog öffnet sich nicht".

Gibt es schließlich eine Möglichkeit, den Dateidialog zu schließen, wenn ich feststelle, dass der Benutzer mit dem Hauptfenster interagiert, während er blockiert werden sollte? Genau wie eine Bandagefixierung sollte das Problem nicht gelöst werden (unterbricht den modalen Fluss, ich weiß, aber der modale Fluss ist zu diesem Zeitpunkt bereits gebrochen).

UPDATE:

Nach einer Klasse zu entfernen und durch einen weniger effizienten URLMonitor das Problem zu ersetzen scheint verschwunden zu sein. Wenn jemand herausfinden kann, was schief gelaufen ist, werde ich Ihre Antwort als vollständig markieren. Die Klasse entfernt schien ich völlig unabhängig, aber ich werde den Code zeigen:

package reuse.Network 
{ 
    import flash.desktop.NativeApplication; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.IOErrorEvent; 
    import flash.events.StatusEvent; 
    import flash.events.TimerEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
    import flash.utils.Timer; 

    import air.net.URLMonitor; 

    [Event(name="networkStatusChanged", type="reuse.Network.CheckInternetEvent")] 
    public class NetStatusMonitor extends EventDispatcher 
    { 
     private var url:String; 
     private var urlMonitor:URLMonitor; 

     public function NetStatusMonitor(url:String = 'http://www.adobe.com') 
     { 
      super(); 
      this.url = url; 
     } 

     protected function onNetwork_ChangeHandler(event:Event):void 
     { 
      checkWebsite(url, dispatchStatus); 
     } 

     /** 
     * Checks a specific website for connectivity. 
     * @param uri URI of the website to check for a response from 
     * @param result Function which accepts a bool as a response. 
     * @param idleTimeout How many milliseconds to wait before timing out 
     */ 
     public function checkWebsite(uri:String, result:Function, idleTimeout:Number = NaN):void 
     { 
      var timeout:Timer; 
      var request:URLRequest = new URLRequest(uri); 

      if(!isNaN(idleTimeout)) 
      { 
       request.idleTimeout = idleTimeout; 

       timeout = new Timer(request.idleTimeout + 1000, 1); 
       timeout.addEventListener(TimerEvent.TIMER_COMPLETE, failed); 
       timeout.start(); 
      } 

      var loader:URLLoader = new URLLoader(); 
      loader.dataFormat = URLLoaderDataFormat.TEXT; 
      loader.addEventListener(Event.COMPLETE, complete); 
      loader.addEventListener(IOErrorEvent.IO_ERROR, failed); 
      loader.load(request); 

      function complete():void 
      { 
       result(true); 
       cleanup(); 
      } 

      function failed(e:*):void 
      { 
       result(false); 
       cleanup(); 
      } 

      function cleanup():void 
      { 
       if(timeout) 
       { 
        timeout.stop(); 
        timeout.removeEventListener(TimerEvent.TIMER_COMPLETE, failed); 
        timeout = null; 
       } 

       loader.close(); 
       loader.removeEventListener(Event.COMPLETE, complete); 
       loader.removeEventListener(IOErrorEvent.IO_ERROR, failed); 
       loader = null; 
      } 
     } 

     public function start():void 
     { 
      checkWebsite(url, dispatchStatus, 5000); 

      if(!NativeApplication.nativeApplication.hasEventListener(Event.NETWORK_CHANGE)) 
       NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetwork_ChangeHandler); 

      if(urlMonitor == null) 
      { 
       var request:URLRequest = new URLRequest(url); 
       urlMonitor = new URLMonitor(request); 
       urlMonitor.pollInterval = 30; 
      } 

      if(!urlMonitor.hasEventListener(StatusEvent.STATUS)) 
       urlMonitor.addEventListener(StatusEvent.STATUS, onNetStatus_ChangeHandler); 

      if(!urlMonitor.running) 
       urlMonitor.start(); 
     } 

     public function stop():void 
     { 
      if(urlMonitor) 
      { 
       if(urlMonitor.running) 
        urlMonitor.stop(); 

       if(urlMonitor.hasEventListener(StatusEvent.STATUS)) 
        urlMonitor.removeEventListener(StatusEvent.STATUS, onNetStatus_ChangeHandler); 

       urlMonitor = null; 
      } 
     } 

     private function onNetStatus_ChangeHandler(event:StatusEvent):void 
     { 
      dispatchStatus(urlMonitor.available); 
     } 

     private function dispatchStatus(status:Boolean):void 
     { 
      dispatchEvent(new CheckInternetEvent(CheckInternetEvent.NETWORK_STATUS_CHANGED, status)); 
     } 
    } 
} 

Wer mit Raja Jaganathan könnte diese Klasse erkennen von Adobe Air - Check for internet connection

Antwort

0

ich das Adobe als Bug geschrieben und die folgende Notiz war hinzugefügt, um es:

Alex Rekish

11.06.11 GMT + 00: 00 12. April 2016

Ich habe dieses Problem und eine Problemumgehung gefunden. Sie müssen Listener entfernen, erzwingen, Abbrechen und null durchlässigen Dateiobjekt, das Sie für browseForOpen-Methode.

previousBrowseFile.removeEventListener (Event.SELECT, fileSelected); previousBrowseFile.removeEventListener (Ereignis.CANCEL, fileCancelled); previousBrowseFile.cancel(); previousBrowseFile = null;