0

FileReference を使用してユーザーからファイルを読み取りました。選択したファイルの内容で初期化したい変数があります。セッターとゲッターを使用して Model クラスを作成します。ファイルの終わりに達したことを示すエラーがスローされるため、これは実際には機能しません。ファイルで変数を更新するにはどうすればよいですか? ありがとうございました。

public class Main extends Sprite 
{
    public var fr:FileReference;
    private var _model:Model;
    private var button:Sprite;

    public function Main():void 
    {   
        _model = new Model();
        _model.addEventListener(Model.VALUE_CHANGED, fileLoaded);
        trace(_model.getVariable());
    }
    protected function loadClicked(e:Event):void
    {
        fr = new FileReference();
        fr.addEventListener(Event.SELECT, fileSelected);
        fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]);
    }
    public function fileSelected(event:Event):void 
    {
        fr.addEventListener(Event.COMPLETE, fileLoaded);
        fr.load();
    }
    public function fileLoaded(event:Event):void
    {
        try
        {
            var content:ByteArray = fr.data;
            _model.setVariable(content.readUTFBytes(content.length));
        }
        catch (e:Error)
        {
            trace("Error");
        }
    }
}

public class Model extends EventDispatcher
{
    public static const VALUE_CHANGED:String = "value_changed";
    private var variable:String;
    public function Model() :void
    {

    }
    public function setVariable(newVar:String):void
    {
        variable = newVar;
        this.dispatchEvent(new Event(Model.VALUE_CHANGED));
    }
    public function getVariable():String {
        return variable;
    }
}
4

2 に答える 2

0

UTF バイトを読み取るときは、「content.bytesAvailable」を使用します。

于 2012-05-19T10:35:37.140 に答える
0

そこに間違いがあります:

_model.addEventListener(Model.VALUE_CHANGED, fileLoaded); 
// ...
fr.addEventListener(Event.COMPLETE, fileLoaded);

両方のイベントが同じハンドラーをトリガーすることに注意してください。
これは明らかにあなたが望んでいたものではありません。

ところで、readUTFBytes()新しくロードされた呼び出しは問題ByteArrayありませんが (位置は最初はゼロであるため)、通常はposition読み取り前に設定することをお勧めします。物事を明確にするためだけに。

var content:ByteArray = fr.data;
content.position = 0;
_model.setVariable(content.readUTFBytes(content.length));

コードの修正版:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.utils.ByteArray;

    [SWF(width="800", height="600")]
    public class Main extends Sprite 
    {
        public var fr:FileReference;
        private var _model:Model;
        private var button:Sprite;

        public function Main():void 
        {   
            _model = new Model();
            _model.addEventListener(Model.VALUE_CHANGED, valueChanged);
            stage.addEventListener(MouseEvent.MOUSE_DOWN, loadClicked);
            trace(_model.getVariable());
        }

        protected function valueChanged(event:Event):void
        {
            trace(_model.getVariable());
        }
        protected function loadClicked(e:Event):void
        {
            fr = new FileReference();
            fr.addEventListener(Event.SELECT, fileSelected);
            fr.browse([new FileFilter("JSON Files (*.json)", "*.json")]);
        }
        public function fileSelected(event:Event):void 
        {
            trace(event.type);
            fr.addEventListener(Event.COMPLETE, fileLoaded);
            fr.load();
        }
        public function fileLoaded(event:Event):void
        {
            trace(event.type);
            try
            {
                var content:ByteArray = fr.data;
                content.position = 0;
                _model.setVariable(content.readUTFBytes(content.length));
            } catch (e:Error) {
                trace("Error");
            }
        }
    }
}
于 2012-05-19T10:39:46.683 に答える