5

履歴を維持するためにflex4でUndoRedo操作を実装するにはどうすればよいですか?ダイアグラムを作成および編集するためにflexUIComponentおよびDisplayObjectsを使用していますが、flexではユーザーの操作履歴を直接処理する方法はありません。これを達成するためのアイデアはありますか?

4

3 に答える 3

5

executeメソッドとundoメソッドを使用して、すべてのアクションにコマンドパターンを実装し、それらをキューに入れることができます。

したがって、ユーザーが何かをしたい場合は、AddFiveToTotalクラスを作成して、次のように実行します。

public method execute():void{
     totalModel.add( 5 );
}

このクラスはFIFOキューに保存されます。

ユーザーが元に戻す必要がある場合、コマンドがポップされ、元に戻す関数が呼び出されます。

public method undo():void{
     totalModel.subtract( 5 );
}

やり直し可能性のために、ポップせず、キューを繰り返すだけです

Mementoパターンも見てください

現在人気のあるMVC(S)フレームワークのいずれかを使用している場合は、間違いなく、誰かがすでに作成したutilを見つけるでしょう。

于 2013-01-31T10:28:14.783 に答える
0

あなたはの助けを借りて達成することができますmemento pattern。すべてのプロパティをより適切に追跡することは困難です。プロパティが元に戻す/やり直し操作に使用する必要があるものを把握できます。

Mementoデザインパターン

Mementoパターン

ソースコード付きのデモサンプルhttp://www.flairpy.com/mementoPattern/MementoSample.html

于 2013-01-31T10:16:01.703 に答える
0

この問題に対処する方法はいくつかあります。まず、キャンバス全体の状態をVector(つまり、ユーザーがステージ上で実行できるすべてのことのリスナーを持ち、変更後に状態を保存する)に保持し、次に現在の状態のインデックスを保存して、次のことができるようにします。あなたの中を移動しVector、必要な状態をステージに置きます。これは元に戻す/やり直し機能にアプローチする最も簡単な方法ですが、オブジェクトのクローンをたくさん作成する必要があり、多くのオブジェクトまたは多くの元に戻すを処理する場合、これはメモリを大量に消費することになります。 /redos。

Vector2番目のアプローチは、そのベクトルで変更されたものだけを保持することです。これにより、多くのオブジェクトを作成して複製する必要はなく、変更されたすべてのプロパティとその最後の値を含む1つのオブジェクトのみを保存します。これにより、次のようなものが得られます。

private var mHistory:Vector.<Object> = new Vector.<Object>();
private var mCurrentIndex:int = -1;

public function storeState(state:Object)
{
   mHistory.push(state);
   mCurrentIndex++;
}     

public function undo():void
{
   if(mCurrentIndex < 1)
       return;

   mCurrentIndex--;

   //here you could test for values that could have changed
   var item:DisplayObject = this.getChildByName(mHistory[mCurrentIndex].name);
   if(mHistory[mCurrentIndex].x != undefined)
       item.x = mHistory[mCurrentIndex].x;
   // etc. you get the point. Note that this is only comfortable if only several things can change
}

そして、storeState関数の呼び出しは次のようになります。

var state:Object = { name:DisplayObjectName, x:120, y:20 };
storeState(state);

繰り返しますが、それらを記録したい場合は、すべての動きと変化に耳を傾ける必要があります。

于 2013-01-31T10:31:30.580 に答える