Share via


ドキュメント ロック ホルダーの管理

実行中のドキュメント テーブル (RDT) では、開いているドキュメントの数と、設定されているすべての編集ロックが保持されます。 ドキュメント ウィンドウで開いているドキュメントをユーザーに表示せずに、ドキュメントがプログラムによってバックグラウンドで編集されているときに、RDT でドキュメントに編集ロックを設定できます。 この機能は、グラフィカル ユーザー インターフェイスを使用して複数のファイルを変更するデザイナーによってよく使用されます。

ドキュメント ロック ホルダーのシナリオ

ファイル "a" はファイル "b" に依存している

ファイルの種類が "a" の標準のエディター "A" を実装し、種類が "a" の各ファイルに種類が "b" のファイルへの参照 (またはその依存) がある状況について考えてみます。 種類が "b" のファイルには、標準のエディター "B" が存在します。 エディター "A" でファイル "a" を開くと、対応するファイル "b" への参照が取得されます。 ファイル "b" は表示されませんが、エディター "A" では変更できます。 エディター "A" では、FindAndLockDocument メソッドからファイル "b" のドキュメント データへの参照を取得し、ファイル "b" の編集ロックも保持します。 エディター "A" でファイル "b" の変更が完了すると、UnlockDocument メソッドを呼び出すことによって、ファイル "b" の編集ロック数を減らすことができます。 パラメーター dwRDTLockType_VSRDTFLAGS.RDT_NoLock に設定して FindAndLockDocument メソッドを呼び出した場合は、この手順を省略できます。

ファイル "b" は別のエディターで開かれている

エディター "A" でファイル "b" を開こうとしたときに、これがエディター "B" によって既に開かれている場合は、次の 2 つの異なるシナリオを処理する必要があります。

  • ファイル "b" が互換性のあるエディターで開かれている場合は、RegisterDocumentLockHolder メソッドを使用して、エディター "A" ではファイル "b" に対してドキュメントの編集ロックを登録する必要があります。 エディター "A" でファイル "b" の変更が完了したら、UnregisterDocumentLockHolder メソッドを使用してドキュメントの編集ロックを登録解除します。

  • ファイル "b" が互換性のない方法で開かれている場合、エディター "A" によってファイル "b" を開こうとしたときに失敗させるか、エディター "A" に関連付けられているビューで部分的に開いて、適切なエラー メッセージを表示することができます。 エラー メッセージでは、互換性のないエディターでファイル "b" を閉じて、エディター "A" を使用してファイル "a" を再度開くようにユーザーに指示する必要があります。 また、Visual Studio SDK メソッド QueryCloseRunningDocument を実装して、互換性のないエディターで開いているファイル "b" を閉じるようにユーザーに求めることもできます。 ユーザーがファイル "b" を閉じると、エディター "A" でファイル "a" を開く処理は通常どおり続行されます。

ドキュメントの編集ロックに関するその他の考慮事項

エディター "A" がファイル "b" に対してドキュメントの編集ロックを保持する唯一のエディターである場合の動作は、エディター "b" もファイル "b" に対してドキュメントの編集ロックを保持している場合の動作とは異なります。 Visual Studio では、クラス デザイナーは、関連付けられたコード ファイルの編集ロックを保持しないビジュアル デザイナーの例です。 つまり、ユーザーがデザイン ビューでクラス ダイアグラムを開いていて、関連付けられているコード ファイルが同時に開いている場合に、ユーザーがコード ファイルを変更しても変更を保存していないときは、クラス ダイアグラム (.cd) ファイルへの変更も失われます。 クラス デザイナーのみで、コード ファイルに対するドキュメントの編集ロックを保持している場合、ユーザーはコード ファイルを閉じるときに変更を保存するように求められません。 IDE では、ユーザーがクラス デザイナーを閉じた後にのみ、変更を保存するようにユーザーに要求します。 保存された変更は両方のファイルに反映されます。 クラス デザイナーとコード ファイル エディターの両方で、コード ファイルに対するドキュメントの編集ロックを保持していた場合、コード ファイルまたはフォームのいずれかを閉じるときにユーザーに保存を求めるメッセージが表示されます。 その時点で、保存された変更はフォームとコード ファイルの両方に反映されます。 クラス ダイアグラムの詳細については、「クラス ダイアグラムの操作 (クラス デザイナー)」を参照してください。

エディター以外でドキュメントに対して編集ロックを設定する必要がある場合は、IVsDocumentLockHolder インターフェイスを実装する必要があることに注意してください。

コード ファイルをプログラムによって変更する UI デザイナーでは、多くの場合、複数のファイルが変更されます。 このような場合、SaveItemsViaDlg メソッドでは、[次の項目への変更を保存しますか?] ダイアログ ボックスを使用して 1 つ以上のドキュメントの保存を処理します。