Zobacz sobie na ten program, który powstał z użyciem dspacka;
http://download.4programmers.net/X-DVD_Player
Zamiast dstrackbar użyłem komponentu "ProgressCyl"
który można oprogramować timerem oraz zwykłymi procedurami reagującymi na zdarzenia (MouseUp, MouseDown, MouseMove)
Przykładowa obsługa może wygladac tak:
procedure TFormBar.DsTrackbar2MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ChangeTrackbar := true; // zmienna globalna, informujemy iz nastapi zmiana
end;
procedure TFormBar.DsTrackbar2MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
value : integer;
begin
if ChangeTrackbar then
begin
value := x*100 div dsTrackBar2.Width; //procent dlugosci
DSTrackBar2.Position := round(DSTrackBar2.Max *value) div 100; // wyliczona nowa pozycja
end;
end;
procedure TFormBar.DsTrackbar2MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
value : integer;
MediaSeeking: IMediaSeeking;
CurrentPosition, StopPosition: int64;
begin
value := x*100 div dsTrackBar2.Width; //procent dlugosci
value := round(DSTrackBar2.Max *value) div 100;
nowapozycja := value;
// FilterGraph ustawi odtwarzanie na nowej pozycji
FormDVDPlayer.FilterGraph.QueryInterface(IMediaSeeking, MediaSeeking);
if assigned(MediaSeeking) then
with MediaSeeking do
Begin
GetStopPosition(StopPosition);
CurrentPosition := (StopPosition * nowapozycja) div DSTrackBar2.Max ;
SetPositions(CurrentPosition, AM_SEEKING_AbsolutePositioning,
StopPosition , AM_SEEKING_NoPositioning);
end;
MediaSeeking := nil;
ChangeTrackbar := false; // zmienna globalna, informujemy iz koniec zmiany
end;
Timerek, który bedzie aktualizowal pozycje trackbara:
procedure TFormDVDPlayer.TimerMTimer(Sender: TObject);
var
Value, H, M, S : Integer;
MediaSeeking: IMediaSeeking;
CurrentPos, StopPos: int64;
MlsCurrentPos, MlsStopPos: Cardinal;
begin
FilterGraph.QueryInterface(IMediaSeeking, MediaSeeking);
if assigned(MediaSeeking) then
with MediaSeeking do
Begin
if Succeeded(GetCurrentPosition(CurrentPos)) then
begin
Value := Trunc(CurrentPos / 10000000);
H := value div 3600;
M := (value mod 3600) div 60;
S := (value mod 3600) mod 60;
StatusBar.Panels.Items[0].Text := Format('%d:%2.2d:%2.2d', [H, M, S]);
FormBar.LabelTime.Caption := StatusBar.Panels.Items[0].Text;
if Succeeded(GetDuration(StopPos)) then
begin
Value := Trunc(StopPos / 10000000);
H := value div 3600;
M := (value mod 3600) div 60;
S := (value mod 3600) mod 60;
StatusBar.Panels.Items[3].Text := Format('%d:%2.2d:%2.2d', [H, M, S]);
MlsCurrentPos := RefTimeToMiliSec(CurrentPos);
MlsStopPos := RefTimeToMiliSec(StopPos);
if not ChangeTrackbar then
begin
dsTrackBar1.max := MlsStopPos div TimerM.Interval; //Interval = 100
dsTrackBar1.Position := MlsCurrentPos div TimerM.Interval;
//drugi trackbar na drugiej formie
FormBar.DSTrackBar2.Max :=DSTrackBar1.Max;
FormBar.DSTrackBar2.Position :=DSTrackBar1.Position;
end;
end;
end;
End;
MediaSeeking := nil;
end;
Pozdrawiam.