Auf COM-Events reagieren

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von web933.

    Auf COM-Events reagieren

    Hallo zusammen,
    ich möchte kurz mein Problem beschreiben. Vorweg: Ich arbeite seit einiger Zeit mit einem Programmierer zusammen der seinem Programm eine Schnittstelle einbaute mittels derer ich aus VB.NET heraus Befehle an diese Anwendung senden kann. Dies funktionierte bisher über einen Verweis. Nun wurde diese Schnittstelle erweitert und mein VB.NET Programm sollte jetzt auf Ereignisse (hat nichts mit Windows-Ereignissen zu tun) die in diesem Programm eintreten, reagieren. im Folgenden ein Auszug aus der Mail die ich von dem Programmierer erhielt:

    Die Software sendet nun die gleichen Ereignisse die auch in der Ereignissverwaltung auftreten können. Diese wären: (Es folgt ein Beispiel)

    - TrackLeft(TrackName, VehicleName, RouteIndex) – Identisch zu TrackEntered, nur dass dieses Ereignis aufgerufen wird wenn ein Objekt ein Gleis verlässt.

    usw. ......
    ......

    Um auf diese Events reagieren zu können sind Anpassungen an Visual
    Basic notwendig. Ich kenne mich mit Visual Basic nicht aus aber vielleicht hilft euch http://msdn.microsoft.com/en-us/library ... 71%29.aspx

    (Obiger Link half mir leider nicht)

    Weiter mit der Mail

    ..... weiter um in VB.Net auf COM-Events zu reagieren. Sinnvoll ist auf jeden Fall ein neuer Import der “Bibliothek”, damit VB die neuen Funktionen mitbekommt. Grundsätzlich wird es wie in allen anderen Sprachen laufen. Für jedes Event wird in VB eine eigene Unterfunktion angelegt die aufgerufen wird wenn das Ereignis eintritt. Diese Unterfunktionen müssen zu Beginn bei der Steuerschnittstelle registriert werden.

    Soweit das, was ich weiß. Würde mich freuen wenn mir jemand weiterhelfen könnte. Vielleicht auch nach der Beantwortung weiterer Fragen. Bin gerne bereit sie soweit wie möglich zu beantworten.

    Herzlichen Dank im Voraus

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

    Möglichkeit 1)

    Deklariere das Objekt global mit dem Schlüsselwort WithEvents. Danach kannst du in der Visual Studio IDE, das Objekt anwählen und dir automatisch die Methoden für die Events generieren lassen (wie z.B.: bei ButtonClick)

    Hier ein Beispiel anhand eines Timers:

    VB.NET-Quellcode

    1. Public WithEvents T1 As New System.Timers.Timer()


    Danach kannst du in der VS IDE den Timer auswählen und eines der Events die der Timer besitzt. VS erstellt danach automatisch eine Prozedur, die beim Auslösen des Events aufgerufen wird.



    VB.NET-Quellcode

    1. Private Sub T1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) Handles T1.Elapsed
    2. End Sub


    Diese Prozedur ist wie folgt aufgebaut:

    Name = Objektname_Eventname
    In den Klammern die Event Parameter

    und zum schluss handles objektname.eventname. (handles sagt, welches event von dieser Prozedur behandelt wird)


    Möglichkeit 2)

    Du fügst deinen EventHandler selbst hinzu.

    Wieder anhand eines Timers:

    VB.NET-Quellcode

    1. Public T1 As New System.Timers.Timer() ' Das Objekt
    2. Private Sub Main()
    3. AddHandler T1.Elapsed, AddressOf T1_Elapsed 'Hier wird der Handler Hinzugefügt
    4. End Sub
    5. Private Sub T1_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) ' Hier wieder der Handler
    6. End Sub


    Die sub ist die selbe wie oben, nur dass diese bei dieser Methode selbst geschrieben wurde.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Entschuldige Biedermann wenn ich dumm frage.
    Das mit dem Timer habe ich versucht und es klappt auch. Wenn ich die Zeile so wie von Dir beschrieben eingebe wird mit Timers bzw. Timer auch sofort vorgeschlagen. Aber wie finde ich heraus was ich an meiner Stelle hier eintragen muss?
    Sieh Dir mal dies an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents myTest As New Test
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. myTest.DoTest()
    5. End Sub
    6. Private Sub TestDone(sender As System.Object, e As System.EventArgs) Handles myTest.BlaBla
    7. Label1.Text = myTest.TestValue.ToString
    8. End Sub
    9. End Class
    10. Public Class Test
    11. Public Property TestValue As Integer
    12. Public Event BlaBla(sender As System.Object, e As System.EventArgs)
    13. Public Sub New()
    14. TestValue = 0
    15. End Sub
    16. Public Sub DoTest()
    17. RaiseEvent BlaBla(Me, EventArgs.Empty)
    18. TestValue += 1
    19. End Sub
    20. End Class
    Die Class Test wäre dann das, was Du einbinden willst.
    Kannst Du da irgendwelche Parallelen erkennen?
    Den Parameter e kann man natürlich ableiten und da alle Information selbst reinpacken.
    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!
    Sieh dir ganz einfach das Event, welches du abfangen willst, im Objekt-Browser oder in der IDE genauer an.

    Im Menü View findest du den Object-Browser. In dem kannst du die COM-Klasse suchen und das Event genauer unter die Lupe nehmen.

    oder du siehst es dir direkt über die IntelliSense an

    z.B.:

    VB.NET-Quellcode

    1. Public Class TestKlasse
    2. Public Event Test(ByVal sender As Object, ByVal e As EventArgs) 'Hier ist das Event, welches du abfangen möchtest.
    3. End Class
    4. Dim test As New TestKlasse 'Erstell dir einfach ein Test-Objekt
    5. Public Sub Main()
    6. AddHandler test. 'hier kannst du dir das Event über die IntelliSense ansehen.
    7. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Die Prozeduren im mittleren Teil des Bildes, die einen Pfeil als Icon haben, sind Events.
    Wenn Du solch ein Event abonieren willst, klicke doppelt auf den Namen neben dem Pfeil, da generiert das Studio Dir einen leeren Eventhandler, den Du dann nur noch ausfüllen musst.
    Minimal mit

    VB.NET-Quellcode

    1. MessageBox.Show("Event xxx ist angekommen")
    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!
    Siehst Du ein solch Objekt im Designer?
    Wenn ja, klicke bei anzezeigten Eigenschaften /Properties auf den Pfeil oben un der Mitte, da sollten alle Events angezeigt werden.
    Da kannste drauf klicken.
    Wenn nicht, schreib hin

    VB.NET-Quellcode

    1. Private Sub XXX() Handles NAME_DEINER_VARIABLE.
    Nach dem Punkt sollte das Studio Dir alle Events auflisten.
    Such das richtige aus und vervollständige die Zeile. Die Parameter zum Event findest Du im ObjectBrowser, klicke auf den Klassennamen und drücke dann auf F12.
    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!
    Hab mir wirklich Mühe gegeben aber nichts funktioniert so wie ihr es beschrieben habt. IntelliSense zeigt nichts an. Habt ihr noch irgend eine Idee oder gibt es etwas das ich euch liefern könnte damit ihr Euch bei der Lösung des Problems leichter tut oder damit ihr einem relativen Neuling eine genaue 1. mach dies 2. mach dies Liste geben könnt. Besonders die ersatzweise eingesetzten Variablem machen mir Probleme. Ich weiß nicht wo meine Variablen zum Einsatz kommen. Hier noch einmal ein Bild das auch den unteren Teil zeigt.
    Bilder
    • bild2.jpg

      160,52 kB, 789×376, 106 mal angesehen
    Welches Event genau benötigst Du?
    Ich mach Dir ein Beispiel, das Du für andere Events übernehmen kannst.
    We ist Deine COM-Klasse deklariert?
    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!
    Wenn du das Objekt global deklarierst und withevents dazuhängst, müsstets du das Event so abfangen können:

    VB.NET-Quellcode

    1. Private WithEvents MeinObjekt as new Eisenbahnplaner.EBPCOntrol()
    2. Sub Main()
    3. End Sub
    4. 'Die Signatur habe ich aus dem Bild entnommen...
    5. Private Sub MeinObjekt_TrackEntered(ByVal TrackName as String, ByVal VehicleName as String, ByVal RouteIndex as Integer) Handles MeinObjekt.TrackEntered
    6. msgbox(Trackname & vbcrlf & VehicleName & vbcrlf & RouteIndex.ToString)
    7. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Kurze Erklärung:
    Bisher war es so, dass ich mittels eines VB-Programmes Steuerbefehle an das andere Programm senden konnte. Seit gestern ist die Erweiterung dazu gekommen dass das Andere Programm meinem Programm das Eintreten bestimmter Ereignisse senden kann. In einen andern Forum beschrieb ich den Vorgang wie das andere Programm in mein VB-rojekt eingebunden wird. Hier die wichtigsten Bilder dazu (das letzte Bild (04.jpg) zeigt das Event TrackEntered das ich einbinden will:
    Bilder
    • 01.jpg

      138,16 kB, 600×448, 102 mal angesehen
    • 02.jpg

      113,25 kB, 599×478, 111 mal angesehen
    • 03.jpg

      144,43 kB, 645×325, 98 mal angesehen
    • 04.jpg

      160,52 kB, 789×376, 108 mal angesehen
    Wie bereits gesagt: WithEvents

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public WithEvents obj_EBP as new EBPCOntrol()
    3. 'Die Signatur habe ich aus dem Bild entnommen...
    4. Private Sub MeinObjekt_TrackEntered(ByVal TrackName as String, ByVal VehicleName as String, ByVal RouteIndex as Integer) Handles MeinObjekt.TrackEntered
    5. msgbox(Trackname & vbcrlf & VehicleName & vbcrlf & RouteIndex.ToString)
    6. End Sub
    7. End Class


    oder mit AddHandler

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public obj_EBP as new EBPCOntrol()
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. AddHandler obj_EBP.TrackedEntered, AddressOf MeinObjekt_TrackEntered
    5. End Sub
    6. 'Die Signatur habe ich aus dem Bild entnommen...
    7. Private Sub MeinObjekt_TrackEntered(ByVal TrackName as String, ByVal VehicleName as String, ByVal RouteIndex as Integer) Handles MeinObjekt.TrackEntered
    8. msgbox(Trackname & vbcrlf & VehicleName & vbcrlf & RouteIndex.ToString)
    9. End Sub
    10. End Class
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Super, beide Varianten funktionieren. Ich danke euch beiden herzlich. Besonder für eure Ausdauer. Ich weiß selbst, dass ich bzgl. meinem Wissen das Pferd von hinten aufzäume aber jetzt, nachdem ich den Planer mit einem eigenen Programm steuern kann macht es viel mehr Spaß mich in all die anderen Dinge einzuarbeiten die ich noch nicht weiß.

    Nochmals herzlichen Dank
    web933
    :thumbsup: :thumbup: 8o