質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

8472閲覧

C# undo redoについて

yuzusenbei

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/06/03 11:51

編集2016/06/03 12:34

C#でお絵かきソフトを作成しています。
undo,redo機能を実装したいのですが取り掛かりがわからずに困っております。
いろいろと調べてみたのですがどのようにコードを組み込めばよいのかがわかりません。
よろしくお願いいたします。
現在、自由線描画、直線描画、全消去、保存、読み込み機能があります。

マウス操作の前後でundo,redoを行いたいと思っております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちわ

undo/redo を実装するなら、スタンダードかどうかわかりませんが、僕の方法をつたえます。

ツール関連の処理で実装するなら、ドットを打つ、という動作をコマンドとして実装しましょう。
そうすれば、コマンドのログを取っていればundo/redoは簡単にできると思います。
他にも、ラインを引くなど、基本的な機能はコマンドにして、それのログを取って戻れるようにすれば
実装できるとおもいます。もちろん、コマンドとともに変更前のデータも保存しないとダメですが。
そこは工夫して保持するデータを考えてみてください。

あ、データの保存は「スタック」します。
この言葉が判らない場合は、ググってください。

投稿2016/06/04 18:21

編集2016/06/04 18:23
mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例えばIUndoableと言うインターフェースを作成します。
これはDoメソッドとUndoメソッドを持ちます。

そして直線を引くためのDrawLineオブジェクトを作成します。これは上記インターフェースを実装します。

上記オブジェクトのDoメソッドを呼ぶと、描画すべき位地の現在の画像を切り取って保存し、その上で直線を描画します。
メモリ使用量を少なくしようと思えば本当に必要な部分だけ保存するよう工夫が必要ですが、取りあえず直線を含む最小の長方形を保存するのが一番簡単ですので、まずはそれで組み立てていくといいでしょう。

そしてUndoメソッドを呼ぶと、保存した元の画像を描画します。

このようなオブジェクトを描画タイプの数だけ用意します。

スタックを二つ用意し、片方をアンドゥスタック、片方をリドゥスタックとします。

ユーザーの指令で描画するときにはリドゥスタックをクリアし、オブジェクトのDoメソッドを呼んでアンドゥスタックにプッシュします。

アンドゥするときにはアンドゥスタックからオブジェクトをポップし、Undoメソッドを呼び、リドゥスタックにプッシュします。

リドゥするときにはリドゥスタックからポップし、Doメソッドを呼び、アンドゥスタックにプッシュします。

投稿2016/06/04 05:02

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2016/06/04 05:47

もしユーザーへの逐次表示のことでお困りなら加えてListenというメソッドを追加されるとよろしいかと。 Listenを実行すると、変更前の画像全体を保存するようにします。そしてユーザーのマウス操作に応じて描画しつつその記録を取ります。 確定したら画像を一度元に戻します。 その後、Doメソッドを呼びます。Doメソッドは得られた記録に基づいて(直線の場合は両端の座標)描画します。
guest

0

デザインパターン undo redo
で google 検索すると、いろいろ情報が得られるとおもいます。

検索結果例:

...
Memento
いわゆる、Undo/Redo に使われるパターンなのだが、
...

投稿2016/06/03 13:19

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

操作されたことをログ(List(T))に記録しておいて巻き戻すとか

投稿2016/06/03 12:36

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問