Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi iTunes COM Events (https://www.delphipraxis.net/142016-itunes-com-events.html)

Z4ppy 20. Okt 2009 21:33


iTunes COM Events
 
Ich versuche, die Events aus der iTunesLib zu benutzen, z.B. OnPlayerPlayEvent, OnPlayerStopEvent usw.
Nun habe ich mich schon halb tot gesucht nach Beispielen wie man diese verwendet, aber leider nur wenig und vor allem nichts funktionierendes gefunden.

Gefunden habe ich folgendes Material:

Hier auf DP:
  • iTUnes COM Interface - Events werden hier überhaupt nicht behandelt
  • COM-Events verwenden - Das verlinkte Tool war relativ hilfreich, das Beispiel mit Jabber hingegen absolut nicht, ich konnte es nicht auf iTunes übertragen...
  • iTunes-Track herausfinden - Hier wird mit dem Event gearbeitet, wie das Event verlinkt (oder wie auch immer man das nennt) wird, steht leider nirgends :(
Ausserdem habe ich diesen Thread gefunden, der Code dort ist aber für Delphi 6 und nicht für das von mir verwendete D7. Das Kompilieren gibt mir einen Fehler, dass iTunesLibIiTunesEvents1 kein Feld hätte und ob ich es entfernen will, wenn ich das verneine, gibt es zunächst mal eine AV bevor das Programm dann startet, allerdings ohne die Eventbehandlung... Beim Beenden gibts dann erneut eine AV :?

Natürlich habe ich auch das Beispiel bei CodeProject gefunden, da das aber in C# programmiert ist und ich von dieser Sprache keine Ahnung habe, hat mir das auch nicht wirklich geholfen...

Die offizielle Dokumentation von Apple konnte ich mir leider nicht ansehen, da man dafür einen Account im Mac Developer Program benötigt. Allerdings scheint diese ebenfalls nur Beispiele in C# und C++ zu haben, was mir wiederum äusserst wenig hilft...

Wie kann ich auf die Events reagieren?

MfG Z4ppy

sirius 20. Okt 2009 21:46

Re: iTunes COM Events
 
Zitat:

Ausserdem habe ich diesen Thread gefunden, der Code dort ist aber für Delphi 6 und nicht für das von mir verwendete D7.
Und warum sollte der code nicht in D7 gehen außer, dass dort anscheinend einiges weggelassen wurde?

Hast du dir die TypeLib erzeugt?

Z4ppy 20. Okt 2009 21:49

Re: iTunes COM Events
 
Liste der Anhänge anzeigen (Anzahl: 2)
Keine Ahnung, aber er scheint nicht zu funktionieren :lol:

Natürlich... Habe mal eben die beiden von EventSinkImp erstellten Dateien angehängt ;)

MfG Z4ppy

sirius 20. Okt 2009 22:24

Re: iTunes COM Events
 
Und was hast du jetzt gemacht?

Du musst also irgendwie dein ITunes starten:
Delphi-Quellcode:
var iTunes:IiTunes;

iTunes:=CoiTunesApp.Create;
Dann erstellst du eine Klasse, welche die Events empfängt:
Delphi-Quellcode:
var iTunesLibIiTunesEvents:TiTunesLibIiTunesEvents;

iTunesLibIiTunesEvents:=TiTunesLibIiTunesEvents.Create(nil); //oder eben mit Owner;
Dann verbindest du den Eventhandler mit iTunes:
Delphi-Quellcode:
//das funktioniert widererwartend "rückwärts"
iTunesLibIiTunesEvents.connect(iTunes);
Damit bekommt dein Objekt iTunesLibIiTunesEvents alle Ereignisse von iTunes mit. Du kannst auch problemlos mehrere Eventhandler bei iTunes connecten. Dann wird bei einem entspröchenden Ereignis eben jedes Objekt benachrichtigt.

Allerdings weis jetzt iTunesLibIiTunesEvents nocht nicht, was es bei einem Event machen soll. Bzw. bis jetzt macht es noch gar nichts, dafür musst du eben wie in Delphi gewohnt die Ereignisbehandlungsroutinen zuweisen:
Delphi-Quellcode:
type
  TiTunesLibIiTunesEvents = class (TiTunesLibEventsBaseSink)
  [...]
  published
    //SinkEventsPublished//
    property OnDatabaseChangedEvent: T_IiTunesEventsOnDatabaseChangedEventEvent read FOnDatabaseChangedEvent write FOnDatabaseChangedEvent;
    property OnPlayerPlayEvent: T_IiTunesEventsOnPlayerPlayEventEvent read FOnPlayerPlayEvent write FOnPlayerPlayEvent;
    property OnPlayerStopEvent: T_IiTunesEventsOnPlayerStopEventEvent read FOnPlayerStopEvent write FOnPlayerStopEvent;
    property OnPlayerPlayingTrackChangedEvent: T_IiTunesEventsOnPlayerPlayingTrackChangedEventEvent read FOnPlayerPlayingTrackChangedEvent write FOnPlayerPlayingTrackChangedEvent;
    property OnUserInterfaceEnabledEvent: T_IiTunesEventsOnUserInterfaceEnabledEventEvent read FOnUserInterfaceEnabledEvent write FOnUserInterfaceEnabledEvent;
    property OnCOMCallsDisabledEvent: T_IiTunesEventsOnCOMCallsDisabledEventEvent read FOnCOMCallsDisabledEvent write FOnCOMCallsDisabledEvent;
    property OnCOMCallsEnabledEvent: T_IiTunesEventsOnCOMCallsEnabledEventEvent read FOnCOMCallsEnabledEvent write FOnCOMCallsEnabledEvent;
    property OnQuittingEvent: T_IiTunesEventsOnQuittingEventEvent read FOnQuittingEvent write FOnQuittingEvent;
    property OnAboutToPromptUserToQuitEvent: T_IiTunesEventsOnAboutToPromptUserToQuitEventEvent read FOnAboutToPromptUserToQuitEvent write FOnAboutToPromptUserToQuitEvent;
    property OnSoundVolumeChangedEvent: T_IiTunesEventsOnSoundVolumeChangedEventEvent read FOnSoundVolumeChangedEvent write FOnSoundVolumeChangedEvent;
  end;
Jo, und dann sollte alles gehen. Ich habe (leider) kein iTunes, kann es deswegen nicht testen

Z4ppy 20. Okt 2009 23:45

Re: iTunes COM Events
 
Bin wohl zu müde, die Zuweisung hinzukriegen :wall:
Delphi-Quellcode:
iTunesEvents.OnPlayerPlayEvent:=Play;
geht schonmal nicht (wobei iTunesEvents das "iTunesLibIiTunesEvents" von deinem Code ist und Play eine Prozedur, die als Variable den Track erwartet)...
Als Fehler kommt vom Compiler "Incompatible types: 'method pointer and regular procedure'"...

Kann mir schnell noch jemand sagen, wie ich das machen muss? Sonst probier ichs morgen nochmal, wenn ich nich mehr so müde bin :lol:

MfG Z4ppy

sirius 21. Okt 2009 08:17

Re: iTunes COM Events
 
Such einfach mal nach deiner Fehlermeldung! Dieser Fehler wird hier in ca. jedem 100. Thread behandelt.

Delphi-Quellcode:
procedure play(...); //ist eine reguläre Prozedur

procedure TForm1.play(...); //ist eine Methode der Klasse TForm1.
Du benötigst das untere, hast aber das obere verwendet. Es ist übrigens egal, welcher Klasse die Methode angehört. Du solltest sie natürlich strukturell sinnvoll zuordnen.


btw.: Hast die beim Typelib-Import nur "Unit anlegen" oder gleich "Installieren" geklickt. Bei letzterem dürftest du deine Event-Klasse im Register "AxtiveX" auf der Komponentenleiste finden. Da kannst du dann die Ereignisse ganz normal zuweisen.

Z4ppy 21. Okt 2009 14:28

Re: iTunes COM Events
 
Die Suche ergab genau 2 Ergebnisse, eines davon dieser Thread ;) Aktuell gibt es 151.924 Threads, es müssten also nach deiner Aussage ca. 1500 Ergebnisse kommen ^^

Danke, jetz gehts *freu*

:dp:

MfG Z4ppy

Z4ppy 23. Okt 2009 23:10

Re: iTunes COM Events
 
Ich denke, es ist sinnvoll, das auch hier reinzunehmen :)

Gibt es ein Event, das ausgelöst wird, wenn die Wiedergabe pausiert wird? Bei Play wird ja das OnPlayerPlayEvent ausgelöst, bei Stop OnPlayerStopEvent. Aber ich hab nichts für Pause gefunden :(

MfG Z4ppy

sirius 26. Okt 2009 11:50

Re: iTunes COM Events
 
Dazu musst du die Dokumentation lesen, oder die Frage nochmal mit einer entsprechenden Überschrift in einem neuen Thread öffnen, damit den auch jemand liest, der sich damit auskennt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz