Hallo Delphianer,
bastel gerade an einer Klasse, welche als "Zwischenschicht" dienen soll.
Und zwar für die TBassdllPlayerEx und meiner/ irgendeiner Anwendung.
Nun gut, hier ein Codefetzen, welcher leider nicht funktioniert.
Vielleicht hat jemand rat.
Delphi-Quellcode:
unit uBassInterfaceLayer;
interface
uses
Forms,
// application.processmessages
SysUtils, Classes, Controls, ExtCtrls,
BassChannelU,
BassdllPlayerEx
;
var // Thread variables needs declaration here ?!
_indiFadeouttime: Byte;
_Threadruns: boolean;
type
TFadeoutThread =
class(TThread)
procedure Fadeout;
procedure Execute;
override;
procedure _ThTimer1Event(Sender: TObject);
procedure _ThTimer2Event(Sender: TObject);
end;
type
TBassInterfaceLayer =
class(TBassdllPlayerEx)
private
{ Private declarations }
(* variables *)
(* getter and setter *)
(* intern algos *)
procedure Stop(whichone: Byte; Fadeouttime: Byte);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
(* Properties *)
(* Methodes *)
procedure Bil_Stop(Crossfadetime: byte);
end;
// type
implementation
var
_internBass1: TBassdllplayerEx;
_activeBass: Byte = 2;
// so it will start with 1 !
_ThTimer1: TTimer;
(* ************ *)
(* intern algos *)
(* ************ *)
procedure TFadeoutThread.Execute;
begin
Fadeout;
end;
procedure TFadeoutThread.Fadeout;
label goon;
begin
_Threadruns := true;
try
if _activeBass = 1
then
begin
while _internBass1.Channel[0].Volume > 0
do
begin
_internBass1.Channel[0].Volume := _internBass1.Channel[0].Volume - 1;
sleep(_indiFadeouttime);
end;
_ThTimer1 := TTimer.create(
nil);
_ThTimer1.OnTimer := _ThTimer1Event;
_ThTimer1.Enabled := true;
// goto goon;
end;
except
if _activeBass = 1
then
freeandnil(_internBass1);
// the hammer method CreateorFree_internBass(false,1);
Terminate;
_Threadruns := false;
end;
goon:
// end Thread
Terminate;
_Threadruns := false;
end;
procedure TFadeoutThread._ThTimer1Event(Sender: TObject);
begin
_ThTimer1.Enabled := false;
freeandnil(_internBass1);
// the hammer method CreateorFree_internBass(false,1);
end;
procedure TBassInterfaceLayer.Stop(whichone: Byte; Fadeouttime: Byte);
var
Th: TFadeoutThread;
begin
if _Threadruns = true
then exit;
if whichone = 1
then
begin
if assigned(_internBass1)
then
begin
(* Fade out needs to operate in another thread! *)
if _Threadruns = false
then
begin
_indiFadeouttime := Fadeouttime;
// create Thread (suspended)
Th := TFadeoutThread.Create(True);
// Thread releases itself
Th.FreeOnTerminate := True;
// start Thread
Th.Resume;
end;
end;
exit;
end;
end;
(Hab alles rausgeschmissen, wo ich denke, dass es nichts damit zu tun hat)
konkret geht´s darum:
_ThTimer1.OnTimer := _ThTimer1Event; // hier wird der Eventhandler angehängt
Delphi-Quellcode:
procedure TFadeoutThread._ThTimer1Event(Sender: TObject);
begin
_ThTimer1.Enabled := false; // leider aber nie ausgeführt
freeandnil(_internBass1);
end;
._ThTimer1Event wird nicht ausgeführt, obwohl Code für diesen Teil generiert wird. Kann mir jemand erklären warum?
(das Code generiert wurde denke ich daran zu erkennen, weil Breakpoints an der Stelle möglich sind)
Danke schonmal
Padavan