AS3 将多个文本框数据保存并加载到本地文件

AS3 Save & Load multiple text boxs data to local file(s)

我正在尝试在 Flash (AS3) 中创建一个表单,它可以将来自多个动态文本框的数据/文本保存到用户指定的路径和本地文件中,并将任何已保存的表单加载回适当的文本框。我找到了一些关于如何使用单个文本框执行此操作的很好的示例。我知道它应该很简单,但我似乎无法弄清楚或无法成功 mod 现有示例来处理多个文本框?。有任何想法吗?

这是我目前正在使用/尝试使用的代码 mod。

package 
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.IOErrorEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFieldType;
import flash.text.TextFormat;
import flash.utils.ByteArray;
import flash.xml.XMLDocument;

public class BinaryXMLTool extends Sprite 
{

    // ** minimalist buttons **
    private var browseButton:TextField;
    private var saveButton:TextField;

    // ** minimalist editor **
    private var xmlText:TextField;

    // ** browse/load/save **
    private var xmlFile:FileReference;

    public function BinaryXMLTool():void 
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        // entry point
        stage.align         = StageAlign.LEFT;
        stage.scaleMode         = StageScaleMode.NO_SCALE;
        stage.showDefaultContextMenu    = false;

        // ** draw minimalist text editor **
        xmlText             = new TextField();
        xmlText.multiline       = true;
        xmlText.background      = true;
        xmlText.backgroundColor     = 0xEEEEEE;
        xmlText.type            = TextFieldType.INPUT;
        xmlText.width           = 400;
        xmlText.height          = 400;
        xmlText.border          = true;
        xmlText.x           = 15;
        addChild(xmlText);

        // ** draw minimalist browse button **
        browseButton            = new TextField();
        browseButton.autoSize       = TextFieldAutoSize.LEFT;
        browseButton.background     = true;
        browseButton.backgroundColor    = 0x000000;
        browseButton.defaultTextFormat  = new TextFormat("Tahoma", 14, 0xFFFFFF, true, null, null, null, null, null, 4, 4);
        browseButton.selectable     = false;
        browseButton.text       = "BROWSE";
        browseButton.x          = (stage.stageWidth - browseButton.width) * 0.5;
        browseButton.y          = 420;
        addChild(browseButton);

        // ** draw minimalist save button **
        saveButton          = new TextField();
        saveButton.autoSize     = TextFieldAutoSize.LEFT;
        saveButton.background       = true;
        saveButton.backgroundColor  = 0xAAAAAA;
        saveButton.defaultTextFormat    = browseButton.defaultTextFormat;
        saveButton.selectable       = false;
        saveButton.text         = "SAVE";
        saveButton.x            = (stage.stageWidth - saveButton.width) * 0.5;
        saveButton.y            = 460;
        addChild(saveButton);

        // ** button listeners **
        browseButton.addEventListener(MouseEvent.CLICK, on_buttonClick,     false, 0, true);
        saveButton.addEventListener(MouseEvent.CLICK, on_buttonClick, false, 0, true);
    }

    /**
    * handle browse or save
    */
    private function on_buttonClick(evt:MouseEvent):void
    {
        var btn:TextField = evt.target as TextField;
        if (btn)
        {
            if (btn.text == "BROWSE")
            {
                xmlFile = new FileReference();
                xmlFile.addEventListener(Event.SELECT, on_xmlSelect, false, 0, true);
                xmlFile.browse([new FileFilter("XML Documents","*.xml")]);
            }
            else if (btn.text == "SAVE")
            {
                if (xmlFile)
                {
                    if (xmlText.text.length)
                    {
                        // ** saving as binary **
                        var data:ByteArray = new ByteArray();
                        data.writeUTFBytes(xmlText.text);
                        data.compress();
                        new FileReference().save(data, "bin" + xmlFile.name);
                    }
                }
            }
        }

    }

    /**
    * handle browse, load XML file
    */
    private function on_xmlSelect(evt:Event):void
    {
        xmlFile.removeEventListener(Event.SELECT, on_xmlSelect);
        xmlFile.addEventListener(Event.COMPLETE, on_xmlComplete, false, 0, true);
        xmlFile.load();
    }

    /**
    * handle load, check if it is binary, uncompress, display XML in editor
    */
    private function on_xmlComplete(evt:Event):void
    {
        xmlFile.removeEventListener(Event.COMPLETE, on_xmlComplete);

        saveButton.backgroundColor = 0x000000;

        var data:* = FileReference(evt.target).data;
        if (data is ByteArray)
        {
            try
            {
                ByteArray(data).uncompress();
            }
            catch(e:Error)
            {
            }

        }
        data = XML(data);
        xmlText.text = data;
    }
}   
}

使用 Flash Player,您可以使用 FileReference/save()load() 保存和加载本地文件。但是,这需要用户选择文件位置,您无法控制它。

或者,您可以使用 SharedObject 在本地存储数据。这可能需要用户许可,并且可能会被用户清除(有意或无意),例如通过浏览器的 "clear local data" 功能。

使用AIR,可以使用File class无需任何用户交互即可读写本地文件,也可以使用EncryptedLocalStore.

(这个问题问的人很多,如果你搜索一下就会找到更多信息。)

编辑:

查看您发布的示例代码,它期望将 XML 字符串作为 zlib 压缩字节写入文件。在您的情况下,您希望将多个值保存到一个文件中。您可以通过简单地构造一个包含这些值的新 XML 对象,然后从 XML 对象中读回这些值来实现这一点。这是一个执行此操作的示例:

// Timeline instances
var textField1:TextField;
var textField2:TextField;
var saveBtn:SimpleButton;
var loadBtn:SimpleButton;

saveBtn.addEventListener(MouseEvent.CLICK, saveClick);
function saveClick(e:MouseEvent):void {
    // Save the state of both text fields
    save(textField1.text, textField2.text, "data.xml");
}

loadBtn.addEventListener(MouseEvent.CLICK, loadClick);
function loadClick(e:MouseEvent):void {
    load();
}

function save(text1:String, text2:String, defaultFileName:String):void {
    var xml:XML = <xml>
        <text1>{text1}</text1>
        <text2>{text2}</text2>
    </xml>;
    var file:FileReference = new FileReference();
    file.save(xml, defaultFileName);
}

function load():void {
    var file:FileReference = new FileReference();
    file.browse([new FileFilter("XML", "*.xml")]);
    file.addEventListener(Event.SELECT, loadSelect);
}

function loadSelect(e:Event):void {
    var file:FileReference = e.target as FileReference;
    file.addEventListener(Event.COMPLETE, loadComplete);
    file.load();
}

function loadComplete(e:Event):void {
    var file:FileReference = e.target as FileReference;
    var xml:XML = XML(file.data.readUTFBytes(file.data.bytesAvailable));

    // Assign the loaded XML text values back to the text fields
    textField1.text = xml.text1;
    textField2.text = xml.text2;
}