MESCIUS SPREAD for Windows Forms 17.0J > 開発者ガイド > 編集、検証、選択、フォーカス > アンドゥ/リドゥアクション |
アンドゥおよびリドゥ機能を追加すると、ユーザーはコントロールで実行したさまざまなアクションを元に戻すことができます。 これにはUndoActionクラスと、ユーザーのアクションに対応する各クラスを使用します。また、アンドゥおよびリドゥが可能なユーザーのアクションを追跡するマネージャクラスが用意されています。
SpreadViewクラスとFpSpreadクラスは、アンドゥおよびリドゥ機能を有効にするAllowUndoプロパティ、およびアンドゥマネージャを返すUndoManagerプロパティを提供しています。各SpreadViewオブジェクトは、それぞれがアンドゥマネージャを保有します。
UndoActionクラスはActionクラスを継承する抽象クラスで、UndoおよびSaveUndoStateメソッドをもちます。また、ActionクラスからPerformActionメソッドを継承しています。
UndoActionクラスを継承するクラスは、各メソッドに次の処理を実装しています。
メソッド | 処理 |
---|---|
PerformAction | アクションの実行 |
SaveUndoState | アンドゥ状態の情報(クラスの各フィールド)の保存 |
Undo | 各フィールドのアンドゥ状態情報を使用して、アクションを元に戻す |
UndoActionクラスを継承する各クラスは、1つの特定のアクション(セルの編集、列のサイズ変更、セル範囲の移動など)を実行し、このアクションを元に戻すように設計されています。このアクションを実行するための関連情報はすべて、オブジェクトのコンストラクタに渡します。また、このアクションをアンドゥするためのすべての関連情報は、SaveUndoStateメソッドで保存する必要があります。UndoActionオブジェクトが作成されると、このアクションの各変数は固定されます(コンストラクタに渡された各値によって確定)。たとえば、シート1のセルA1を編集して"test"という値に変更し、列Bのサイズを24ピクセルに変更し、セル範囲C4:F6をA1:D:3に移動したとします。この結果、アクションはこの特定の方法でしか実行されません。
UndoManagerクラスは、アンドゥおよびリドゥのスタックを管理します。このクラスは、実行されたアクション、元に戻されたアクション、およびその順序を追跡します。アクションをアンドゥするには、UndoManagerオブジェクトのPerformUndoActionメソッドを、引数にUndoActionを指定して実行します。このとき、UndoManagerはUndoActionをアンドゥスタックにプッシュし、UndoActionに対してPerformActionメソッドを呼び出します。これにより、UndoManagerオブジェクトのCanUndoプロパティがTrueを返します(アンドゥ可能なアクションが存在することを意味)。CanUndoプロパティがFalseを返す場合、アンドゥスタックが空であり、アンドゥ可能なアクションが存在しないことを意味します。この機能を使用すると、たとえば[編集]メニューの[アンドゥ]項目を無効にできます(アプリケーションに[編集]メニューが実装されている場合)。
アクションがアンドゥ可能なら、UndoManagerオブジェクトのUndoメソッドを実行できます。UndoManagerは最後に実行されたアクションをアンドゥスタックからリドゥスタックに移動し、このアクションのUndoメソッドを実行します。これにより、UndoManagerのCanRedoプロパティはTrueを返します(リドゥ可能なアクションが存在することを意味)。
CanRedoがFalseを返す場合は、リドゥスタックが空であり、リドゥ可能なアクションが存在しないことを意味します。 この機能を使用すると、たとえば[編集]メニューの[リドゥ]項目を無効にできます(アプリケーションに[編集]メニューが実装されている場合)。
アクションがリドゥ可能なら、UndoManagerオブジェクトのRedoメソッドを実行できます。UndoManagerは最後にアンドゥされたアクションをリドゥスタックからアンドゥスタックに移動し、このアクションのPerformActionメソッドを実行します。これにより、UndoManagerのCanUndoプロパティはTrueを返します。
アクションマップにおいて、いくつかのUndoActionクラスはActionオブジェクトを置き換えます。この結果、これらのアクションはUndoManagerを経由してアンドゥ可能となります。その他のUndoActionクラスはアクションマップでは使用されませんが、代わりにSheetViewまたはSpreadViewのコード内で使用され、アクションをアンドゥ可能にします。
UndoManagerのPerformUndoActionメソッドで、UndoActionを順次実行できます。実行したアクションと実行順序が記憶されるので、Undoメソッドでいくつかを元に戻したり、Redoメソッドでやり直すことが可能です(その後、さらにUndoメソッドでアンドゥすることも可能です)。
しかし、PerformUndoActionメソッドで新規のアクションを実行すると、リドゥスタック内で保留になっていたアクションはすべてクリアされ、CanRedoプロパティはFalseを返します。つまり、いったん新規アクションを実行した後は、Undoメソッドで元に戻したすべてのアクションはリドゥできなくなります。このため、UndoManagerクラスのPushUndoメソッドはフラグによって、アクションがアンドゥスタックにプッシュされた場合にリドゥスタックをクリアするかどうかを示します。
アクションマップにおいて、いくつかのUndoActionクラスはActionオブジェクトを置き換えます。この結果、これらのアクションはUndoManagerを経由してアンドゥ可能な状態となります。 その他のUndoActionクラスはアクションマップでは使用されませんが、代わりにSheetViewまたはSpreadViewコード内で使用され、アクションをアンドゥ可能な状態に設定します。
入力マップは、コントロールが既定で[Ctrl]+[Z]キー、および[Ctrl]+[Y]キーを割り当てるアクションを提供しています。これらのアクションはUndoActionオブジェクトを使用し、それぞれUndoManagerのUndoおよびRedoメソッドを実行します。