AS3保存和放大器;加载多个文本boxs数据,以本地文件(S) [英] AS3 Save & Load multiple text boxs data to local file(s)

查看:107
本文介绍了AS3保存和放大器;加载多个文本boxs数据,以本地文件(S)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建闪光灯(AS3)的一种形式,可以节省数据/文本从多个动态文本框的到用户指定的路径和放大器;本地文件和放大器;还加载任何保存的表单放回相应的文本框的。我已经找到了如何用一个文本框做了一些很好的例子。我知道这应该是简单的,但是我似乎无法推测出来或成功mod现有的例子多的文字boxs工作?有任何想法吗?

这里的code我目前使用/试图mod。

 包
{
进口flash.display.Sprite;
进口的flash.display.Stage;
进口flash.display.StageAlign;
进口flash.display.StageScaleMode;
进口对象类型:flash.events.Event;
进口flash.events.MouseEvent;
进口flash.events.IOErrorEvent在;
进口flash.net.FileFilter一个;
导入器flash.net.FileReference;
进口flash.net.URLLoader;
进口flash.net.URLRequest;
进口API元素flash.text.TextField;
进口flash.text.TextFieldAutoSize;
进口flash.text.TextFieldType;
进口flash.text.TextFormat用于;
进口flash.utils.ByteArray的;
进口flash.xml.XMLDocument;

公共类BinaryXMLTool扩展Sprite
{

    // **简约的按钮**
    私人VAR browseButton:文本字段;
    私人VAR saveButton:文本字段;

    // **简约编辑**
    私人VAR XMLTEXT:文本字段;

    // **浏览/加载/保存**
    私人VAR XMLFILE:的FileReference;

    公共职能BinaryXMLTool():无效
    {
        如果(阶段)的init();
        其他的addEventListener(Event.ADDED_TO_STAGE,INIT);
    }

    私有函数初始化(E:事件= NULL):无效
    {
        removeEventListener(Event.ADDED_TO_STAGE,INIT);

        // 入口点
        stage.align = StageAlign.LEFT;
        在Stage.scaleMode = StageScaleMode.NO_SCALE时;
        stage.showDefaultContextMenu = FALSE;

        // **绘制简约的文本编辑器**
        XMLTEXT =新的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);

        // **画简约的浏览按钮**
        browseButton =新的TextField();
        browseButton.autoSize = TextFieldAutoSize.LEFT;
        browseButton.background = TRUE;
        browseButton.backgroundColor = 0x000000处;
        browseButton.defaultTextFormat =新的TextFormat(宋体,14,0XFFFFFF,真实,NULL,NULL,NULL,NULL,NULL,4,4);
        browseButton.selectable = FALSE;
        browseButton.text =浏览;
        browseButton.x =(stage.stageWidth  -  browseButton.width)* 0.5;
        browseButton.y = 420;
        的addChild(browseButton);

        // **画简约保存按钮**
        saveButton =新的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);

        // **按钮听众**
        browseButton.addEventListener(MouseEvent.CLICK,on_buttonClick,假,0,真正的);
        saveButton.addEventListener(MouseEvent.CLICK,on_buttonClick,假,0,真正的);
    }

    / **
    *手柄浏览或保存
    * /
    私有函数on_buttonClick(EVT:MouseEvent)方法:无效
    {
        VAR BTN:文本字段= evt.target为文本字段;
        如果(BTN)
        {
            如果(btn.text ==浏览)
            {
                XMLFILE =新的FileReference();
                xmlFile.addEventListener(Event.SELECT,on_xmlSelect,假,0,真正的);
                xmlFile.browse([新的FileFilter(XML文档,)* XML。]);
            }
            否则,如果(btn.text ==SAVE)
            {
                如果(XMLFILE)
                {
                    如果(xmlText.text.length)
                    {
                        // **保存为二进制**
                        VAR数据:ByteArray的=新的ByteArray();
                        data.writeUTFBytes(xmlText.text);
                        data.com preSS();
                        新的FileReference()保存(数据,宾+ xmlFile.name);
                    }
                }
            }
        }

    }

    / **
    *手柄浏览,加载XML文件
    * /
    私有函数on_xmlSelect(EVT:事件):无效
    {
        xmlFile.removeEventListener(Event.SELECT,on_xmlSelect);
        xmlFile.addEventListener(引发Event.COMPLETE,on_xmlComplete,假,0,真正的);
        xmlFile.load();
    }

    / **
    *处理负载,检查它是否是二进制的,uncom preSS,在编辑器中显示XML
    * /
    私有函数on_xmlComplete(EVT:事件):无效
    {
        xmlFile.removeEventListener(引发Event.COMPLETE,on_xmlComplete);

        saveButton.backgroundColor = 0x000000处;

        VAR数据:* =的FileReference(evt.target).DATA;
        如果(数据字节阵列)
        {
            尝试
            {
                ByteArray的(数据).uncom preSS();
            }
            赶上(五:错误)
            {
            }

        }
        数据= XML(数据);
        xmlText.text =数据;
    }
}
}
 

