Гибкая сериализация для встроенных компонентов, таких как...HBox, VBox, Panel, Canvas, DataGrid
Вот в чем проблема... Я работаю над Flex-приложением (actionscript)...
У меня есть приложение в моем приложении, которое содержит 2 кнопки и 3 компонента холста при определенных возможностях... теперь я хочу сохранить текущее состояние панели в некотором файле или базе данных... и после этого я хочу снова загрузить ту же панель в мое приложение, когда я возвращаюсь и запускаю приложение...
поэтому я попытался преобразовать всю панель в объект ByteArray, используя методы readObject() и writeObject()... но когда я прочитал 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 ответа
Творческая идея, но я не удивлен, что это не работает. Можете поделиться кодом?
Тем не менее, я бы просто написал алгоритм для сохранения состояния (координаты x, y / ширина по высоте и т. Д.) И сбрасывал эту информацию при загрузке.
Вы можете создать объект, который хранит положение вашей панели
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 & y. В любом случае, это общая идея, для получения дополнительной информации проверьте класс SharedObject:
http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/
Вы можете применить тот же принцип к состояниям панели, если вы можете, например, идентифицировать каждое состояние целым числом, сохраните целое число состояния в вашем sharedObject.