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;
}
我正在尝试在 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;
}