共用方式為


實作偵測器的包裝函式,並在每個偵測器中追蹤專案層級事件

本主題包含兩個程式代碼範例,示範如何實作 Inspector 集合的包裝函式,以及如何使用該包裝函式來追蹤集合中每個 Inspector 物件的專案層級事件。

範例

注意事項

下列程式代碼範例是 Microsoft Office Outlook 2007 程式設計應用程式的摘錄。

下列兩個程式代碼範例會實作 Connect 和 OutlookInspector 類別。 第一個程式代碼範例牽涉到您包含在 Connect 類別中的方法和事件處理程式,以實作 Inspectors 集合的包裝函式。 第二個程式代碼範例牽涉 到 OutlookInspector 類別的簡單實作。

If you use Visual Studio to test this code example, you must first add a reference to the Microsoft Outlook 15.0 Object Library component and specify the Outlook variable when you import the Microsoft.Office.Interop.Outlook namespace. The using statement must not occur directly before the functions in the code example but must be added before the public Class declaration. The following line of code shows how to do the import and assignment in C#.

using Outlook = Microsoft.Office.Interop.Outlook;

在下列程式代碼範例 中,NewInspector (Inspector) 事件會在建立新的偵測器視窗之後和顯示之前發生。 用戶動作也可以建立新的偵測器視窗。 會宣告 Connect 類別中名為 inspectors 的類別層級實例變數,並連結 NewInspector 事件。

在 inspectors_NewInspector 方法中, FindOutlookInspector 方法會檢查新的偵測器視窗是否已在 inspectorWindows 清單中。 如果 FindOutlookInspector 在 inspectorWindows 中找不到 Inspector 物件, AddInspector 方法會將 OutlookInspector 類別的實例新增至 inspectorWindows。 您可以使用 OutlookInspector 類別來引發此特定偵測器視窗的事件。 第二個程式代碼範例會顯示 OutlookInspector 類別的實作。

class Connect
{
    // Connect class-level Instance Variables
    // Outlook inspectors collection
    private Outlook.Inspectors inspectors;

    // Collection of tracked inspector windows              
    private List<OutlookInspector> inspectorWindows;   
    
    public Connect(Outlook.Inspectors Inspectors)
    {
        inspectors = Inspectors;
        inspectorWindows = new List<OutlookInspector>();
        // Hook up NewInspector event
        inspectors.NewInspector += new 
            Outlook.InspectorsEvents_NewInspectorEventHandler(
                inspectors_NewInspector);
    }

    // NewInspector event creates new instance of OutlookInspector
    void inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        // Check to see if this is a new window you don't
        // already track
        OutlookInspector existingWindow = 
            FindOutlookInspector(Inspector);
        if (existingWindow == null)
        {
            AddInspector(Inspector);
        }
    }

    // Adds an instance of **OutlookInspector** class
    private void AddInspector(Outlook.Inspector inspector)
    {
        OutlookInspector window = new OutlookInspector(inspector);
        window.Close +=
            new EventHandler(WrappedInspectorWindow_Close);
    }

    // Looks up the window wrapper for a given Inspector 
    // window object
    private OutlookInspector FindOutlookInspector(object window)
    {
        foreach (OutlookInspector inspector in inspectorWindows)
        {
            if (inspector.Window == window)
            {
                return inspector;
            }
        }
        return null;
    }
}

下列程式代碼範例是 OutlookInspector 類別的實作。 這個類別可用來引發上述程式代碼範例中偵測器視窗的事件。 多個偵測器視窗可以同時開啟。 您可以在此類別建構函式中鏈接專案層級事件,例如 Open、PropertyChangeCustomPropertyChangeContactItem 物件的 Close 事件也會連結在此類別建構函式中。 您可以視需要定義其他類別層級項目實例變數。 在 OutlookInspector 建構函式中連結的所有事件,都會在OutlookInspectorWindow_Close事件處理程式中取消叫用。

請注意,在物件模型層級, Outlook 偵測器 物件不是任何 Outlook 項目類型的特定物件。 此程式代碼範例會使用建立協助 程序類別以存取一般 Outlook 項目成員中所定義的 OutlookItem 協助程式類別,在假設專案為聯繫人專案之前,方便地呼叫 OutlookItem.Class 屬性來驗證偵測器中目前專案的郵件類別。

// This class tracks the state of an Outlook Inspector window 
// and ensures that what happens in this window is handled correctly.
class OutlookInspector
{
    // OutlookInspector class-level instance variables 
    // wrapped window object
    private Outlook.Inspector m_Window;             

    // Use these instance variables to handle item-level events
    // wrapped MailItem
    private Outlook.MailItem m_Mail;    
    // wrapped AppointmentItem        
    private Outlook.AppointmentItem m_Appointment;  
    // wrapped ContactItem
    private Outlook.ContactItem m_Contact;
    // wrapped TaskItem      
    private Outlook.TaskItem m_Task;             

    // OutlookInspector constructor
    public OutlookInspector(Outlook.Inspector inspector)
    {
        m_Window = inspector;

        // Hook up the close event
        ((Outlook.InspectorEvents_Event)inspector).Close +=
            new Outlook.InspectorEvents_CloseEventHandler(
            OutlookInspectorWindow_Close);

        // Hook up item-level events as needed
        OutlookItem olItem = new OutlookItem(inspector.CurrentItem);
        if(olItem.Class==Outlook.OlObjectClass.olContact)
        {
            m_Contact = olItem.InnerObject as Outlook.ContactItem;
            m_Contact.Open +=
                new Outlook.ItemEvents_10_OpenEventHandler(
                m_Contact_Open);
            m_Contact.PropertyChange +=
                new Outlook.ItemEvents_10_PropertyChangeEventHandler(
                m_Contact_PropertyChange);
            m_Contact.CustomPropertyChange +=
                new Outlook.ItemEvents_10_CustomPropertyChangeEventHandler(
                m_Contact_CustomPropertyChange);
        }
    }

    // Event Handler for the inspector close event.
    private void OutlookInspectorWindow_Close()
    {
        // Unhook events from any item-level instance variables
        m_Contact.Open -= 
            Outlook.ItemEvents_10_OpenEventHandler(
            m_Contact_Open);
        m_Contact.PropertyChange -= 
            Outlook.ItemEvents_10_PropertyChangeEventHandler(
            m_Contact_PropertyChange);
        m_Contact.CustomPropertyChange -= 
            Outlook.ItemEvents_10_CustomPropertyChangeEventHandler(
            m_Contact_CustomPropertyChange);
        ((Outlook.ItemEvents_Event)m_Contact).Close -= 
            Outlook.ItemEvents_CloseEventHandler(
            m_Contact_Close);

        // Unhook events from the window
        ((Outlook.InspectorEvents_Event)m_Window).Close -=
            new Outlook.InspectorEvents_CloseEventHandler(
            OutlookInspectorWindow_Close);

        // Raise the OutlookInspector close event
        if (Close != null)
        {
            Close(this, EventArgs.Empty);
        }
        // Release item-level instance variables
        m_Mail = null;
        m_Appointment = null;
        m_Contact = null;
        m_Task = null;
        m_Window = null;
    }
}

另請參閱