Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Callback innerhalb einer Klasse aufrufen... (https://www.delphipraxis.net/43715-callback-innerhalb-einer-klasse-aufrufen.html)

BenTech 7. Apr 2005 16:43


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:
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;
Sobald ich in der Callbackfunktion auf eine Variable zugreife oder eine Funktion ausführe, die ein Teil der Klasse ist, gibt es diese Fehlermeldung.

Vielen Dank schonmal für eure Hilfe :)

jfheins 7. Apr 2005 16:48

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)

SirThornberry 7. Apr 2005 16:50

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:
  bass.callback := InstanzMeinerKlasse.OnCallback;
aber dabei vergessen hast InstanzMeinerKlasse zu creieren (InstanzeMeinerKlasse := TInstanzmeinerKlasse.Create)

Luckie 7. Apr 2005 16:54

Re: Callback innerhalb einer Klasse aufrufen...
 
Zitat:

Zitat von BenTech
Sobald ich in der Callbackfunktion auf eine Variable zugreife oder eine Funktion ausführe, die ein Teil der Klasse ist, gibt es diese Fehlermeldung.

Da deine callback Funktion keine Methode deiner Klasse ist, kann sie ja auch gar nicht irgendwelche Variablen deiner Klasse kennen. Ist eigentlich auch logisch oder?

BenTech 7. Apr 2005 17:11

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 ;)

maximov 7. Apr 2005 17:25

Re: Callback innerhalb einer Klasse aufrufen...
 
Hallo,

Zitat:

Zitat von BenTech
...
Delphi-Quellcode:
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;

hätte das da einer korrekt eingerückt, wie ich es jetzt getan hab, dann wäre klar, das es eine nestet-procedure ist, dh. eine unter-procedure in einer methode. Bass braucht aber eine richtige callback-handler-procdure (ausserhalb von klassen und methoden). Das ist auch der grund warum du noch auf felder der klasse greifen konntest. Also eher so:

Delphi-Quellcode:
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;
sonst führst du code in einer klasse aus, ohne die klasse und das objekt zu kennen. Hoffe meine annahmen sind richtig?

BenTech 7. Apr 2005 17:43

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:
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;
Ich merke grad...das ist wohl ein anderer Fehler meinerseits. Ich suche ihn mal ;)
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