2009-03-31 9 views
4

私はC++でベクター描画を行い、sqliteを使用して元に戻す/やり直し機能をバックグラウンドさせるデスクトップアプリケーションを作成しています。元に戻す/やり直し機能のためにsqliteを利用するには?

誰かが元に戻す/やり直し機能のためにsqliteを使用していますか?どのようにあなたのために働くのですか?

明確化:

私は、スタックのアプローチを知っていたが、私もそのアプローチの1つのアプリケーションを実装しています。私が遭遇した問題は、しばらくしても維持するのが難しくなるということでした。

私がsqliteを利用することで意味していたことは、メモリ内のデータ構造全体をsqliteデータベースにマップし、sqliteでdiffとリビジョンを実行させることです。 メモリ内のデータベースを作成する場合、速度は問題ではありません。

それはアイデアだったし、それがうまくいくかどうかは疑問だった。

+0

これは過度のようです。通常の有界スタック/コマンドパターンのアプローチで何が問題になっていますか? –

+1

http://c2.com/cgi/wiki?AbstractionInversion –

+1

私はピートに同意します。スタックベースのアプローチから始めましょう。それが切断されない場合は、各コマンドにDBにシリアル化/デシリアライズする機能を与えます。しかし、実際には、あなたが何か本当に奇妙なことをやっていない限り、スタックベースのアプローチ*はそれをカットします。 –

答えて

10

SQLiteデータベースをアプリケーションのデータファイル形式にすると、元に戻す/やり直すことができます。 SQLiteトリガーでこれを行う方法については、the SQLite websiteを参照してください。

+0

私が15以上の評判を持っていれば、私はこの回答を投票したでしょう。 – lyxera

+0

GPLライセンスライブラリを使用していただければ、多くの作業をしているソース偽造プロジェクトがあります。 (私はまだそれを使用していない、私はちょうどドキュメントを読んで)。あなたはhttp://sourceforge.net/projects/sqlite-undo/でそれを見つけることができます – Eponymous

2

基本的に、アンドゥ/リドゥ機能は、スタックを使用して実装できます。ユーザーが操作を実行すると、操作の前後のデルタを表すオブジェクトがスタックにプッシュされます。デルタを「展開」します。ユーザーが行うすべての操作はスタック上に新しいデルタオブジェクトを作成するので、sqliteは遅すぎる可能性があるため、sqliteは選択したテクノロジではありません。元に戻す/やり直しの履歴をメモリに保存し、実際に元に戻す/やり直しの履歴を保存する場合にのみディスク上で線形化することを検討することをお勧めします。

+0

必ずしもグラフィックアプリケーションのための最良のアプローチではありません。最後の操作がすべてのピクセルを黒に変更したことを知っているだけでは、操作を取り消すことはできません。 –

+0

@mgbもちろん、そうではありません---しかし、それはどうにかするのではありません。最適化されていない実装には、ピクセルの色を変更する基本的な操作があります。デルタオブジェクトは3倍(X、Y、old_color)になります。新しい色に(X、Y)を変更すると、デルタ三連inclを押します。スタック上の古い色。後で元に戻すと、デルタオブジェクトがポップアップし、古い色が画面に書き戻されます。 1000x1000キャンバス上のすべてのピクセルを黒に設定すると、100万個のデルタオブジェクトが作成されます。実際には、もちろんグラフィックスプログラムはより最適化された方法でそれを行います。 –

+0

スタックを使用する代わりに、 "now"ポインタを持つキューを使用することもできます。これにより、キュー内で前後に移動する(つまり、キュー内の1つのオブジェクトを元に戻し、処理をやり直してアクションをやり直す)ことによって、取り消しとやり直しの両方の機能を簡単に実装できます。 – CodeFusionMobile

関連する問題