前のタスク/追加/変更を元に戻す関数を作成する必要があります。Borland C++ でこれを行うにはどうすればよいですか?
(プログラムは、「リスト」を使用してテキストの文字列をテキスト ファイルに保存します。作成した保存関数を使用しない限り、保存されてから消去されます。)
ちなみに、単純なコンソール アプリケーションで元に戻す機能を作成するつもりでした。
前のタスク/追加/変更を元に戻す関数を作成する必要があります。Borland C++ でこれを行うにはどうすればよいですか?
(プログラムは、「リスト」を使用してテキストの文字列をテキスト ファイルに保存します。作成した保存関数を使用しない限り、保存されてから消去されます。)
ちなみに、単純なコンソール アプリケーションで元に戻す機能を作成するつもりでした。
もう一つお答えしますが、今のところ取材が不十分だと思います。
主題は些細なことではなく、グーグルで検索するとかなりの数の結果が返されます。多くのアプリケーションは「元に戻す」操作を実装しており、多くのバリエーションがあります。
ここで役立つ2つのデザインパターンがあります。
Command
:それは行動の具体化ですMemento
:状態の保存で構成されます(通常、何らかの形式のシリアル化を意味します)Command
アクションを実行するには通常さまざまな方法があるため、このパターンはグラフィック環境で頻繁に使用されます。たとえば、MicrosoftWordで保存することを考えてみてください。
そしてもちろん、saveはおそらくsaveasの観点から実装されています。
Command
ここでのパターンの利点は2つあります。
undo
すべてのオブジェクトに操作を実装するように依頼できますさて、以下に固有のさまざまな問題がありますundo
:
rm
Linuxでは空のゴミ箱アクション、Windowsでは空のゴミ箱アクションを検討してください)さまざまな問題があるため、さまざまな戦略があります。
Memento
キックインします)Memento
スペースを消費するsがたくさんある場合は、10または20コマンドごとに1つのスナップショットを記憶し、最新のスナップショットから元に戻すまでコマンドをやり直すというアプローチを使用できます。指図実際、システムの詳細、したがってどちらかの複雑さに応じて、おそらく混合Command
して余暇を過ごすことができます。Memento
最初に実行された最後のアクションを元に戻すことだけを検討します(その後、アクションのスタックを使用します)。ユーザーが望むアクションを元に戻す機能は、はるかに複雑です。
元に戻すを実装するには、アプリケーションで「アクション スタック」を作成する必要があります。ただし、次の 2 つの基本的なアプローチがあります。
ベースライン (ファイルが最後に保存されたとき、またはファイルが作成されてから) を知っていると、行われたすべての変更を覚えているので、何かを元に戻す必要がある場合は、「一番上の」アイテムを破棄して現在のアイテムを再生成するだけです。ベースラインとすべての変更からのビュー。「やり直し」をクリックすると、そのアイテムがスタックに戻されます。これには、他の元に戻す/やり直しオプションを台無しにすることなく、スタック内の任意の項目を簡単に削除できるという副次的な利点があります。
アクションごとに、以前の状態に加えられた変更と、元に戻す場合に以前の状態を復元するために必要な変更を保存します。ユーザーが「元に戻す」をクリックすると、「元に戻す」手順が実行されます。「やり直し」をクリックすると、行った変更を再適用します。場合によっては、「元に戻す」手順が「以前はこんな感じだった」ということになりますが、ユーザーがスタックの一番上にないアイテムを削除できるようにしてから、上の何かを削除する必要がある場合は、大混乱を引き起こす可能性があります。それ。
適切な選択は、持ち運べる/持ち運べるデータの量など、多くの要因によって異なります。オプション #1 はある意味では簡単ですが、アクション スタックが大きい場合、元に戻すのが非常に遅くなる可能性があります。
Command Patternを確認してください。
memento パターンも参照してください。操作を元に戻すためにコマンドに組み込まなければならないインテリジェンスがかなり複雑になる場合があります。たとえば、ペイント プログラムでオブジェクトを描画します。メメントを保存してから、そのメメントから復元してアンドゥを実装する方が簡単な場合があります。
状態のスナップショットを保存できます。状態は、アクションが変更できるデータのセットです。[元に戻す] をクリックすると、現在の状態が以前の状態に置き換えられます。特に状態が複雑な場合、実際には簡単な作業ではありません。
私は最近、そのテーマについて実験しています。バイナリ互換性が必要ない場合は、https://github.com/d-led/undoredo-cppを確認してください。