Entwickler-Ecke
WinForms - DirectX.AudioVideoPlayback - Objektereignisse aufrufen?
pimpl - Di 28.08.12 13:34
Titel: DirectX.AudioVideoPlayback - Objektereignisse aufrufen?
Guten Tag!
Ich benutze die DirectX.AudioVideoPlayback-Erweiterung für die Programmierung eines Videoplayers.
Unter folgendem Link sind Objektereignisse, -methoden und -eigenschaften aufgelistet:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb281556(v=vs.85).aspx
In meinem Programm möchte ich dem Ereignis "Ending" eines Video-Objektes bestimmte Anweisungen zuordnen, jedoch weiß ich nicht, wie ich dies tun kann.
Bei Controls-Elementen kann ich im Designer-Modus einfach ein Ereignis auswählen und Doppelklicken, danach erscheint der Ereignisaufruf bereits im Quellcode. Wie erreiche ich dasselbe mit den Video-Objekt Ereignissen?
Ich bedanke mich für Eure Hilfe!
Th69 - Di 28.08.12 15:03
Hallo,
genau dasselbe was auch der Designer als Code erzeugt ;-)
Dies nennt man "ein Ereignis abonnieren":
C#-Quelltext
1:
| video.Ending += Video_Ending; |
Und Video_Ending ist dann deine Methode, welche du noch implementieren mußt:
C#-Quelltext
1: 2: 3: 4:
| void Video_Ending(object sender, EventArgs e) { } |
Ralf Jansen - Di 28.08.12 15:11
ergänzend, sobald du im Code das += hinter den Event geschrieben hast sollte ein kleiner Tooltip aufgehen. Dann einfach TAB TAB klicken und du bekommst den Rest generiert einschließlich der korrekten EvntArgs Ableitung in den Parametern der Methode.
Th69 - Di 28.08.12 16:05
Verrat doch nicht alles :)
Aber du hast recht, dies erleichtert es, die korrekten EventArgs zu verwenden - anstatt in der Doku nachschauen zu müssen oder aber die Compilerfehlermeldung zu interpretieren.
pimpl - Di 28.08.12 17:23
Die Anweisung
C#-Quelltext
1:
| video.Ending += Video_Ending; |
setze ich doch in die Form_Load-Methode, oder?
Ich habe es nun so gemacht, wie von euch vorgeschlagen und bei der void Video_Ending-Methode wurde mir folgendes hinzugefügt:
"throw new NotImplementedException();"
k.A. was ich damit anfangen soll. Kann ich das einfach löschen? Wenn ich es nicht lösche und das Ende eines Videos wird erreicht erscheint folgende Exception:
"Die Methode oder der Vorgang sind nicht implementiert."
Ich habe dann einfach mal zum testen in der Ending-Methode die Zeile mit "throw new NotImplementedException();" gelöscht und folgende Anweisung gesetzt:
C#-Quelltext
1:
| MessageBox.Show("Ende erreicht."); |
Wird nun das Ende des Videos erreicht
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Was habe ich falsch gemacht??
Vielen Dank für die Hilfe!
Moderiert von
Th69: C#-Tags hinzugefügt
Ralf Jansen - Di 28.08.12 17:30
| Zitat: |
| "throw new NotImplementedException();" |
Ist ein Platzhalter für den Code den du ausführen möchtest. Also ersetzen so wie du es bereits herausgefunden hast.
| Zitat: |
| "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." |
Hat direkt nichts mit dem Event. Von wo genau kommt den die Exception? Solltest du eigentlich beim debuggen oder aus dem StackTrace zur Exception ersehen können.
pimpl - Mi 29.08.12 10:26
Also ich glaube das Problem tritt aufgrund der Dispose Anweisung bei Video-Objekten auf!
Unter "Programm.cs" - "Application.Run(new FormHaupt());" erhalte ich eine "NullReferenceException wurde nicht behandelt." Nachricht. ferner steht da:
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormHaupt()); } } |
Zu meinem Programmcode:
ich erhalte ein Array mit speicherpfaden von Videodateien und habe eine Funktion "abspielen", welche nacheinander alle videos aus dem Array wiedergibt. In "abspielen" wird ein neues Video-Objekt erzeugt (
film = new Video(speicherpfad);).
in der Form_Load methode habe ich dem videoobjekt 'film' die ereignismethode 'film_Ending' (
film.Ending += new EventHandler(film_Ending);) zugewiesen in welcher zunächst "
film.Dispose();" steht. Anschließend wird den nächste eintrag aus dem speicherpfad-array aufgerufen und der methode 'abspielen' übergeben, welcher erneut ein videoobjekt namens 'film' erzeugt.
Ich habe als alternative die anweisung "
film.Ending += new EventHandler(film_Ending);" in der methode 'abspielen' gleich nach der Anweisung "film = new Video(speicherpfad);" geschrieben, sodass der eventhandler immer dem aktuellen videoobjekt zugewiesen wird, jedoch ist der Fehler derselbe.
Hat irgendjemand eine Idee, woran der fehler liegen könnte?
Danke für die Hilfe!
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Mi 29.08.12 10:59
Hallo pimpl,
lerne mit dem Debugger umzugehen. Sobald die Exception-Meldung erscheint kannst du unter "Details" dir weitere Infos darüber anzeigen lassen, u.a. den Stacktrace (d.h. welche Methoden den Fehler erzeugt haben).
Und dann setze einfach einen Haltepunkt (breakpoint) auf die entsprechende(n) Codezeile(n) und schau nach, welche Variable ungültig (null) ist (dazu dann dein Programm noch mal neu starten ;-)).
pimpl - Mi 29.08.12 13:16
Ok, alles klar. Habe verstanden.
Nochmals vielen Dank für die gute Hilfestellung!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!