2009-08-01 12 views
1

アクティブなドキュメントでネイティブオブジェクトの追加、削除、編集を行う必要がある場合に、プログラムのプラグインを作成しています。 APIには、ドキュメントの編集時に発生するイベントがあります。ただし、プログラムでは、ネイティブオブジェクトが実際に変更されたときは追跡されません。代わりに、変更されたオブジェクトは削除されるオブジェクトとして扱われ、すぐに同じIDを持つ別の変更されたオブジェクトに置き換えられます。このようにして、プログラムは元に戻すレコードを追跡できます。複数のイベントが発生したときの追跡方法を教えてください。

オブジェクトが追加されます: OnAddObjectイベント

は、オブジェクトが削除される: OnDeleteObjectイベント

いくつか試して、私は次のようにイベントが誘発されていることが決定した後

オブジェクトが変更されました: OnReplaceObjectイベント - > OnDeleteObjectイベント - > OnAddObjectイベント

今、私のプラグインは、カスタムオブジェクトのインスタンスをコレクションに追加したりコレクションから削除したりするOnAddイベントとOnDeleteイベントだけを見ています。しかしこれは、オブジェクトが私のプラグインを変更するたびに、ほぼ同じオブジェクトを再初期化することを取り除くことを意味します。むしろドキュメントオブジェクトが変更されたので、私のカスタムオブジェクトは完全に再インスタンス化されるのではなく、リフレッシュできるようになっています。

OnDeleteイベントとOnAddイベントを購読している私のメソッドは、オブジェクトが実際に追加または削除されていないが、変更されたために置き換えられていることを通知できますか?

答えて

0

私は置き換えイベントが発生するが、追加で

をロックするように設定し、ロック変数を確認し削除すると「ロック」の変数(例えばboolsに)

を導入示唆しています。ロックするように設定されている場合は、ロックを解除して戻すように設定します。

+0

Add/RemoveイベントはReplacedイベントの前に発生するため、これは不可能です。 – Zyphrax

+0

Ericの質問によると、Replaceイベントが発生し、続いてDeleteが続き、Addが表示されるので、Johannesソリューションはスレッド処理の問題を考慮してOKです。 –

+0

この回答は私のソリューションに最も近いものです。私はBool変数を使用せず、むしろOnReplaceObjectイベントでオブジェクトのIDをキャッシュしました –

0

文書IDを追跡します。

0

元のプログラムのイベント構造が悪いので、少し難しいです。おそらく、削除されているアイテムのIDを現在の時刻と共に辞書に入れることができます。

このようにして、辞書の内容をチェックする別のスレッドを作成できます(アイテムが含まれている場合)。各アイテムに数ミリ秒(dictからのDateTimeを比較)してAddイベントを実行し、それが通常の削除か置換かを決定します。

あなたの削除を数ミリ秒遅くする必要があるので、それは少し非効率です。しかし、私はより良い方法を考えることができません。

+0

複雑な方法 –

関連する問題