2010-08-13 43 views
0

這裏的問題是...我工作的一個Flex應用程序(動作)......Flex的系列化像... HBox中,垂直框,面板,帆布,DataGrid中

我有一個面板內置組件在我的應用程序中包含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中所以需要一些幫助......

回答

1

創意的想法,但我並不感到驚訝這是行不通的。你能分享一些代碼嗎?

這就是說,我只是寫了一個算法來保存狀態(x,y座標/高度寬度等),並重置該信息,當你加載它。

+0

我已經更新了這個問題,並提供了一些示例代碼...解釋我想要做什麼...... – Rexo 2010-08-16 18:41:56

0

您可以創建一個存儲您的面板位置

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

設置一些默認值來啓動與對象,並從你的立場反對你的組件會得到他們的位置。

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

要保存你的價值觀,使用共享對象

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 & y值。無論如何,這是一般的想法,更多信息請檢查SharedObject類:

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

可以採用同樣的原則與面板的狀態,如果你能識別與例如整數每個狀態,保存你的sharedObject中的狀態整數。

+0

我認爲這樣我們可以保持確切的位置,但面板的孩子呢...我已經更新了問題,使其更清楚....謝謝反正... – Rexo 2010-08-16 18:37:46

+0

同樣的事情,當一個孩子被添加到面板中時,將位置座標保存在位置對象中,將它們分配給子面板ChildChild1.x = positions.panelChild1X,然後更新您的sharedObject值。如果所有職位都是相對於您的職位對象,那麼當應用程序重新加載時,所有內容都會立即恢復到原位。確保在遇到sharedObject問題時有默認情況!無論是將數據保存爲共享對象還是數據庫,原理都是一樣的。 – PatrickS 2010-08-17 00:07:25