6

前のタスク/追加/変更を元に戻す関数を作成する必要があります。Borland C++ でこれを行うにはどうすればよいですか?

(プログラムは、「リスト」を使用してテキストの文字列をテキスト ファイルに保存します。作成した保存関数を使用しない限り、保存されてから消去されます。)

ちなみに、単純なコンソール アプリケーションで元に戻す機能を作成するつもりでした。

4

6 に答える 6

16

もう一つお答えしますが、今のところ取材が不十分だと思います。

主題は些細なことではなく、グーグルで検索するとかなりの数の結果が返されます。多くのアプリケーションは「元に戻す」操作を実装しており、多くのバリエーションがあります。

ここで役立つ2つのデザインパターンがあります。

  • Command:それは行動の具体化です
  • Memento:状態の保存で構成されます(通常、何らかの形式のシリアル化を意味します)

Commandアクションを実行するには通常さまざまな方法があるため、このパターンはグラフィック環境で頻繁に使用されます。たとえば、MicrosoftWordで保存することを考えてみてください。

  • 保存アイコンをクリックできます
  • [ファイル]メニューに移動して、[保存]をクリックします
  • ショートカット、通常はCTRL+Sを使用します

そしてもちろん、saveはおそらくsaveasの観点から実装されています。

Commandここでのパターンの利点は2つあります。

  • オブジェクトのスタックを作成できます
  • undoすべてのオブジェクトに操作を実装するように依頼できます

さて、以下に固有のさまざまな問題がありますundo

  • 一部の操作は元に戻せません(たとえば、rmLinuxでは空のゴミ箱アクション、Windowsでは空のゴミ箱アクションを検討してください)
  • 一部の操作は元に戻すのが難しいか、自然ではない場合があります(いくつかの状態を保存する必要があり、オブジェクトは通常破棄されますが、ここでは実際に元に戻すアクションのコマンド内に保存する必要があります)
  • 一般に、元に戻す/やり直しをスタックと見なします。一部のソフトウェア(主にグラフィックス)は、後で行われたことを実際に元に戻すことなくアイテムを元に戻すことを提案します。これは、特に新しいアクションが上に構築されている場合、達成するのがはるかに困難です。 to-undo one .. ..

さまざまな問題があるため、さまざまな戦略があります。

  • 単純なコマンドの場合、元に戻すの実装を検討できます(たとえば、文字を追加すると、削除することで元に戻すことができます)
  • より複雑なコマンドの場合は、元に戻るを以前の状態に復元するように実装することを検討してください(ここでMementoキックインします)
  • 複雑なコマンドがたくさんある場合、つまりMementoスペースを消費するsがたくさんある場合は、10または20コマンドごとに1つのスナップショットを記憶し、最新のスナップショットから元に戻すまでコマンドをやり直すというアプローチを使用できます。指図

実際、システムの詳細、したがってどちらかの複雑さに応じて、おそらく混合Commandして余暇を過ごすことができます。Memento

最初に実行された最後のアクションを元に戻すことだけを検討します(その後、アクションのスタックを使用します)。ユーザーが望むアクションを元に戻す機能は、はるかに複雑です。

于 2010-04-30T17:04:36.460 に答える
13

元に戻すを実装するには、アプリケーションで「アクション スタック」を作成する必要があります。ただし、次の 2 つの基本的なアプローチがあります。

  1. ベースライン (ファイルが最後に保存されたとき、またはファイルが作成されてから) を知っていると、行われたすべての変更を覚えているので、何かを元に戻す必要がある場合は、「一番上の」アイテムを破棄して現在のアイテムを再生成するだけです。ベースラインとすべての変更からのビュー。「やり直し」をクリックすると、そのアイテムがスタックに戻されます。これには、他の元に戻す/やり直しオプションを台無しにすることなく、スタック内の任意の項目を簡単に削除できるという副次的な利点があります。

  2. アクションごとに、以前の状態に加えられた変更と、元に戻す場合に以前の状態を復元するために必要な変更を保存します。ユーザーが「元に戻す」をクリックすると、「元に戻す」手順が実行されます。「やり直し」をクリックすると、行った変更を再適用します。場合によっては、「元に戻す」手順が「以前はこんな感じだった」ということになりますが、ユーザーがスタックの一番上にないアイテムを削除できるようにしてから、上の何かを削除する必要がある場合は、大混乱を引き起こす可能性があります。それ。

適切な選択は、持ち運べる/持ち運べるデータの量など、多くの要因によって異なります。オプション #1 はある意味では簡単ですが、アクション スタックが大きい場合、元に戻すのが非常に遅くなる可能性があります。

于 2010-04-30T16:41:06.437 に答える
5

Command Patternを確認してください。

別の参照:元に戻す機能にコマンド パターンを使用する

于 2010-04-30T16:31:07.630 に答える
4

memento パターンも参照してください。操作を元に戻すためにコマンドに組み込まなければならないインテリジェンスがかなり複雑になる場合があります。たとえば、ペイント プログラムでオブジェクトを描画します。メメントを保存してから、そのメメントから復元してアンドゥを実装する方が簡単な場合があります。

于 2010-04-30T16:36:41.510 に答える
2

状態のスナップショットを保存できます。状態は、アクションが変更できるデータのセットです。[元に戻す] をクリックすると、現在の状態が以前の状態に置き換えられます。特に状態が複雑な場合、実際には簡単な作業ではありません。

于 2010-04-30T16:31:25.830 に答える
0

私は最近、そのテーマについて実験しています。バイナリ互換性が必要ない場合は、https://github.com/d-led/undoredo-cppを確認してください。

于 2012-06-07T12:38:52.330 に答える