ich habe ein Problem bei der Übergabe eines Zeigers auf eine Prozedur. Das Problem tritt bei mir zwar bei der Einbindung der BASS Audiobibliothek auf, es gibt aber sicherlich auch viele andere Anwendungsfälle. Man muss die Library also nicht kennen, um mein Problem nachvollziehen zu können.
Ich habe zur besseren Verwendung eine TMediaPlayer-Klasse gebaut. Beim Öffnen einer neuen Audiodatei soll unter anderem EndSync gesetzt werden, ein Zeiger auf eine Prozedur, die immer beim Ende der Wiedergabe ausgeführt wird. Ich möchte dann ein eigenes Ereignis auslösen:
Code: Alles auswählen
TMPEndFileEvent = procedure(Sender: TObject) of object;
TMediaPlayer = class
private
FHandle: DWORD;
FOnEndFile: TMPEndFileEvent;
procedure EndSync(Handle: HSYNC; Channel, Data: DWORD; User: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
public
procedure Open;
property OnEndFile: TMPEndFileEvent read FOnEndFile write FOnEndFile;
end;
{...}
procedure TMediaPlayer.Open;
begin
BASS_ChannelSetSync(FHandle, BASS_SYNC_END, 0, @EndSync, nil);
end;
procedure TMediaPlayer.EndSync(Handle: HSYNC; Channel, Data: DWORD; User: Pointer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
begin
// if Assigned(FOnEndFile) then FOnEndFile(Self);
end;
Error: Incompatible type for arg no. 4: Got "<procedure variable type of procedure(LongWord,LongWord,LongWord,Pointer) of object;StdCall>", expected "<procedure variable type of procedure(LongWord,LongWord,LongWord,Pointer);StdCall>"
Wenn ich die Prozedur nicht als Methode meiner Klasse sondern "alleinstehend" implementiere, dann könnte ich zwar ohne Fehler kompilieren, ich hätte dann aber keinen Zugriff mehr auf Attribute der TMediaPlayer-Instanz. Ich kann das Ereignis OnEndFile also dann nicht auslösen.
Kann man dieses Problem irgendwie beheben? Ich kenne mich bei solchen Zeigergeschichten nicht so gut aus...
Vielen Dank schonmal für eure Hilfe!