[GELÖST] In DLL Event auslösen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    [GELÖST] In DLL Event auslösen

    Moin,

    ich möchte meine DelayMsgBox gerne noch ein wenig erweitern und ein Event auslösen lassen, wenn die angegebene DelayZeit abgelaufen ist.
    Mein momentaner Code in der DLL sieht so aus:

    VB.NET-Quellcode

    1. Public Class DelayMsgBox
    2. Shared iDelay As Integer = 0
    3. Shared iMsgBoxDelay As Integer = 0
    4. Shared Function Show(ByVal text As String, Optional ByVal caption As String = Nothing, Optional ByVal delay As Integer = -1, Optional ByVal button As DelayBoxButtons = DelayBoxButtons.Ok, Optional ByVal icon As DelayBoxIcons = DelayBoxIcons.None) As DelayBoxResult
    5. Dim tmeDelayed As New Timers.Timer
    6. ' noch anderer Code
    7. If delay < 0 Then
    8. iMsgBoxDelay = delay
    9. tmeDelayed.Interval = 1000
    10. tmeDelayed.Enabled = True
    11. End If
    12. AddHandler tmeDelayed.Elapsed, AddressOf tmeDelayed_Tick
    13. Return ' irgendwas
    14. End Function
    15. Private Shared Sub tmeDelayed_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    16. iDelay += 1
    17. If iDelay >= iMsgBoxDelay Then
    18. RaiseEvent Delayed()
    19. End If
    20. End Sub
    21. Shared Event Delayed()
    22. End Class


    Aber wenn ich die nun in einer Form das Event nutzn möchte wird es mir nicht angezeigt! Was mache ich denn falsch?
    Sry wenns total wirr ist, habe mich noch nie mit Events und sowas auseinander gesetzt =)

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

    Sry fürn Doppelpost, aber ich habe der einfachkeitshalber nochtmal ein extra Projekt ohne DLL Einbindung sondern einfacher Klasse gemacht.
    Ich habe es hinbekommen, das nun das Event auch im Namespace angezeigt wird. Beim Debuggen tritt kein Fehler auf, aber auch das Event wird nicht ausgeführt.

    Class1.vb

    VB.NET-Quellcode

    1. Public Class DelayMsgBox
    2. Public Event Delayed(ByVal delay As Integer)
    3. Public Function Show()
    4. RaiseEvent Delayed(5)
    5. Return True
    6. End Function
    7. End Class


    Form1.vb

    VB.NET-Quellcode

    1. Public Class Form1
    2. Friend WithEvents DelayEvent As DelayMsgBox
    3. Dim DelayBox As New DelayMsgBox
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. DelayBox.Show()
    6. End Sub
    7. Private Sub DelayMsgBox_Delayed(ByVal delay As Integer) Handles DelayEvent.Delayed
    8. MessageBox.Show("Abgelaufen: " & delay)
    9. End Sub
    10. End Class


    Ich rufe also in der Funktion Show() direkt das RaiseEvent auf, aber die Sub DelayMsgBox_Delayed wird trotzdem nicht ausgeführt!
    Kann ja auch nicht gehen ;)

    DelayEvent ist als WithEvents deklariert, aber dieses Objekt wird nie instanziert.
    Stattdessen gibt es das Objekt DelayBox. Dessen Event wird aber nicht gehandelt, weil der Handler ja nur "handles DelayEvent.DelayEvent" macht.


    Also einfach:
    Private WithEvents DelayBox As New DelayMsgBox

    und dann den entsprechenden Handler über die IDE erzeugen, so dass da dann steht "... handles DelayBox.DelayEvent"
    Japs das habe ich nun auch rausgefunden ^^ ist ja auch eigentlich logischer so. Aber naja learning by doing! Das Beispiel Projekt funktioniert nun auch mit dem Timer der Alauft und dann das Event ausführt. Nur leider in Kombination mit der MessageBox nicht mehr. Sie wird angezeigt, aber irgendwie scheint der Timer im hintergrund dann nicht mehr mitzulaufen!
    Liegts daran, dass die MsgBox modal geöffnet wird? Also mit ShowDialog?

    Ich würde das auslösen des Events über den Timer aber sowieso lassen.
    timers.timer feuert sein _Elapsed Event nämlich nicht im UI-Thread, sondern im einem eigenen. Genau das gleiche gilt dann für das ausgelöste Event. Mit der Konsequenz, dass man in diesem Codeteil (eventhandler) nicht einfach auf controls zugreifen darf, sondern invoke verwenden muss. Ansonsten gibts nen IllegalCrossThreadCall Fehler ;)

    Und WENN die MsgBox modal geöffnet wird, gibt's ja eh immer einen Rückgabewert, da der aufrufende Code solange steht, bis die MsgBox wieder geschlossen wird. Entweder per Klick oder per Timer.
    Japs dasmit den extra Thread habe ich auch schon bemerkt, als ich ein Event gemacht habe, welches mir die Delays ausgibt und eine MsgBox konnte ich starten aber eben nicht in ein Label die vergangenen Sekunden packen.

    Aber das mit dem Rückgabewert muss ich mal testen, ob nach dem Delay 0 zurückgegeben wird, das könnte ich ja verwenden um den Delayed Event auszuführen!

    Edit: ja sehr geil ^^ man wieso denke ich bloß immer so kompliziert, wenn es doch so einfach geht. Also bei einem Timeout wird -1 zurückgegeben und hierbei einfach das Delay() Event ausgeführt.
    Frage hat sich damit erledigt! Thx nochmal an alle, langsam komme ich dahinter was dort so passiert!

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