Probleme mit Events

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von tomxl.

    Probleme mit Events

    Hallo zusammen,

    ich beschäftige mich noch nicht all zu lange mit der Materie VB.NET und bin neu hier im Forum.
    Ich habe bis lang nur VBA Programmiert welches mir aber immer mehr die Grenzen aufzeigte.
    Das war dann auch einer der Gründe warum ich mich mal in VB versuchen möchte.
    Mein
    erstes Projekt ist ein Tool welches ein Postfach auf der Basis von
    Outlook auf Posteigänge überwachen soll. Bei neuen Mails mit bestimmten
    Betreff soll eine MSGBOX mit entsprechenden Text angezeit werden.
    Das gleiche Progrämmchen habe ich bereits in VBA erstellt dort hat es auch wunderbar funktioniert.
    In VB gelingt mir das nicht richtig. Konkret habe ich folgendes Problem.
    Wie bekomme ich den Eventtype "Additem" im Posteingang dazu auf das Ereignis zu reagieren.
    Unter VBA klappte das Problemlos, in VB komme ich da irgendwie nicht richtig zum Ziel.
    Ich verstehe noch nicht so richtig wie ich mit Events umgehe, wann und wo ich was deklarieren muss.
    Könnte mit jemand von Euch mal ein Codebeispiel zeigen wie ich das realisieren kann?
    Gruß, Thomas
    Willkommen im Forum. :thumbup:

    tomxl schrieb:

    Wie bekomme ich den Eventtype "Additem" im Posteingang dazu auf das Ereignis zu reagieren.
    Kannst Du bitte zunächst mal das Projekt etwas näher beschreiben? Möglicherweise bin ich ja auch der Einzige hier, der nicht mit VB.NET auf sein Outlook-Konto zugreift.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht darum das Postfach, auch ohne geöffnetes Outlook im "Auge" zu behalten, dahingehend, dass NEUE Posteingänge auf einen bestimmten betreff überprüft werden sollen. Wenn der Betreff mit dem zu überprüfenden String übereinstimmt soll eine Meldung auf dem BS erscheinen.

    Der Zugriff auf das Postfach ist soweit kein Problem, nur eben das Event "AddItem" auf den Posteingang "feuert" nicht?
    Hab auch erlich gesagt keinen schimmer wie ich das hinbekomme;-)

    Gruß, Thomas
    Probier mal dies:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents myOutlook As New MyOutlookClass
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. myOutlook.DoAnything()
    5. End Sub
    6. Private Sub Outlook_AddItem(sender As System.Object, e As System.EventArgs) Handles myOutlook.AddItem
    7. MessageBox.Show("AddItem")
    8. End Sub
    9. End Class

    VB.NET-Quellcode

    1. Public Class MyOutlookClass
    2. Public Event AddItem(sender As System.Object, e As System.EventArgs)
    3. Public Sub DoAnything()
    4. RaiseEvent AddItem(Me, EventArgs.Empty)
    5. End Sub
    6. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    tomxl schrieb:

    Wie bekomme ich den Eventtype "Additem" im Posteingang dazu auf das Ereignis zu reagieren.
    vlt. wäre hilfreich, wenn du zeigst, wies in VBA geht.
    Und dann noch - falls du failenden Code hast - wies in vb.net nicht geht.
    also Snippets, aber Bitte VB-Tag benutzen - aber richtig
    Leider habe ich es nicht geschaft Deinen Code in meine Projekt einzubinden.
    Zum besseren Verständnis hänge ich mal meine Codefragmente mit an.

    VB.NET-Quellcode

    1. Private WithEvents myOlItems As Microsoft.Office.Interop.Outlook.Items
    2. Sub MainFormLoad(sender As Object, e As EventArgs)
    3. Dim oOutlook As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application
    4. Dim NS As Microsoft.Office.Interop.Outlook.Namespace = oOutlook.GetNamespace("MAPI")
    5. Dim myRecipient As Microsoft.Office.Interop.Outlook.Recipient = NS.CreateRecipient("Postfachname")
    6. Dim objPosteingang As Microsoft.Office.Interop.Outlook.MAPIFolder = NS.GetSharedDefaultFolder(myRecipient, 6)
    7. myOlItems = objPosteingang.items
    8. End Sub


    VB.NET-Quellcode

    1. Private Sub myOlItems_ItemAdd(ByVal Item As Object)
    2. If LCase(CStr(Item.Subject)) Like "*konzept*" Or LCase(CStr(Item.Subject)) Like "*uae*" Then
    3. label1.Text = myOlItems.count
    4. End If
    5. End Sub

    ... und so sieht es in VBA aus:

    VB.NET-Quellcode

    1. Public WithEvents myOlItems As Outlook.Items
    2. Public Sub Application_Startup()
    3. Set Ns = Application.GetNamespace("MAPI") 'Namespaceobject erstellen
    4. Set myRecipient = Ns.CreateRecipient("Postfachname") 'SET Postfach
    5. Set objPosteingang = Ns.GetSharedDefaultFolder(myRecipient, olFolderInbox) 'Posteingang wählen
    6. Set myOlItems = objPosteingang.Items 'Item object erstellen
    7. End Sub
    8. Private Sub myOlItems_ItemAdd(ByVal Item As Object)
    9. If LCase(CStr(Item.Subject)) Like "*konzept*" Or LCase(CStr(Item.Subject)) Like "*uae*" Then
    10. Form1.StartUpPosition = 1
    11. Form1.Show vbModeless
    12. End If
    13. End Sub



    Ich gehe mal davon aus das ich damit völlig auf dem hozweg bin. Hab vorher nich nie was mit events machen müssen.
    Würde aber gerne verstehen wie das Funktioniert!

    Gruß, Thomas

    tomxl schrieb:

    Deinen Code in meine Projekt einzubinden.
    Dazu isser nicht da.

    tomxl schrieb:

    Würde aber gerne verstehen wie das Funktioniert!
    Dazu isser da.
    Mach Dir ein kleines neues Testprojekt, da fügst Du meinen Code ein und kannst rumspielen.
    Löse jedes Teilproblem in einem separaten kleinen Testprojekt.
    Wenn Du mit dem Event Informationen übertragen willst, mach Dir eine von EventArgs abgeleitete Klasse, da kannst Du alles erforderliche reinpacken.
    Wenn Du alles verstanden hast UND wenn die Snippet so laufen, wie Du meinst, pack sie in Dein großes Programm.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich denke allerdings, Rods myOutlookClass wird vom Problem eher wegführen, weil es gibt ja schon eine Klasse dafür, nämlich die OutlookItems.
    Und der TE weiß nurnich, wie man in vb.net ein Event abonniert.

    probierma

    VB.NET-Quellcode

    1. Private WithEvents myOlItems As Microsoft.Office.Interop.Outlook.Items
    2. '...
    3. Private Sub myOlItems_ItemAdd(ByVal Item As Object)handles myOlItems.ItemAdd
    4. If LCase(CStr(Item.Subject)) Like "*konzept*" Or LCase(CStr(Item.Subject)) Like "*uae*" Then
    5. label1.Text = myOlItems.count
    6. End If
    7. End Sub
    Aber das schaurige, was du da reingemacht hast, bitte entfernen, und .net-like coden.

    Am besten richtig anfangen mit dem Beheben zweier Deppen-Einstellungen, mit denen vb.net leider direkt ausgeliefert wird:
    Option Strict On!
    böse Funktionen vermeiden

    Und dann alle Fehlerzeilen löschen, und neu und richtig coden.

    Am meisten Fortschritte machst du übrigens, wenn du dir von vornherein das eh notwendige Grundlagenwissen aneignest - vb.net als OOP-Sprache ist nämlich gewaltig viel mehr als olle VBA:
    dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)
    Anders als für viele wird für dich auch das Kapitel für Umsteiger von vb6 interessant sein, denn vba entspricht ungefähr vb6.
    ich habe den Code jetzt bereinigt-->

    VB.NET-Quellcode

    1. Private WithEvents myOlItems As Microsoft.Office.Interop.Outlook.Items
    2. Sub MainFormLoad(sender As Object, e As EventArgs)
    3. Dim oOutlook As Microsoft.Office.Interop.Outlook.Application = New Microsoft.Office.Interop.Outlook.Application
    4. Dim NS As Microsoft.Office.Interop.Outlook.Namespace = oOutlook.GetNamespace("MAPI")
    5. Dim myRecipient As Microsoft.Office.Interop.Outlook.Recipient = NS.CreateRecipient("Postfachname")
    6. Dim objPosteingang As Microsoft.Office.Interop.Outlook.MAPIFolder = NS.GetSharedDefaultFolder(myRecipient, OlDefaultFolders.olFolderInbox)
    7. myOlItems = objPosteingang.items
    8. End Sub
    9. Private Sub myOlItems_ItemAdd(ByVal Item As Object)handles myOlItems.ItemAdd
    10. label1.Text = "Neue Mail angekommen"
    11. End Sub

    Leider löst das event immer noch nicht aus!
    was mache ich nur falsch? ?(

    gruß, thomas

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tomxl“ ()

    Ich nehme alles zurück. Das Event löst doch aus.
    Hatte da noch einen Denkfehler ist soweit geklärt.
    Allerdings habe ich noch das Problem, dass das Event zwar auslöst, ich das Item in der Sub nicht weiter verarbeiten kann.
    Konkret möchte ich das Subject des item auf Gültigkeit überprüfen. ich bekomme aber immer diese Fehlermeldung:
    "Option Strict On" lässt spätes Binden nicht zu. (BC30574)"

    Hier noch der betroffene Codeausschnitt:

    VB.NET-Quellcode

    1. Private Sub myOlItems_ItemAdd(ByVal Item As Object)Handles myOlItems.ItemAdd
    2. If item.Subject.ToString Like "*test*" Then label1.Text = "Mail zum Thema AE-Konzept eingetroffen !!!"
    3. End Sub


    leider komme ich an der Stelle seit gestern nicht wirklich weiter kann mir bitte mal jemand auf die Sprünge helfen?


    Gruß, Thomas

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tomxl“ ()

    Du gibst ein Object rein und behandelst es wie ein Excel-Irgendwas-Object, das geht nicht.
    Lösung:
    Lokal Option Strict Off (==> Partial Class in einer anderen Datei)
    oder
    den korrekten Typ ermitteln und dann in den Quellcode einsetzen.
    Manchmal reicht es, mit der Maus drüber zu parken, da bekommst Du den Typ angezeigt.
    Ansonsten bei Programmlauf Haltepunkt (F9) drauf und mit Shift+F9 den Inhalt der Variable ansehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich habe mal folgendes gemacht:

    VB.NET-Quellcode

    1. Debug.Print(Item.ToString)


    und bekomme folgendes Ergebnis: "System.__ComObject"

    Sollte da nicht eigentlich sowas wie "Mailitem" stehen.
    Ich blick einfach nicht mehr durch...

    ...das mit(Shift+F9) geht bei mir nicht. Liegt vieleicht daran, dass ich mit "SharpDevelop" arbeite?

    Gruß, Thomas
    Debug.Print(Item.ToString) ist echt kontraproduktiv.

    tomxl schrieb:

    geht bei mir nicht
    Hast Du so etwas wie Menü Debug => QuickWatch
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nee, kann ich nicht finden:-(
    ...doch ich habe "überwachen" gefunden in einem untermenü.
    Dort bekomme ich aber das gleiche angezeigt wie bei Debug.Print.

    Aber sollte er nicht dem Item Object im Event nicht das mailitem übergeben?

    Oder liege ich da völlig falsch?

    IntelliSense bietet mir auch keine Methoden für mailitems an.

    Gruß, Thomas

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tomxl“ ()

    nö, du liegst richtig.
    __ComObject ist eine echt doofe Klasse, und da gibts keine Typisierung. Also strict Off proggen, und hoffen, dass die Member existieren, die du abrufst.
    Man kann auch iwie die richtigen Interfaces rauskriegen, und drauf casten, oder es gibt auch typisierte Wrapper-Klassen - habich aber keine Ahnung von.

    Office-InterOp ist eiglich ein sehr schlechtes Thema für einen Einsteiger.

    ErfinderDesRades schrieb:

    Office-InterOp ist eiglich ein sehr schlechtes Thema für einen Einsteiger.
    Ja, das habe ich auch schon bemerkt. Aber ich will dieses Projekt unbedingt fertigstellen.
    Kann Doch für jemanden, der sich schon sehr lange mit der Materie beschäftigt, nicht so schwer sein.
    Nur eben für mich ist es extrem schwer, da ich mich noch nie vorher mit EVENTS beschäftigt habe.
    In VBA war das so einfach und hier bekomme ich es nicht einmal hin, ein bestehendes Event richtig einzusetzen.
    Theoretisch sollte das neue Item doch in dem "item" Objekt enthalten sein?
    Ist es aber doch nicht. Da läuft doch was nicht richtig gerade aus?

    Gruß, Thomas

    tomxl schrieb:

    Kann Doch für jemanden, der sich schon sehr lange mit der Materie beschäftigt, nicht so schwer sein.
    Mag sein - ich kenne jdfs. niemanden, der sich sehr lange mit der Materie beschäftigt hat.

    Theoretisch sollte das neue Item doch in dem "item" Objekt enthalten sein?
    Keine Ahnung - was steht denn in der Doku?
    Ach - gibts keine? jo, ich weiß wohl, warum ich mich mit dem Zeugs nicht beschäftige :P