解决方案

使用Flash播放器,你可以保存和使用加载本地文件的FileReference /保存()负载()。然而,这需要用户选择文件的位置,你有没有对其进行控制。

另外,您也可以在本地使用共享对象存储数据。这可能需要用户许可,并且它可以由用户(有意或无意地),例如通过他们的浏览器的清除本地数据功能。

被清除

使用AIR,您可以使用文件类读取和写入的本地文件,无需任何用户交互,或者您可以使用 EncryptedLocalStore

(这个问题被问了很多,如果你搜索周围,你会发现更多的信息。)

编辑:

看着你贴的例子code,它希望写一个XML字符串作为zlib的COM pressed字节到一个文件中。在你的情况,你想多值保存到一个文件中。你可以做到这一点通过简单地构建一个包含这些值的新XML对象,然后读取这些值回了XML对象。下面是做到这一点的例子:

  //时间轴实例
VAR textField1的:文本字段;
VAR textField2:文本字段;
VAR saveBtn:SimpleButton的;
VAR loadBtn:SimpleButton的;

saveBtn.addEventListener(MouseEvent.CLICK,saveClick);
功能saveClick(E:的MouseEvent):无效{
    //保存这两个文本字段的状态
    保存(textField1.text,textField2.text,data.xml中);
}

loadBtn.addEventListener(MouseEvent.CLICK,loadClick);
功能loadClick(E:的MouseEvent):无效{
    加载();
}

功能保存(文本1:字符串,文本2:字符串,defaultFileName:字符串):无效{
    VAR的xml:XML =< XML>
        <文本1> {文本1}< /文本1>
        <文本2> {文本2}< /文本2>
    < / XML取代;
    var文件:的FileReference =新的FileReference();
    file.save(XML,defaultFileName);
}

功能负载():无效{
    var文件:的FileReference =新的FileReference();
    file.browse([新的FileFilter(XML,*的.xml)]);
    file.addEventListener(Event.SELECT,loadSelect);
}

功能loadSelect(五:事件):无效{
    var文件:的FileReference = e.target为的FileReference;
    file.addEventListener(引发Event.COMPLETE,loadComplete);
    file.load();
}

功能loadComplete(五:事件):无效{
    var文件:的FileReference = e.target为的FileReference;
    VAR的xml:XML = XML(file.data.readUTFBytes(file.data.bytesAvailable));

    //指定加载的XML文本值回文本字段
    textField1.text = xml.text1;
    textField2.text = xml.text2;
}
 

I am trying to create a form in flash (AS3) that can save data / text from multiple dynamic text box's into a user specified path & local file & also load any saved forms back into appropriate text box's. I have found some great examples on how to do this with a single text box. I know it should be simple however I cannot seem to figure it out or successfully mod existing examples to work with multiple text boxs?. any ideas?

Here's the code i'm currently using / trying to 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;
    }
}   
}

解决方案

Using the Flash Player you can save and load a local file using FileReference/save() and load(). However, this requires that the user choose the file location, and you have no control over it.

Alternatively, you can store data locally using SharedObject. This may require user permission, and it may be cleared by the user (purposefully or accidentally), for example through their browser's "clear local data" feature.

Using AIR, you can use the File class to read and write local files without any user interaction, or you can use EncryptedLocalStore.

(This question gets asked a lot, if you search around you will find more information.)

EDIT:

Looking at the example code you posted, it's expecting to write an XML string as zlib compressed bytes to a file. In your case, you want to save multiple values to a single file. You could do this by simply constructing a new XML object that contains those values, then read those values back out of the XML object. Here's an example that does this:

// 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;
}

这篇关于AS3保存和放大器;加载多个文本boxs数据,以本地文件(S)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