2017-04-14 118 views
3

我给我的一些项目列出一个自定义属性,并且我想在该属性更改时执行某个事件。有没有办法编写一个事件处理程序来处理事件olFolderToDo中的所有项目,或者以编程方式向项目中添加事件处理程序,以便在添加新项目时添加事件处理程序?将事件处理程序添加到项目编程

我笨拙地处理了这个问题,把我的代码放在文件夹的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事件,该事件在指定集合中的项目发生更改时触发。在这种情况下,您可以监视文件夹,而不是单个文件夹。但它不会告诉你哪个属性发生了变化。但是,您可以为同步值保留两个自定义属性(第一个用于源属性值,第二个用于旧值,因此您将能够确定哪些属性发生更改,以及旧值是什么)。

作为解决方法,您可以考虑使用基于Outlook的低级API - 扩展MAPI。在那里你可以找到fnevObjectModified通知。有关更多信息,请参阅Event Notification in MAPI。请注意,您可以使用托管代码中扩展MAPI的任何包装来访问低级别通知(例如,Redemption或MAPI Store Accessor)。

+0

为什么订阅每个展望项目单独是一个坏主意?它会减慢速度吗? – Empiromancer

+0

当然......您必须尽快释放COM对象,并避免让它们始终处于活动状态。 –

相关问题