2017-04-14 7 views
3

私はリストにカスタムプロパティをリストしていますが、そのプロパティが変更されたときに特定のイベントを実行したいと思います。 olFolderToDoのすべてのアイテムのCustomPropertyChangeイベントを処理するイベントハンドラを作成する方法、またはアイテムにイベントハンドラをプログラムで追加して、新しいアイテムがフォルダに追加されたときにイベントハンドラを追加する方法はありますか?プログラムでアイテムにイベントハンドラを追加

私は過去にこのコードを、フォルダのItemsChangeのイベントハンドラに入れてプロパティの値をチェックすることで、不自然に処理しました(たとえば、タスクがマークされたらアイテムの変更を監視し、アイテムが完了とマークされているかどうかを確認します)、これはプロパティの任意の変更を処理しないため、連続して複数回発生することを避けるためには注意深い処置が必要です。私は現在、何をすべきかの

例:

Public WithEvents Items As Outlook.Items 

Private Sub Application_Startup() 
Set Items = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderToDo).Items 
End Sub 

Private Sub Items_ItemChange(ByVal Item As Object) 
If TypeOf Item Is Outlook.TaskItem Then 
    If Item.Status = olTaskComplete Then 
     DoTheThing 
    End If 
ElseIf TypeOf Item Is Outlook.MailItem Then 
    If Item.FlagStatus = olFlagComplete Then 
     DoTheThing 
    End If 
End If 
End Sub 

答えて

0

(親オブジェクトのインスタンスである)アイテムのカスタムプロパティが変更されたときCustomPropertyChangeイベントが起動されます。そのイベントを処理できるようにするには、Outlookの各アイテムを個別に購読する必要がありますが、これは良い考えではありません。より良い解決策は、指定されたコレクション内の項目が変更されたときに発生するItemsクラスのItemChangeイベントにサブスクライブすることです。その場合は、単一のフォルダではなく、フォルダを監視することができます。しかし、それはあなたにどんな特性が変わったかを教えてくれません。ただし、値を同期するための2つのカスタムプロパティを保持することができます(ソースプロパティ値の最初のプロパティと古い値の2番目のプロパティは、変更されたプロパティと古い値を把握できます)。

回避策として、Outlookが基づいている低レベルのAPI(拡張MAPI)を使用することを検討してください。 fnevObjectModified通知があります。詳細については、Event Notification in MAPIを参照してください。注:マネージコードから拡張MAPIの周りのラッパーを使用して、低レベルの通知にアクセスすることができます(例:RedemptionまたはMAPI Store Accessor)。

+0

なぜ各Outlookアイテムを購読しているのが別の理由ですか?物事を遅くするか? – Empiromancer

+0

もちろん...できるだけ早くCOMオブジェクトを解放し、常にそれらを生かし続けるのを避けなければなりません。 –

関連する問題