2

4 つの編集ボックスとメモを含むフォームがあり、複数の取り消しのやり直しを実装する方法を理解しようとしています。たとえば、

したがって、ユーザーが編集 3、1、2、メモ、編集 4 でテキストを入力すると、逆の順序で元に戻し、元の順序でやり直したいとします。

ただし、注文を追跡する方法についてはよくわかりません。これに関する任意の助けをいただければ幸いです

Delphi 7 を使用しています

4

3 に答える 3

4

最も簡単な方法は、含まれているコントロールの変更をキャプチャし、4 つのコントロールすべての状態 (コンテンツ、選択、キャレット位置) を一緒に書き留めることです。すべての変更に対してこれを行うと、元に戻すスタックができます。操作を元に戻す必要がある場合は、すべてのコントロールを保存された状態に復元します。

このスキームは非常にリソースを消費する可能性があり、一度実装すると、特定のコントロールで行われた違いまたは最後の操作のみを保存して最適化することができます。問題は

(a) 標準の編集/メモでは正確に何が変更されたかについての情報は得られないため、何らかの方法で変更を計算する必要があります (たとえば、以前に記録された状態と比較するなど)。 " 初期状態からすべての変更の内容を確認し、現在の 1 の状態と現在の状態を比較して、変更を確認します。

(b) 標準コントロールは元に戻す操作自体を処理し、ユーザーは 1 つのコントロールを元に戻して、元に戻すスタックの順序を壊すことができます。

おそらく、サードパーティの編集/メモ コントロールを使用して、ニーズに対してより寛容で、元に戻す/やり直し操作を制御できるようにすることができます。たとえば、ElPack (現在は LMD Innovative が所有する LMD ElPack) 用の TElEdit コントロールを作成したことがありますが、そのコントロールには元に戻す/やり直しスタックがあり、そのソース コードのわずかな変更で TElEdit がどのように役立つかを知っています。TElEdit または他の同様のコンポーネントをチェックして、提供できるものを確認することをお勧めします。

于 2012-07-02T12:13:03.933 に答える
1

これにはコマンドパターンを使用します。すでにたくさんあるので、全体の概念を説明することはしませんが、良い例がここにあります。「コマンドパターンの元に戻す」を検索すると、他にもたくさんあります。

于 2012-07-04T03:23:24.810 に答える
0

TClientDataSet コントロールを mem ストレージとして使用し、4 つの tdbedit コントロールを使用します。TClientDataSet の復帰、undolastchange メソッドを参照してください。

于 2012-07-02T22:26:39.670 に答える