Inhalt
ReplyAll | |
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten. |
Um Ereignisse eines Objektes empfangen zu können, müssen Sie eine Variable des entsprechenden Objekttyps in einem Klassenmodul mit dem Schlüsselwort 'WithEvents' deklarieren. Solange ein Anwender nur eine E-Mail zur Zeit öffnet, wäre das noch relativ leicht: Sie brauchen dann auch nur eine Variable. Sie warten einfach auf das NewInspector-Ereignis; wenn das feuert, wissen Sie, dass ein Element geöffnet wird; handelt es sich dabei um ein MailItem, dann speichern Sie einen Verweis darauf in der genannten Variable und können von da an die Ereignisse des MailItems empfangen. In der Realität wird es aber umfangreicher, weil der Anwender mehr als nur eine E-Mail gleichzeitig öffnen kann. Da die tatsächliche Anzahl unbekannt ist, nützt es auch nichts, nach obigem Muster z.B. drei Variablen zu deklarieren.
Das Problem wird mit einem Klassenmodul gelöst. Der Code wird nur einmal geschrieben, aber Sie können von der Klasse beliebig viele Objekte erzeugen. Da so ein Objekt automatisch zerstört wird, wenn keine Verweise darauf mehr gehalten werden, werden alle benötigten Verweise in einer Collection gespeichert.
Der folgende, sogenannte Inspector-Wrapper zeigt, wie das funktioniert und berücksichtigt auch diverse Situationen, in denen der Inspector geschlossen wird. Inspector ist das Objekt, das die geöffneten Elemente anzeigt. Analog könnten Sie das gleiche für Explorer (Anzeige der Ordner) aufbauen.
Kopieren Sie den folgenden Code ins Modul 'DieseOutlookSitzung':
Private WithEvents m_Inspectors As Outlook.Inspectors Private m_MyInspectors As VBA.Collection Private m_lNextKey As Long Private Sub Application_Startup() Set m_Inspectors = Application.Inspectors Set m_MyInspectors = New VBA.Collection End Sub Private Sub m_Inspectors_NewInspector(ByVal Inspector As Outlook.Inspector) On Error Resume Next Dim oInspector As cInspector Set oInspector = New cInspector If oInspector.Init(Inspector, CStr(m_lNextKey)) Then m_MyInspectors.Add oInspector, CStr(m_lNextKey) m_lNextKey = m_lNextKey + 1 End If End Sub Friend Property Get MyInspectors() As VBA.Collection Set MyInspectors = m_MyInspectors End Property
Reporter | |
Mit dem Reporter erstellen Sie Berichte für Ihre Outlook Daten. Mit wenigen Klicks werden Werte aus Aufgaben, Terminen und dem Journal summiert. |
Erstellen Sie jetzt ein neues Klassenmodul über Einfügen/Klassenmodul. Drücken Sie dann f4 und tragen Sie als Klassenname 'cInspector' ein. Alle folgenden Funktionen gehören in dieses neue Klassenmodul.
Private WithEvents m_Inspector As Outlook.Inspector Private WithEvents m_Mail As Outlook.MailItem Private m_IsClosed As Boolean Private m_sKey As String Friend Function Init(oInspector As Outlook.Inspector, _ sKey As String _ ) As Boolean Dim obj As Object If Not oInspector Is Nothing Then Set obj = oInspector.CurrentItem If TypeOf obj Is Outlook.MailItem Then Set m_Mail = obj Set m_Inspector = oInspector m_sKey = sKey Init = True End If End If End Function Private Sub m_Inspector_Close() CloseInspector End Sub Private Sub Class_Terminate() CloseInspector End Sub Friend Sub CloseInspector() On Error Resume Next If m_IsClosed = False Then m_IsClosed = True DieseOutlookSitzung.MyInspectors.Remove m_sKey Set m_Mail = Nothing Set m_Inspector = Nothing End If End Sub
ReplyAll | |
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten. |
Es gibt drei Möglchkeiten, eine Email zu schlieÃen:
Als Entwickler müssen Sie wissen, welche Ereignisse ausgelöst werden und in welcher Reihenfolge. Die letzten beiden sind problemlos, wenn das Element unverändert ist. Aus Word heraus wird zuerst Inspector_Close ausgelöst; dort wird das Aufräumen initialisiert. Aus Outlook heraus wird dagegen erst Item_Close ausgelöst; auch dort kann gleich aufgeräumt werden.
Wenn das Element verändert wurde, dann wird dem Anwender der Speichern-Dialog angezeigt, worüber das SchlieÃen noch abgebrochen werden kann. In dem Fall soll das cInspector-Objekt auch nicht zerstört werden.
Das Problem ist nun Outlook 2000: Hier gibt es das BeforeDelete-Ereignis noch nicht. In Outlook 2000 kann deswegen nicht erkannt werden, wenn ein geändertes Element direkt gelöscht wird. Das feuert zwar Item_Close, aber dann ist Saved=False, was wiederum dazu benutzt werden muss, eben nicht aufzuräumen.
Private Sub m_Mail_Send(Cancel As Boolean) On Error Resume Next CloseInspector End Sub
Für die folgende Funktion müssen Sie sich auch die Funktion GetOutlookVersion kopieren.
Private Sub m_Mail_Close(Cancel As Boolean) On Error Resume Next If GetOutlookVersion < 10 Then CloseInspector ElseIf m_Mail.Saved Then CloseInspector End If End Sub
Das BeforeDelete-Ereignis gab es vor Outlook XP nicht. Das Ereignis wird erst ausgelöst, nachdem evt. ein Speichern-Dialog angezeigt wurde.
Private Sub m_Mail_BeforeDelete(ByVal Item As Object, Cancel As Boolean) CloseInspector End Sub
OLKeeper | |
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schlieÃen und so etwa wichtige Emails verpassen würden. |