3

flex builder 4.5では、 cacooのようなプロジェクトに取り組んでいます。アプリケーションを再度開いたdiagrams(display object,ui components,text)後にアクセスできる場所よりも、アプリケーションを閉じる前に保存したい。

より明確: -ユーザーがこのプロジェクトのいくつかの UML ダイアグラムを編集し、後で編集するために保存してアプリケーションを閉じた場合。数日後、以前に保存したダイアグラムを編集したいと考えています。 将来の編集のためにこのダイアグラムを保存する方法を教えてください。

4

3 に答える 3

1

保存/開くダイアログが機能する場合は、FileReferenceAPIを使用できます。これを行う前に、 //オブジェクトへのString/からの状態のシリアル化/逆シリアル化を実装する必要があります。ByteArrayXML

private var fileReference:FileReference;

// due to security restrictions, this method must be called from an
// event handler that responds to a user event (mouse click or key
// press), otherwise it will fail.

private function saveState(serializedState:*, fileName:String):void {
    fileReference = new FileReference();

    fileReference.addEventListener(Event.COMPLETE, onSaved);
    fileReference.addEventListener(IOErrorEvent.IO_ERROR, onSavingError);

    try {
        fileReference.save(serializedState, fileName); // will open save dialog
    } catch (e:Error) {
        trace("error saving data: " + e.toString());
        freeListeners();
    }
}

private function onSaved(e:Event):void {
    trace("saved!");
    freeListeners();
}

private function onSavingError(e:ErrorEvent):void {
    trace("error saving data: " + e.toString());
    freeListeners();
}

private function freeListeners():void {
    fileReference.removeEventListener(Event.COMPLETE, onSaved);
    fileReference.removeEventListener(IOErrorEvent.IO_ERROR, onSavingError);
}

同様に、状態を復元します(、、FileReference.browse()次にを使用しますFileReference.load())。

ダイアログなしでアプリの状態を保存/復元する必要がある場合は、おそらくAIRを使用する必要があります(またはSharedObject、Raja Jaganathanが提案したように)。ただし、ユーザーが別のシステムでダイアグラムを再度開くことができるようにする必要があるため、そうではないようです。これを実現するには、ユーザーが自分の作業を適切な場所に保存できるようにする必要があります。そうすれば、後でユーザーはそれを別のマシン/システムに移動して、アプリケーションで再度開くことができます。

もう1つの方法は、すべてをサーバーに保存し、保存されたファイルのリストをユーザーに提供することです(Cacooのように)。このようにすると、対応するサーバー側APIを実装する必要があります。それはRESTAPIまたはRTMPサーバーのようなsmthである可能性があります。REST APIの場合は、を使用FileReference.upload()してデータをサーバーにアップロードし、データをURLLoader.load()取得します。

于 2013-02-12T10:48:28.533 に答える
1

Sprite または MovieClip のその他の DisplayObject オブジェクトは直接シリアル化できません。したがって、オブジェクト情報 (原点 x、y、幅、高さ、色、子情報...) を保存する必要があります。ByteArray または Array または Dictionary を使用して ...そしてそれを ShareObjects に保存します。後で ShareObject からロールバックし、元のオブジェクトを再作成します。MovieClip または Sprite の適切な目的はコンテナーです。

これが私のテストコードです。

1. ムービークリップを作成します。目的はコンテナです。

ここに画像の説明を入力

2. グラフィックスを使用して長方形を描きます。そして座標を設定します。

var drawWidth:Number = 500;
var drawHeight:Number = 300;

var rect:MovieClip = new MyRect();
rect.graphics.beginFill(0xffffff*Math.random(),1);
rect.graphics.drawRect(0,0,drawWidth,drawHeight);
rect.graphics.endFill();
rect.x= 300;
rect.y= 100;

3. 配列に情報を格納します。

var myRectInformation:Array = new Array();
myRectInformation.push(rect.x);
myRectInformation.push(rect.y);
myRectInformation.push(drawWidth);
myRectInformation.push(drawHeight);
var bmd:BitmapData = new BitmapData(rect.width, rect.height,true,0);
bmd.draw(rect);
//is byteArray.
myRectInformation.push(bmd.getPixels(new Rectangle(0,0,bmd.width,bmd.height)));

4. SharedObjects、配列に保存します。

var mySaveData:SharedObject = SharedObject.getLocal("myStorage")
mySaveData.data.myRectInformation = myRectInformation;
mySaveData.flush();

5. これは、格納された SharedObject データからロードされます。オブジェクトを再作成します。

var rect:MovieClip = new MyRect();
var loadBmd:BitmapData = new BitmapData(mySaveData.data.myRectInformation[2], mySaveData.data.myRectInformation[3], true, 1);
loadBmd.setPixels(new Rectangle(0,0,loadBmd.width,loadBmd.height), mySaveData.data.myRectInformation[4]);
var bmp:Bitmap = new Bitmap(loadBmd);
rect.addChild(bmp);
rect.x = mySaveData.data.myRectInformation[0];
rect.y = mySaveData.data.myRectInformation[1];
addChild(rect);
于 2013-02-12T12:01:20.593 に答える
1

後で使用できるように、ダイアグラムのすべての状態を保持する1つのクラスを作成する方が良いため、SharedObjectを介してダイアグラムの状態を保存できます

http://livedocs.adobe.com/flex/3/html/help.html?content=lsos_5.htmlを使用した SharedObject

registerClassAlias共有オブジェクトに格納されているカスタム クラスに使用できます。

myClassInstance = new MyClass();
myClassInstance.x = 100;
myClassInstance.y = 100;
myClassInstance.text = "diagrams";

registerClassAlias("com.path.to.MyClass", MyClass);
myStuff = SharedObject.getLocal("myAppStuff");
myStuff.data.whatINamedIt = myClassInstance;
myStuff.flush();

今それを取り戻すとき...あなたは言うことができます:

myStuff = SharedObject.getLocal("myAppStuff");
var mySavedClass:MyClass = myStuff.data.whatINamedIt as MyClass;

mySavedClass インスタンス値を読み取り、再度開いたときにダイアグラム モデルに挿入します。

アプリ終了イベントを実装する

http://www.flexer.info/2007/10/25/fabridge-warn-on-flex-application-exit/

于 2013-01-03T10:41:28.387 に答える