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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

4回答

4597閲覧

【C言語】テキストエディタの「戻る(UNDO)」を、複数回可能にしたい

nnahito

総合スコア2004

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2015/11/27 18:11

前提

Windowsで動作する、テキストエディタのようなものを作っています。
言語が特殊なため、一番近いC言語での質問をさせていただいております。
少し内容が違いましたら訂正をしますので、ご指摘ください。

質問(結論)

通常のWindowsの所有するEditBoxでのUndo処理では、1度しかUndoできません。
これを複数回処理をさせようとすると、どのような流れになるかを知りたいです。

質問の詳細(考えたこと)

例えば10回まで戻せるようにするには、
0. 10個の配列変数を用意
0. EditBoxの変更通知を取得
0. 変更通知が来たら変数にEditBoxの中身を格納
0. Undo処理が来たら、変数の内容をEditBoxに描画
と、思ったのですが、英語などではこれが通用しません。

例えば、
「aaaaaaaaaa」
としてしまえば、Undoを一回すると、
「aaaaaaaaa」
もう一回すると
「aaaaaaaa」
のようになってしまいます。(多分)

このようなものを、どのように回避すればいいのでしょうか?

ご存じの方がいらっしゃいましたら、ご教授願います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

操作毎に全てのテキストを丸ごと退避するのは非効率なので、Undo処理では「どんな操作をしたか」という情報を記録します。

EditBoxでできる程度のことであれば、

  • 置き換え位置
  • 置き換え前の文字列(挿入の場合は空文字列)
  • 置き換え後の文字列(削除の場合は空文字列)

これらを何か入力があるたびに記録すれば良いと思います。そして、Undo処理では逆の処理(置き換え位置にカーソルを戻して置き換え後の文字列を置き換え前の文字列で置き換える)をすることになります。

その上で、

のようになってしまいます。(多分)

このようなものを、どのように回避すればいいのでしょうか?

どのようにしたいのかを書いていただかないと判らないのですが……。
1文字ずつではなく連続した英字はひとまとめで処理したいということでしょうか?
であれば、Undoする際、置き換え後が英字なら連続してUndoするということで対処できると思います。

投稿2015/11/28 00:36

catsforepaw

総合スコア5938

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

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

Chironian

2015/11/28 01:25

> 1文字ずつではなく連続した英字はひとまとめで処理したいということでしょうか? なるほど、きっとnnahitoさんが聞きたかったことはここですね。 Wordは結構大きく戻りますが、秀丸エディタは操作単位です。 nnahitoさんが普段使っているUndoシステムは単語単位で戻るのかも。 > Undoする際、置き換え後が英字なら連続してUndoするということで対処できると思います。 ですね。
nnahito

2015/12/02 08:10

まさに 「Undoする際、置き換え後が英字なら連続してUndoするということで対処できると思います。」 これでした. ありがとうございます!
guest

0

通常のUndoなら、

例えば、
「aaaaaaaaaa」
としてしまえば、Undoを一回すると、
「aaaaaaaaa」
もう一回すると
「aaaaaaaa」
のようになってしまいます。(多分)

は、適切な動作のように見えますが、何が問題なのでしょうか?

例えば、a b cと1文字ずつ入力すると、エディット・ボックスの中身は
「a」→「ab」→「abc」
のように変化し、この状態でUndoを2回押すと
「ab」→「a」
と戻るってことですよね?

そうであれば、基本的には1.~4.の処理で問題ないように見えます。

投稿2015/11/28 00:32

Chironian

総合スコア23272

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

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

nnahito

2015/12/02 08:10

ご回答有り難うございます. 流れは間違っていなかったようで良かったです. このように実装を続けていこうと思います.
guest

0

こういった機能の実装は、パターンが確立されています。
google で "undo 実装" などで検索してみるとよいです。

検索例:

...
Commandパターン
Commandとは「命令」とか「指示」という意味ですが、このパターンは命令自体をオブジェクト化してしまおうというパターンです。

一連の命令をオブジェクト化することでUndo、Redo機能も実装できてより柔軟に処理順序をを形成することができます。
...

投稿2015/11/27 21:46

katoy

総合スコア22324

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

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

nnahito

2015/12/02 08:11

ご回答有り難うございます. たくさんの参考サイトありがとうございます. いろいろ読ませていただきました! (そしてJavaで撃沈しました……Java,ダメなんですorz)
guest

0

要件がよくわかりませんが、undo を過去何度も遡って使いたいという要件であれば、秀丸エディタを常駐で実行すれば、クリップボード履歴が使えるので、それを活用した方が安上がりのような気がします。

投稿2015/11/27 21:30

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問