Den Timer würde ich vor dem Beenden abschalten,bzw. Du solltest die Zugriffe auf ChannelA mit
if (channelA=Nil)then exit;
oder so ähnlich absichern.
Delphi-Quellcode:
Len:=channelA.GetSongTimeInfo(SongTimeLength);
//bzw.
TrackBarPosition.Max := ChannelA.SongTimeInfo[SongTimeLength].asMilliSecInteger;
wo kommt denn das .Lied. her?
Ist das aus einer abgeleiteten Klasse?
In meiner BasschannelU.pas gibts das .Lied nicht und brauche ich auch nicht.
Bei Problemen einfach mal die einzelnen Units anschauen und mit Breakpoints debuggen
(wenn sie dem Projekt zugefügt wurden).
P.S. meine Units sind von Omata(supergeile TFramechannels)
PPS. und das hier ist auch Quatsch weil "Lied" noch gar nicht existiert/Created ist,Du aber schon die Länge wissen willst
Delphi-Quellcode:
ChannelA.LoadFromFile(OpenDialog1.Filename);
TrackBar1.Max := ChannelA.Lied.SecLaenge; //<-- ?????
ChannelA.Lied.create(OpenDialog1.Filename);
und zum Schluß die Katastrophe,geht gar nicht !!!
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var m1,s1:integer;
begin
if ChannelA.isComplete then
begin
Trackbar1.OnChange := Nil; //<- !
TrackBar1.Position := ChannelA.SecPosition;
TrackBar1.OnChange := poschange; //<- !
das hat im Timer nichts verloren und reicht im OnCreate der Form völlig aus,mal davon abgesehen das onchange und poschange genau das selbe machen
und das überhaupt nicht nötig ist.
Bei mir sieht das so aus und läuft prima,thx 2 omata bzw. an Alle ,die diese Zeilen verfasst haben.
Delphi-Quellcode:
Var _noAwnChangePos:boolean;
procedure TFrameChannel.TrackBarPositionChange(Sender: TObject);
begin
if _noAwnChangePos then
_noAwnChangePos := False
else
ChannelA.MilliSecPosition := TrackBarPosition.Position;
end;
//Timer bzw. SonginfoUpdatetimer
while not Assigned(Self) do exit;
_noAwnChangePos:=True;
TrackBarPosition.Position :=ChannelA.MilliSecPosition;;