今回はログを記録し、再生する機能。
これを応用すればアンドゥとリドゥ、操作の記録と再生も可能に。
これに加えて、アプリの状態(スナップショット)の保存ができればさらに効率がよくなる。
ペイントツール プロトタイプ07。
WindowsApplication1.zip
起動はここからClickOnceで。ClickOnceはIE系で。
WindowsApplication1
操作
- 左ドラッグ(右でも可)
- 線を描く。
- ボタン(「Play」)
- 押すと描画を最初から再生。
概要
記録は文字列(Stringオブジェクト)で。
構文は適当に定義。再生時、文字列からオブジェクトを生成する処理のほうを構文に合わせて作った。
シリアライズ/デシリアライズで記録と再生をするにはログの要素に型付け(例えばクラス化)をしないと。
デシリアライズして得たオブジェクトを、全ての操作を心得ている「万能コントロールクラス」が解析、各処理を呼び出すような真似はちょっとアレなので、1操作あたり1つのオブジェクトにするようなCommandパターンが良いだろうか。
「Play」は最初にレイヤーの初期化をする。
最下層にあるレイヤーだけは白で塗りつぶさなければならないので、レイヤーごとに背景色を持つように定義。
レイヤー生成時にこの背景色が決まるようにした。
Commandパターンと言えば、以前に操作1つを表すコントロールクラスをCommandにして、UIの操作ごとにCommandを生成する仕組みにしたことがある。*1
Commandは並列処理されるが、操作が他の操作を内包している場合(複数の操作をまとめたような操作なども)、操作から別の操作を呼ぶ…つまりCommandが別のCommandを生成することで順次処理も実現している。
でも、これは順序立てて並ぶべきものを入れ子構造で表していることになる。
プログラミング言語での手続き呼び出しと同じだし別に良いんだけど、順次処理するキュー*2と並列処理するキュー*3を用意したほうが分かりやすくて良い。今度実装するならこの方法を。
*1:http://maglog.jp/pmint/index.php?module=FileLoad&action=Load&mid=1389&cnd=0&fname=7000021429600uf.lzh
*2:…を持つInvokerのこと。
*3:…を持つInvokerのこと。