![]() |
TrackBar Song SetPosition
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bin gerade dabei einen kleinen Mediaplayer für mich zu programmieren. Dabei nutze ich die bass.dll. Nun zum Problem: ich möchte bei einem Song mit der TrackBar die Position setzen, aber das funktioniert bei mir leider nicht. Folgender Code zeigt, wie ich momentan mit der TrackBar arbeite (vereinfacht):
Delphi-Quellcode:
Wenn ich mit der Maus den Slider der TrackBar ändern will, springt er immer wieder zu der Position von davor zurück. Ich weis nicht warum das so ist. Kann mir da jemand helfen?
//zu Beginn:
TrackBar.Max:=0; TrackBar.Position:=0; //beim öffnen einer Datei (nach dem zuweisen von Channel): TrackBar.Max:=GetSetSoundInfo('GetLength'); function TForm1.GetSetSoundInfo(Info: String): Int64; var MilliSec: Integer; FloatPos: Float; begin If Info = 'GetLength' then FloatPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel)) Else If Info = 'GetPosition' then FloatPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel)) Else Result:=BASS_ChannelSeconds2Bytes(Channel, TrackBar.Position); If (Info = 'GetLength') or (Info = 'GetPosition') then begin MilliSec:=Trunc(1000 * FloatPos); If MilliSec < 0 then MilliSec:=0; Result:=MilliSec; end; end; procedure TForm1.TimerTimer(Sender: TObject); begin TrackBar.Position:=GetSetSoundInfo('GetPosition'); end; procedure TForm1.TrackBarChange(Sender: TObject); begin BASS_ChannelSetPosition(Channel, GetSetSoundInfo('SetPosition')); end; end. Als Anhang habe ich mal den noch nicht fertigen Player mit dem Problem. Gruß Mazel |
Re: TrackBar Song SetPosition
Hallo,
du musst den Player pausieren, wenn du die TrackBar verschiebst und dann die neue Position setzen und ihn wieder starten. Ich denke, daran liegt es, doch suche mal hier im Forum: ![]() |
Re: TrackBar Song SetPosition
Hi
Den Player Pausieren? Das ist unschön. Mach dir ne variable mit der du den slider temporär ausschaltest (Pausierst) dazu solltest du onMouseDown, MouseUp benutzen.
Delphi-Quellcode:
Var Scroling : Boolean;
procedure TMain_Form.SliderMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Scroling:= true; end; procedure TMain_Form.SliderMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin With AudioPlayer do begin Scroling:= false; Set_TimeMS(trunc(Get_SongLength * Slider.Position / Slider.Max + 0.1)); end; end; procedure TMain_Form.Slider_tmTimer(Sender: TObject); begin With AudioPlayer do begin if Scroling = false then Slider.Position:= round((slider.Max / Get_SongLength) * Get_TimeMS+ 0.1) end; end; Wen ich en Track lade zeigt er mir die fasche Position. warum setzt du den Slider nicht direkt auf max 100? Ansonst ist dein Code für mich verwirrend. Du solltest dir zwei Funktionen bauen eine mit Set_SoundInfo() und die andere mit Get_SoundInfo() Du solltest dir das anschauen ![]() |
Re: TrackBar Song SetPosition
Morgen,
@Wishmaster: Mit onMouseDown und onMouseUp kann ich es leider nicht machen, da die TrackBar diese Ereignisse nicht besitzt. Ich setze den Maximalwert (Max) der TrackBar immer auf die Länge in Millisekunden des Tracks, das macht es einfacher die Position zu setzen. Gruß Mazel |
Re: TrackBar Song SetPosition
|
Re: TrackBar Song SetPosition
Danke arbu man aber ich habe es nun gelöst, ohne MouseDown und MouseUp. Ich habe, nach Empfehlung von Wishmaster, meine Funktion so geändert, das ich nur noch Informationen lese:
Delphi-Quellcode:
Für die Trackbar habe ich nun folgenden Code aufgenommen:
function TForm1.GetSoundInfo(Info: String): Int64;
var MilliSec: Integer; FloatPos: Float; begin If Info = 'GetLength' then FloatPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel)) Else If Info = 'GetPosition' then FloatPos:=BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetPosition(Channel)); MilliSec:=Trunc(1000 * FloatPos); If MilliSec < 0 then MilliSec:=0; Result:=MilliSec; end;
Delphi-Quellcode:
Außerdem hatte ich selber einen Fehler, ich habe nicht durch 1000 dividiert, was aber bei mir wichtig ist.
procedure TForm1.TrackBarChange(Sender: TObject);
var TBP, BGP: Integer; //TrackBarPosition BassGetPosition begin TBP:=TrackBar.Position; BGP:=GetSoundInfo('GetPosition'); If ABS(TBP - BGP) > 1000 then BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, TrackBar.Position div 1000)); end; Danke an alle. Gruß Mazel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:56 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