お知らせ

--------------------------------------------------

プログラム作成/コンサルティングの申し込みはこちら

--------------------------------------------------

2010年6月18日金曜日

.NET で気を付けること 「ドキュメントのロックと解除」

今日は、先週の .NET のトレーニングで教えてもらった、ドキュメントのロックと解除について書こうと思います。

モーダル ダイアログのときはいいのですが、モードレス ダイアログを使うときは、ドキュメントをロックしてから作業を行い、最後にロックを解除する必要があるそうです。

モードレス ダイアログがアクティブになると、元のドキュメントが非アクティブになり、そういうときはドキュメントをロックする必要があるそうです。

なので、コンテキスト メニューに自分のメニューを追加して実行する時もドキュメントをロックする必要があります。

それをしないと、複数の図面を操作している時とかにエラーになることがあるようです。(異常終了することも???)

以前、試しにダイアログを作ってみましたが、ロックのことは知りませんでした。
そのときは、コマンドを実行するたびモードレス ダイアログが表示されてしまって、モードレス ダイアログが表示されているかどうか確認する方法を知らなかったので、モーダル ダイアログにしていたので気がつきませんでした。

ということで、モードレス ダイアログやコンテキスト メニューなどを使ってプログラムを作成するときは気を付けましょう。


こんな感じでロックして
    Dim docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()

作業終了後にこんな感じで解除します。
    docLoc.Dispose()



「.NET デベロッパ ガイド」にもこんな記述がありました。

------------------------------------------------------
ドキュメントのロックとロック解除


オブジェクトの変更要求や AutoCAD へのアクセスは、さまざまな状況で、いくつものアプリケーションから発生します。他の要求との競合を防ぐため、変更を加える前にドキュメントをロックする必要があります。特定の状況でドキュメントをロックできなかった場合、データベースの変更時にロック違反が発生します。次の場合に、ドキュメントのロックが必要になります。

  • アプリケーションでモードレス ダイアログ ボックスから AutoCAD とやり取りする
  • アプリケーションでカレント ドキュメント以外のロード済みドキュメントにアクセスする
  • アプリケーションが COM サーバとして使用されている
  • アプリケーションでコマンドを Session コマンド フラグに登録する

たとえば、現在のドキュメント以外のドキュメントにあるモデル空間またはペーパー空間に図形を追加する場合、ドキュメントをロックする必要があります。ロックするには、ロックする Database オブジェクトの LockDocument メソッドを使用します。LockDocument メソッドが呼び出されると、DocumentLock オブジェクトが返されます。

ロックしたデータベースの変更を終えたら、データベースをロック解除する必要があります。データベースをロック解除するには、DocumentLock オブジェクトの Dispose メソッドを呼び出します。DocumentLock オブジェクトで Using 文を使用することもできます。Using 文が終了するとデータベースがロック解除されます。

注: Session コマンド フラグを使用しないコマンドで作業する場合、変更前に現在のドキュメントのデータベースをロックする必要はありません。
------------------------------------------------------

0 件のコメント:

コメントを投稿