Events aus Instanz einer Klasse werden nicht verarbeitet

  • VB.NET

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

    Events aus Instanz einer Klasse werden nicht verarbeitet

    Hallo liebe Leute,

    ich habe ein Event in einer Klasse definiert, das beim Instanzieren dieser Klasse ausgelöst, jedoch in einer anderen Klasse, die quasi den Programmkern bildet, behandelt werden soll.

    mein Code vereinfacht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Programmkern
    2. Public Class Form1
    3. Public WithEvents MyDT As New DT 'für weiteren Ablauf benötigt
    4. Public Sub MyDT_DTEvent(ByVal sender As Object, ByVal e as System.EventArgs) Handles MyDT.DTEvent
    5. '
    6. ' (?) PROBLEM: Dieses Sub wird einfach nicht ausgeführt. WARUM?
    7. '
    8. End Sub
    9. End Class
    10. 'ChildClass
    11. Public Class DT
    12. Inherits DataTable
    13. Public Event DTEvent(ByVal sender As Object, ByVal e as System.EventArgs)
    14. Protected Sub OnDTEvent(ByVal sender As Object, ByVal e as System.EventArgs)
    15. RaiseEvent DTEvent(sender, e)
    16. End Sub
    17. Sub New()
    18. 'Mach irgendwas ... und löse folgendes Event aus!
    19. OnDTEvent(Me, System.EventArgs.Empty)
    20. End Sub
    21. End Class


    Mein Handbuch schreibt, programmier das Ganze nach obigem Schema und es wird funktionieren. Tut es aber nicht. Das Event aus MyDT wird in Form1 einfach nicht ausgewertet, nur in der Klassse MyDT selbst. Selbst IntelliSense generiert mir das wie oben beschrieben. Was kann ich noch tun, damit das Ganze funktioniert?
    Hey,

    wie soll ein Event ausgelöst werden, wenn noch gar keine Instanz dieser Klasse besteht? Das ist unfug. Das Ergebnis siehst Du ja selber, nämlich keines. Wenn Du dies unbedingt benötigst, dann kannst Du dem Konstruktor einen Delegaten mitgeben, der während der Instanzierung ausgeführt wird. Jedoch halte ich davon auch nicht wirklich was.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Die Instanzierung ist abgeschlossen, wenn die Sub New() durchlaufen wurde. Mehr gibt es dazu nicht zu sagen. Du feuerst das Event mitten drin, hier ist noch gar nichts abgeschlossen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das Event wird schon gefeuert, aber es wird nirgends empfangen. Das Handles-Schlüsselwort ist nur ein Compilerfeature und wird bei kompilieren in einen AddHandler-Ausdruck umgeformt. AddHandler funktioniert aber erst, sobald ein Objekt da ist, das ist aber erst nach dem Aufruf von New der Fall, das Event wird aber schon vor der Beendigung von New ausgelöst. Folglich wird AddHandler erst ausgeführt, nachdem das Event ausgelöst wurde.

    Dein Vorhaben macht aber sowieso keinen Sinn. Events sind dazu da, um nach außen mitzuteilen, wenn irgend was passiert ist. Der Aufrufer weiß aber, wann er das Objekt instanziert hat, das braucht das Objekt nicht noch mitzuteilen.
    Es geht mir nicht darum, dem Anwender zu sagen, dass die Instanzierung abgeschlossen wurde. Bis jetzt war ich der Meinung, die Funktion New() könne dazu genutzt werden, die Klasse zu automatisieren, dass sie sich quasi beim erstellen selbst verwaltet und nicht durch externe Aufrufe in ihr definierter Funktionen gesteuert werden muss. Die Klasse soll als Schnittstelle zu einer *.txt-Datei dienen, in der Programmeinstellungen (ca. 1.500 Zeilen) verwaltet werden. Mit weiteren Events soll dem Programmkern mitgeteilt werden, wie weit unter Anderm der Im- bzw. Export dieser Einstellungen vorangeschritten ist, um eine Fortschrittanzeige daran zu koppeln.

    Anscheinend ist meine Vorgehensweise alles Andere als optimal, so wie ich das sehe.
    Dann müsste ich mir quasi in der Klasse ein Methode LeseDatenAusTxt generieren, in der irgendein Event aus der Klasse aufgerufen wird mit OnEventxxx, und diese dann unter Form1 mittels MyDT.LeseDatenAusTxt aufrufen oder gibt es eine andere Möglichkeit, mit der sich die Klasse selbst darum kümmern könnte?
    Warum denn Events? Die Klasse muss sich selbst nichts mitteilen, Events sind nur dazu da, den Aufrufer zu benachrichtigen.
    Ansonsten passts so. Genau so und nicht anders will mans auch haben. Der Aufrufer alleine bestimmt, wann was passiert, niemand würde ne Klasse programmieren, die plötzlich von selbst anfängt irgend was zu machen, ohne dass man das Los gegeben hat.