内置组件的Flex序列化,如... HBox,VBox,Panel,Canvas,DataGrid

时间:2010-08-13 22:21:01

标签: flex actionscript mxml object-serialization

这是问题......我正在开发一个flex应用程序(actionscript)......

我的应用程序中有一个Panel,其中包含2个按钮和3个画布组件,在某些情况下...现在我想将面板的当前状态存储在某个文件或数据库中......之后我想加载它当我回来并运行应用程序时,我的应用程序中的面板再次出现......

因此我尝试使用其readObject()和writeObject()方法将整个面板转换为ByteArray对象...但是当我读取ByteArray并使用addChild()方法在我的应用程序中添加面板时,它不会添加任何内容没有错误或错误...

writeObject创建了我能够打印的ByteArray但是当我把它拿回来并添加孩子时,我无法获得面板,而且它是孩子......

如果有人可以提供帮助......我们将不胜感激......先谢谢...

以下是示例代码...解释我想要做的事情......

<mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.rpc.events.ResultEvent;
        import mx.collections.ArrayCollection;

    [Bindable] private var photoFeed:ArrayCollection;

    var buffer:ByteArray;

    private function init():void{

        addEventListener(KeyboardEvent.KEY_DOWN, keyHandler);
        searchTerms.setFocus();
        buffer = new ByteArray();
    }

    private function keyHandler(event:KeyboardEvent):void{
        if(event.charCode == 13){

                    myButton.label = "Exit";

            try{
                buffer.writeObject(myData);

            }catch(error:Error){
                Alert.show(error.toString(),"Encoding Error");
            }

            removeChild(myData);
            reloadButton.visible = true;
            Alert.show("HBox is deleted","Alert");
        }
    }

    private function reloadHBox():void{

        Alert.show("Trying to load Hbox","Alert"); 
        try{
            buffer.position = 0;
            var obj:HBox = buffer.readObject() as HBox;

        }catch(error:Error){
            Alert.show(error.toString(),"Decoding Error");
        }

        addChild(obj);

        Alert.show("Hbox is reloaded","Alert"); 
    }

    ]]>
</mx:Script>

<mx:Button id="reloadButton" label="Reload HBox" visible="false" click="reloadHBox()"/>

<mx:HBox width="100%" id="myData">
    <mx:Label text="Hi Rashmin here..."/>
    <mx:TextInput id="searchTerms" name="searchTerms" text="Hello How are you?"/>
    <mx:Button id="myButton" label="Enter"/>
</mx:HBox>

我想重新生成HBox,所以需要一些帮助...

2 个答案:

答案 0 :(得分:1)

创意,但我并不感到惊讶它不起作用。你能分享一些代码吗?

那就是说,我只是编写一个算法来保存状态(x,y坐标/高度等等......)并在加载时重置该信息。

答案 1 :(得分:0)

您可以创建一个存储面板位置的对象

 private var positions:Object;
 positions = { panel1Position: new Point( panel1X , panel1Y)
                          //etc.... };

设置一些默认值,您的组件将从您的位置对象获取其位置。

  private function init():void
  {
     panel1.x = positions.panel1Position.x;
     //etc...
  }

要保存您的值,请使用SharedObject

 var objectName:String = "Put some identifier here";
 var sharedObject:SharedObject = SharedObject.getLocal( objectName , '/' );
 sharedObject.data.positions = positions;

要检索您的值,您只需要

 var sharedObject = SharedObject.getLocal( "the identifier you've set above" , '/' );
 positions = sharedObject.data.positions;

然后,您可以更新您的组件x&amp; y值。无论如何,这是一般的想法,更多信息检查SharedObject类:

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/

如果您可以使用整数标识每个状态,则可以对面板状态应用相同的原则,将状态整数保存在sharedObject中。