Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TrackBar und richtige Position setzen (https://www.delphipraxis.net/68524-trackbar-und-richtige-position-setzen.html)

Mazel 1. Mai 2006 08:05


TrackBar und richtige Position setzen
 
Hallo,

Ich habe mir die TrackBar Komponente mit den MouseDown und MouseUp Ereignissen geladen. Dies TrackBar dient mir dazu um die Song Position zu setzen. Diese funktioniert aber ich bekomme keine genauen Positionen. Es wird zu stark gerundet.

Vorher hatte ich es mit WndProc versucht:
Delphi-Quellcode:
rocedure TForm1.WndProc(var Msg: TMessage);
var
 Pos: TPoint;

begin
 If Msg.Msg = WM_LBUTTONDOWN then
  begin
   Pos:=Mouse.CursorPos;
   If SoundObject <> nil then //wenn ein Song abgespielt wird
    begin
     If (Pos.Y >= TrackBar.Top + 7) and (Pos.Y <= TrackBar.Top + 13) then
      begin
       //hier kommt der Code zum setzen der Position im Song
      end;
    end;
  end;
 inherited;
end;
Wie kann ich die Position genau setzen?

Gruß
Mazel

arbu man 1. Mai 2006 09:41

Re: TrackBar und richtige Position setzen
 
Trackbar.Position liefert die aktuelle Position zurück und du kanst Trackbar.Position auch eine Position zuweisen.
Nur was meinst du mit zustark gerundet weist du der Track die länge des Liedes in Sekunden oder MiliSekunden zu ?
Wenn du es genau haben möchstest mussst du milisekunden nehmen.

Mazel 1. Mai 2006 12:43

Re: TrackBar und richtige Position setzen
 
Hi,

Beim Laden der Datei weise ich TrackBar.Max die Länge der Datei in Milisekunden zu. Hier mal wie es bis jetzt ist (ich arbeite mit der bass.dll):
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)) //wird beim zuweisen abgerufen
 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;

procedure TForm1.TimerTimer(Sender: TObject);
begin
 If SoundObject <> nil then //wenn ein Sound gespielt wird
  begin
   TrackBar.Position:=GetSoundInfo('GetPosition');
  end;
end;

procedure TForm1.TrackBarChange(Sender: TObject);
var
 TBP, BGP: Integer;

begin
 TBP:=TrackBar.Position;
 BGP:=GetSoundInfo('GetPosition');
 If ABS(TBP - BGP) > 1000 then BASS_ChannelSetPosition(Channel, BASS_ChannelSeconds2Bytes(Channel, TrackBar.Position div 1000));
end;

procedure TForm1.TrackBarMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 If X > 8 then
  begin
   TrackBar.Position:=Trunc(X * (TrackBar.Max + 8) / (TrackBar.Width - 16)) - ((TrackBar.Max div Width) * 10);
  end;
 end;
Wenn ich aber nun auf die TrackBar klicke, dann ist der Slider, je weiter rechts ich auf die TrackBar klicke, nicht dort, wo ich die Maus hatte.

Gruß Mazel

arbu man 1. Mai 2006 12:48

Re: TrackBar und richtige Position setzen
 
Ich würde es so machen:

Code:
procedure Timer
begin
  if aus then exit;
  trackbar.position := getposition;
end;

procedure mousedown
begin
  aus:=true;
end;

procedure mouseup
begin
  aus:=false;
  song.position := trackbar.position;
end;

Die Muhkuh 1. Mai 2006 12:51

Re: TrackBar und richtige Position setzen
 
Oder eine eigene Trackbar ableiten und das entsprechende Ereignis implementieren.

Mazel 1. Mai 2006 12:56

Re: TrackBar und richtige Position setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das "Setzen" an sich ist nicht das Problem, sondern das der Slider nicht an der richten Position (Differenz etwa 10 Pixel) nach dem loslassen der Maus ist. Wie ich schon schrieb, wenn ich ziemlich weit am Ende auf die TrackBar klicke dann liegt der Slider 10 Pixel vor der Position auf die ich geklickt habe.

Auf dem Bild ist es beschriben wie ich es meine, dort wo der schwarze Strich ist, dort habe ich mit der Maus hingeklickt.

Hawkeye219 1. Mai 2006 13:08

Re: TrackBar und richtige Position setzen
 
Hallo Marcel,

wie kommst du zu dieser merkwürdigen Umrechnungsformel?

Delphi-Quellcode:
TrackBar.Position:=Trunc(X * (TrackBar.Max + 8) / (TrackBar.Width - 16)) - ((TrackBar.Max div Width) * 10);
Wenn TrackBar.Min = 0 ist, sollte das doch so aussehen:

Delphi-Quellcode:
TrackBar.Position := X * TrackBar.Max DIV TrackBar.Width;
Oder mache ich nun einen Denkfehler? :gruebel:

Gruß Hawkeye

Mazel 1. Mai 2006 13:34

Re: TrackBar und richtige Position setzen
 
Im Prinzip ist es so richtig aber die eigentliche TrackBar (also wo der Slider zu Beginn sitzt) ist nicht bei 0 Pixel sondern bei 8 Pixel, daher muss ich
Delphi-Quellcode:
TrackBar.Position := (X - 8) * TrackBar.Max div TrackBar.Width;
verwenden. Aber trotzdem ist danach der Slider nicht an der der Position wo die Maus ist, immer etwas weiter links von der Maus.

Gruß Mazel


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