AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Callback innerhalb einer Klasse aufrufen...
Thema durchsuchen
Ansicht
Themen-Optionen

Callback innerhalb einer Klasse aufrufen...

Ein Thema von BenTech · begonnen am 7. Apr 2005 · letzter Beitrag vom 7. Apr 2005
Antwort Antwort
BenTech

Registriert seit: 16. Jun 2003
Ort: Dortmund
60 Beiträge
 
Turbo Delphi für Win32
 
#1

Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 16:43
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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 16:48
Wozu gibt's Events ?
Dazu müsste auch einiges in der Hilfe stehen ...

(Du hast in der Klasse einen Zeiger auf die Prozedur)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 16:50
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
  bass.callback := InstanzMeinerKlasse.OnCallback; aber dabei vergessen hast InstanzMeinerKlasse zu creieren (InstanzeMeinerKlasse := TInstanzmeinerKlasse.Create)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 16:54
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
BenTech

Registriert seit: 16. Jun 2003
Ort: Dortmund
60 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 17:11
Oh, ihr seid ja schnell

@jfheins
Ähm...ich muss zugeben, dass mir Events nicht so viel sagen . 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
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 17:25
Hallo,

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?
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat
BenTech

Registriert seit: 16. Jun 2003
Ort: Dortmund
60 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Callback innerhalb einer Klasse aufrufen...

  Alt 7. Apr 2005, 17:43
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!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 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