Autor Beitrag
pimpl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Di 28.08.12 13:34 
Guten Tag!

Ich benutze die DirectX.AudioVideoPlayback-Erweiterung für die Programmierung eines Videoplayers.
Unter folgendem Link sind Objektereignisse, -methoden und -eigenschaften aufgelistet:
msdn.microsoft.com/e...281556(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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 28.08.12 15:03 
Hallo,

genau dasselbe was auch der Designer als Code erzeugt ;-)

Dies nennt man "ein Ereignis abonnieren":
ausblenden C#-Quelltext
1:
video.Ending += Video_Ending;					

Und Video_Ending ist dann deine Methode, welche du noch implementieren mußt:
ausblenden C#-Quelltext
1:
2:
3:
4:
void Video_Ending(object sender, EventArgs e)
{
  // ...
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Di 28.08.12 17:23 
Die Anweisung
ausblenden 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:
ausblenden 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 user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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."
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormHaupt()); // <<-- HIER TRITT DER FEHLER AUF!
        }
    }

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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 ;-)).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 29.08.12 11:03 
Du hast in einem EventHandler von film Dispose auf sich selbst aufgerufen :shock:

Vielleicht solltest du dir erst mal klar werden was in .NET bedeutet ein Objekt zu disposen. Helfen könnte dabei

Die IDisposable Schnittstelle
Grundlagen Garbage Collection
pimpl Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 29.08.12 13:16 
Ok, alles klar. Habe verstanden.
Nochmals vielen Dank für die gute Hilfestellung!