![]() |
Callback innerhalb einer Klasse aufrufen...
Hallo,
ich habe folgendes Problem: Ich habe eine Klasse geschrieben, die mir die Arbeit mit der Bass Komponente erleichtern soll. Jetzt habe ich versucht eine Callbackfunktion einzubinden, die aktiv wird, sobald ein Lied an einer bestimmte Stelle angekommen ist. Auf diese Art und Weise will ich Crossfading implementieren, ohne einen Timer, oder ähnliches benutzen zu müssen. Nur habe ich jetzt das Problem, dass beim Aufruf der Callbackfunktion ein "Access Violation" gemeldet wird. Ich verstehe nicht, wieso das Passiert. Hier mal der betreffende Quelltext...
Delphi-Quellcode:
Sobald ich in der Callbackfunktion auf eine Variable zugreife oder eine Funktion ausführe, die ein Teil der Klasse ist, gibt es diese Fehlermeldung.
procedure Tbassfader.SetFadeSync(strX : HSTREAM);
var max_laenge : float; fade_start : QWord; procedure CallbackSync(SyncHandle: HSYNC; Channel, data, user: DWORD); stdcall; begin PlayFadeFile(AutoFadeFile,AutoFadeTime); end; begin max_laenge := BASS_ChannelBytes2Seconds(strX,BASS_StreamGetLength(strX)); fade_start := BASS_ChannelSeconds2Bytes(strX, max_laenge - (AutoFadeTime/1000)); BASS_ChannelSetSync(strX,BASS_SYNC_POS,fade_start,@CallbackSync,Dword(self)); end; Vielen Dank schonmal für eure Hilfe :) |
Re: Callback innerhalb einer Klasse aufrufen...
Wozu gibt's Events ?
Dazu müsste auch einiges in der Hilfe stehen ... (Du hast in der Klasse einen Zeiger auf die Prozedur) |
Re: Callback innerhalb einer Klasse aufrufen...
ich denk mal es liegt daran das die die instanz der klasse noch nicht creiert wurde. Du also für die Callback zum beispiel so zugewiesen hast
Delphi-Quellcode:
aber dabei vergessen hast InstanzMeinerKlasse zu creieren (InstanzeMeinerKlasse := TInstanzmeinerKlasse.Create)
bass.callback := InstanzMeinerKlasse.OnCallback;
|
Re: Callback innerhalb einer Klasse aufrufen...
Zitat:
|
Re: Callback innerhalb einer Klasse aufrufen...
Oh, ihr seid ja schnell :shock:
@jfheins Ähm...ich muss zugeben, dass mir Events nicht so viel sagen :oops:. Inwieweit können die mir helfen? @SirThornberry Beim Aufruf der Klasse aus dem Hauptprogramm heraus wird doch eine Instanz erzeugt. Oder meinst du was anderes? @Luckie Ja, stimmt. Das leuchtet ein :). Aber wie mache ich die Callbackfunktion zu einer Methode meiner Klasse? Ich hatte probiert sie im Private Teil wie eine normale Funktion zu deklarieren. Dies hatte jedoch auch nicht so geklappt. Ich muss dazu sagen, dass ich ein Neuling im Erstellen von Klassen bin ;) |
Re: Callback innerhalb einer Klasse aufrufen...
Hallo,
Zitat:
Delphi-Quellcode:
sonst führst du code in einer klasse aus, ohne die klasse und das objekt zu kennen. Hoffe meine annahmen sind richtig?
procedure CallbackSync(SyncHandle: HSYNC; Channel, data, user: DWORD); stdcall;
begin Tbassfader(user).PlayFadeFile(AutoFadeFile,AutoFadeTime); // user rulez! end; procedure Tbassfader.SetFadeSync(strX : HSTREAM); var max_laenge : float; fade_start : QWord; begin max_laenge := BASS_ChannelBytes2Seconds(strX,BASS_StreamGetLength(strX)); fade_start := BASS_ChannelSeconds2Bytes(strX, max_laenge - (AutoFadeTime/1000)); BASS_ChannelSetSync(strX,BASS_SYNC_POS,fade_start,@CallbackSync,Dword(self)); end; |
Re: Callback innerhalb einer Klasse aufrufen...
Vielen Dank maximov!
Jetzt funktioniert der Aufruf der Callbackfunktion einwandfrei. Die Formatierung des Quelltextes ist beim kopieren ins Forum verloren gegangen. Ich bin unschudig :) Jetzt hab ich nurnoch ein Problem... Wenn ich aus dieser Callback auf Variablen der Klasse zugreifen will, sind diese irgendwie "leer". Zumindest steht nicht das drin, was eigentlich drin stehen sollte. Ist meine Art, auf die Variablen zuzugreifen, denn überhaupt richtig so?
Delphi-Quellcode:
Ich merke grad...das ist wohl ein anderer Fehler meinerseits. Ich suche ihn mal ;)
procedure CallbackSync(SyncHandle: HSYNC; Channel, data, user: DWORD); stdcall;
var FileName : PChar; FTime : Integer; begin FileName := Tbassfader(user).AutoFadeFile; <<<---geht das so??? FTime := Tbassfader(user).AutoFadeTime; <<<---geht das so??? Tbassfader(user).PlayFadeFile(FileName,FTime); end; procedure Tbassfader.SetFadeSync(strX : HSTREAM); var max_laenge : float; fade_start : QWord; begin max_laenge := BASS_ChannelBytes2Seconds(strX,BASS_StreamGetLength(strX)); fade_start := BASS_ChannelSeconds2Bytes(strX, max_laenge - (AutoFadeTime/1000)); BASS_ChannelSetSync(strX,BASS_SYNC_POS,fade_start,@CallbackSync,Dword(self)); end; Vielen Dank für eure schnelle und kompetente Hilfe!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz