Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TrackBar Song SetPosition (https://www.delphipraxis.net/68459-trackbar-song-setposition.html)

Mazel 29. Apr 2006 23:07


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:
//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.
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?

Als Anhang habe ich mal den noch nicht fertigen Player mit dem Problem.

Gruß
Mazel

Matze 30. Apr 2006 00:04

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: Hier im Forum suchenbass.dll TrackBar

Wishmaster 30. Apr 2006 01:39

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 http://www.delphipraxis.net/internal...ct.php?t=41480

Mazel 30. Apr 2006 07:27

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

arbu man 30. Apr 2006 08:41

Re: TrackBar Song SetPosition
 
Trackbar mit Mouse Up und Down

mfg, Björn

Mazel 30. Apr 2006 09:14

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:
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;
Für die Trackbar habe ich nun folgenden Code aufgenommen:
Delphi-Quellcode:
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;
Außerdem hatte ich selber einen Fehler, ich habe nicht durch 1000 dividiert, was aber bei mir wichtig ist.

Danke an alle.

Gruß
Mazel


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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