我試圖實現類似於大多數媒體播放器的功能,通過在媒體持續時間軌道欄上移動鼠標,它將顯示一個小的彈出窗口,通知您當前鼠標當前位置。雖然在實現下面給出的代碼時我注意到了一個奇怪的行爲。軌道欄鼠標移動事件的奇怪行爲
procedure TForm1.TrackBar1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Single);
var
pers: Extended;
begin
pers := (X/TrackBar1.Width);
PixelLabel.Text := FloatToStr(pers * TrackBar1.Max);
end;
如果我在賽道欄的中間點擊我會得到相當接近該點的實際軌跡欄的值,所以如果例如推力杆範圍從去,我點擊中間的某處我得到,但隨着我向左或向右移動,我開始分別獲得更小和更大的值。因此,如果我的鼠標接近開始例如我可能會得到而不是應該是該點的實際值。有人能指出我在這裏做錯了什麼嗎?
編輯
通過實際軌道條價值我的意思是,從得到的值:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
ActualLabel.Text := 'Actual Val: '+FloatToStr(TrackBar1.Value);
end;
因此,我將移動鼠標讓在308位說(軌跡欄從0到609這裏),我會得到一個鱸魚值0.50574這告訴我,在位置308鼠標下的軌跡欄的值是10114,但通過單擊鼠標並啓動onChange函數我得到一個值10116.隨着我們去f,這個差異會增加從軌道杆中間到其中任一側。
編輯2
更清楚的例子是這樣。如下圖所示,我將鼠標移動到位置X = 572。如果以整個軌跡欄的百分比表示該位置將是572/609 = 0,9392。所以人們可能會認爲該位置的軌跡欄的值的百分比(如圖所示,最小值:0 - 最大值:200)將是相同的。換句話說,MValue/max = 0,9392。
但點擊軌跡欄在確切的位置,然後請求它的價值它不會返回我計算爲「MValue」,如下所示的圖像(鼠標是不可見的,但之後這個圖像是的確之後我點擊在相同的位置軌跡欄中,你可以看到ActualValue被更新)
嘗試'TrackBar1.ClientWidth'而不是'Width',儘管我認爲這不會太大差異。這個想法是,實際的軌道比控制的寬度小几個像素。 – 2014-10-28 15:03:13
ClientWidth不是跟蹤欄的屬性,如果你的意思是絕對寬度,我嘗試過,但它完全一樣。 – dearn44 2014-10-28 15:05:50
我剛剛注意到你使用的是Firemonkey,但概念是相同的,實際的軌跡欄本身比控件的寬度小。您必須確定實際曲目的寬度,並且可能沒有直接屬性來告訴您這些信息。 – 2014-10-28 15:06:34