【发布时间】:2014-10-28 14:53:16
【问题描述】:
我正在尝试实现与大多数媒体播放器类似的功能,通过将鼠标移动到媒体持续时间轨道栏上方,它会显示一个小弹出窗口,通知您鼠标当前位于上方的时间。在实现下面给出的代码时,我注意到了一个奇怪的行为。
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;
如果我点击轨迹栏的中间,我会得到一个非常接近该点实际轨迹栏值的值,例如,如果轨迹栏范围从 0 到 2000 并单击中间某处得到 1000,但当我向左或向右移动时,我开始分别获得更小和更大的值。因此,例如,如果我的鼠标接近起点,我可能会得到 180 而不是 100 ,那应该是当时的实际值。有人可以指出我在这里做错了什么吗?
编辑
我所说的实际轨迹栏值是指来自以下的值:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
ActualLabel.Text := 'Actual Val: '+FloatToStr(TrackBar1.Value);
end;
所以我将鼠标移动到位置 308(此处轨迹栏从 0 到 609),我将得到一个 perch 值 0.50574,这告诉我鼠标下方位置 308 处的轨迹栏为 10114,但通过单击鼠标并启动 onChange 函数,我得到的值为 10116。当我们从轨迹栏的中间到其中任何一个时,这种差异会增加侧面。
编辑 2
一个更清楚的例子就是这个。如下图所示,我将鼠标移动到 X=572 的位置。如果以整个轨迹栏的百分比表示,该位置将为 572/609 = 0,9392。因此,人们会期望该位置的轨迹栏值的百分比(如图所示,最小值:0 - 最大值:200)是相同的。换句话说,MValue/max = 0,9392。
但是在单击该确切位置的轨迹栏然后请求其值后,它不会返回我计算为“MValue”的值,如下图所示(鼠标不可见,但此图像确实是在我单击轨迹之后条在同一位置,您可以看到 ActualValue 已更新)
【问题讨论】:
-
尝试使用
TrackBar1.ClientWidth而不是Width,尽管我认为这不会有太大的不同。这个想法是实际轨道比控件的宽度小几个像素。 -
ClientWidth 不是轨迹栏的属性,如果您的意思是绝对宽度,我确实尝试过,但它完全相同。
-
我刚刚注意到您使用的是 Firemonkey,但概念是一样的,实际的轨迹栏本身小于控件的宽度。您必须确定实际轨道的宽度,并且可能没有直接的属性可以告诉您这些信息。
-
VCL 也存在同样的问题。只需要到较低的级别才能获得这条轨道的宽度,这超出了我的知识范围。
-
您有没有想过使用其他组件。例如,您可以改用 TGauge,这样您就可以得到类似于 BS Player 或 Cyberlink Power DVD 的结果。 TGauge 的主要优点是,由于它的左右两侧没有任何多余的空间,因此您可以像在原始代码中那样轻松地使用 Width 来计算位置。
标签: delphi firemonkey