Frage zu Events und Delegate
-
OK, ich weiß die Frage ist dumm, und jeder ders kapiert hat, wird darüber lachen
. Aber ich muss sie jetzt einfach stellen.
Kann mir jemand auf ganz banale weise erklären wie das mit den Events funktioniert. Ich hab jetzt im Internet schon mehrere Stunden verbracht. Is ja nicht so das ich nichts gefunden hätte. Aber ich bin da einfach nicht durchgestiegen. Ich bin keiner von denen die das auswendig lernen können. Ich will es mal verstanden haben.
Und irgendwie vestehe ich das ganze System mit den Events nicht so ganz. Gut ich weiß, wenn ich ein Event habe, dieses auslöse, kann ich mit eine Funktion auf dieses Event reagieren lassen. Aber hier hängt für mich auch schon ein Haken. Alle Beispiele ich gesehen haben rufen die Funktion nicht auf, und die Funktion hängt Irgendwie nicht mit drin.
Wie gefragt, kann mir das einer an einem GANZ einfachen Beispiel erklären. Oder hat jemand einen Code, ein Tutorial wo das ganz einfach erklärt wird?
Gruß
Markus Seidl
-
Äh, also ich habe das thema in einigen büchern gelesen und ich finde das dieses dort total voll gut erklärt wird.
empfehlen kann ich dir c# in 21 tagen, c# kompendium
-
delegaten sind im Grunde genommen einfach Zeiger bzw. Listen mit Zeiger auf Funktionen.
z.B. mit der Anweisung:
this.button1.Click += new System.EventHandler(this.button1_Click);
wird der Liste des Click-delegates der Button-Klasse ein Zeiger auf die Funktion button1_Click hinzugefügt.
mitthis.button1.Click -= new System.EventHandler(this.button1_Click);
wird er wieder aus der Liste entfernt
Beim Auslösen des Events mit
Click(new EventArgs());
läuft delegate seine Liste durch und ruft die hinzugefügten Funktionen auf.
-
Danke Xqgene, jetzt habe ich mir endlich selbst einen Delegaten inklusive Event basteln können. Ich nahm jetzt deine Erklärung, und konnte mit den Beispielen aus dem Web wesentlich MEHR anfangen, und jetzt habe ich es eben geschaft ein Ereignis auszulösen. Alles was jetzt kommt ist nur noch feinarbeit.
Eine Frage bleibt jedoch. Ich habe es jetzt nicht auf deinem Weg geschafft, sondern es IRGENDWIE anders hinbekommen. Den Weg den ich gefunden habe ist zwar auch leicht, aber für mich ergibt es einfach mehr Sinn, wenn man Funktionen mit einem + hinzufügt.
Hier mal mein Code den ich hatte.
#region Using directives using System; using System.Text; using System.Net; using System.Collections; using System.Threading; using System.Runtime.InteropServices; #endregion class test { public delegate void NewEvent(object sender, EventArgs e); static void Main(string[] args) { Execute myExecute = new Execute(); NewEvent myEvent = new NewEvent(myExecute.printTest); myEvent(new object(), new EventArgs()); } } class Execute { public void printTest(object o, EventArgs e) { Console.WriteLine("Guten Morgen"); } }
Man sieht ich lege einen Delegaten an, im Main Block erzeuge ich dann eine Instanz vom Delegaten sowie der Klasse "Execute". In der Delegateninstanz speichere ich einen "Zeiger" auf "myExecute.printTest".
Und zum Schluss erzauge ich das Event mit myEvent(new object(), new EventArgs());
Wie komme ich jetzt das zu das mit dem + zu verwenden. Müssten ja dann die Multicast's sein, wenn ich mich nicht täusche.
Gruß
Markus Seidl
-
Aus ".NET SDK Doku"
Die meisten Programmiersprachen implementieren das Schlüsselwort delegate, und Compiler für diese Sprachen können von der MulticastDelegate-Klasse ableiten. Benutzer sollten daher das von der Sprache bereitgestellte Schlüsselwort delegate verwenden.
Also hast du betreits einen MulticastDelegate
-
Heißt das wirklich Delegaten?
Hört sich ja übelst an. Ich glaube das Wort gibt es nicht in Deutsch.
-
Delegaten? Wohl eher delegieren. Find ich aber für Funktionspointer nicht wirklich passend.
-
Angren Aldaron schrieb:
Danke Xqgene, jetzt habe ich mir endlich selbst einen Delegaten inklusive Event basteln können. Ich nahm jetzt deine Erklärung, und konnte mit den Beispielen aus dem Web wesentlich MEHR anfangen, und jetzt habe ich es eben geschaft ein Ereignis auszulösen. Alles was jetzt kommt ist nur noch feinarbeit.
Eine Frage bleibt jedoch. Ich habe es jetzt nicht auf deinem Weg geschafft, sondern es IRGENDWIE anders hinbekommen. Den Weg den ich gefunden habe ist zwar auch leicht, aber für mich ergibt es einfach mehr Sinn, wenn man Funktionen mit einem + hinzufügt.
Hier mal mein Code den ich hatte.
#region Using directives using System; using System.Text; using System.Net; using System.Collections; using System.Threading; using System.Runtime.InteropServices; #endregion class test { public delegate void NewEvent(object sender, EventArgs e); static void Main(string[] args) { Execute myExecute = new Execute(); NewEvent myEvent = new NewEvent(myExecute.printTest); myEvent(new object(), new EventArgs()); } } class Execute { public void printTest(object o, EventArgs e) { Console.WriteLine("Guten Morgen"); } }
Man sieht ich lege einen Delegaten an, im Main Block erzeuge ich dann eine Instanz vom Delegaten sowie der Klasse "Execute". In der Delegateninstanz speichere ich einen "Zeiger" auf "myExecute.printTest".
Und zum Schluss erzauge ich das Event mit myEvent(new object(), new EventArgs());
Wie komme ich jetzt das zu das mit dem + zu verwenden. Müssten ja dann die Multicast's sein, wenn ich mich nicht täusche.
Gruß
Markus Seidl
Kann sein das ich mich täusche, aber in dem ganzen Sourcecode wurde doch nicht ein einziges Event definiert oder gefeuert. Hier wurde doch lediglich eine Delegate benutzt, oder?
-
übel schrieb:
Heißt das wirklich Delegaten?
Hört sich ja übelst an. Ich glaube das Wort gibt es nicht in Deutsch.
Doch, gibt es.
-
@Optimizer: 2. Fall Genitiv, des Delegaten (hab ich recht? War in Deutsch ne Niete. Hatte auf der Realschule in der Abschlussprüfung eine 5 geschrieben. Mit na mündlichen 3 konnte ich mich zum Glück wieder auf die 4 retten), kann sein dass ich es vorher falsch verwendet habe.
@Interpreter: Wie gesagt, ich kenne mich da noch nicht aus. Und Ja, ich rufe einfach nur den Delegat auf, damit er die ihm zugewiesenen Funktionen benachrichtigt.
@ All: Ich sag jetzt einfach mal wofür ich es brauche.
Ich lade eine Datei herunter. Während die runtergeladen wird, ermittle ich in einem Worker-Thread, was schon heruntergeladen wurde, und wie groß die Datei eigentlich ist. Rundum läufts letztendlich darauf hinaus, dass ich einen Status konstruiere, der mir am Ende einen String ausgibt. Diesen String übergebe ich dann einfach einem Label.
Und da sich mein Debugger (aber nicht das fertige Programm) dann immer beschwert, dass ich aus einem Worker Thread auf ein Element in der Dialogfeldklasse zugreife,
Illegal cross-thread operation
und ich den Tipp bekommen habe, ich solle dies über Events regeln, wollte ich das eben über Events regeln.
Wenn ich euch jetzt noch sage, warum ich überhaupt bei C# gelandet bin, werdet ihr mich hier gleich für komplett Irre abgestempeln
.
Ich war ursprünglich bei Visual C++ 6.0 (da war das mit den Threads und den Zugriff auf die Dialogfeldklasse viel einfacher). Ich habe es jedoch nach 4 Wochen nicht auf die Reihe bekommen einen DownloadStatus hinzuzufügen. Kurzum, nach 4 Foren, auch dieses hier, und keiner richtigen Antwort, wollte ich einfach mal C# ausprobieren. Hab mal flinke flinke in 2 Tagen das Galileo OpenBook durgewerkelt. Bin auf den Tip gestoßen, dass Microsoft ein Visual C# als Beta umsonst vergibt, und hab mir das gesaugt.
Dann habe ich meinen FTP-Client komplett neu aufgesetzt. Jetzt kann ich anstandslos, während des Downloads, die Daten abfragen, aber nicht setzen. Vorher wars umgekehrt. So und hier bin ich. Die 4 Wochen waren schon im Dezember zu Januar hin. Der Download und das durcharbeiten von Galileo OpenBook war letzte Woche.So aber das wolltet ihr garnicht wissen. Summa Summarum. Nur wegen eines Download Status' habe ich die Sprache gewechselt. Und jetzt finde ich sie garnicht schlecht, bis auf diese "Kinderkrankheiten" (mein NICHT-Können) die ich mit Visual C++ einfach nicht hatte.
So und nu wieder zurück zum Thema, mit dem String der sich ändert, wäre es jetzt schön, wenn diese Änderung des Strings (in einem Worker Thread) das Event wäre, welches den Code dazu veranlasst, den String in das Label zu übernehmen.
Den String würde ich dann als globale Variable in der Dialogfeldklasse deklarieren. Und keine Sorge, auf die Zugriffbeschränkungen brauche ich nicht achten. Der Worker Thread ist der einzige, der auf die Variable zum Schreiben zugreift. Erst diese Änderung würde ja hinterher den Code dazu veranlassen, diese Variable in das Label zu übernehmen.Gruß
Markus Seidl
PS: So und jetzt bin ich mir ziemlich sicher das keiner mehr Antworten möchte