我需要帮助来实现带轨迹栏的控制缩放(通过ScaleBy方法)。
这是我的跟踪栏的OnChange事件,但它不能完美运行:
procedure TMainForm.tbScaleChange(Sender: TObject);
begin
if tbScale.Tag = 0 then
begin
// this section is to make trackbar's step = 5
tbScale.Tag := 1;
if tbScale.Position mod 5 <> 0 then
tbScale.Position := 5 * ((tbScale.Position + 5 div 2) div 5);
tbScale.Tag := 0;
// in FtbScalePrevPos form variable I keep previous trackbar position
if FtbScalePrevPos > tbScale.Position then
someControl.ScaleBy(100, 105)
else if FtbScalePrevPos < tbScale.Position then
someControl.ScaleBy(105, 100);
FtbScalePrevPos := tbScale.Position;
end;
end;
在缩放上述控制之后,移动轨迹栏的尺寸增长得太快。
修改 我的轨迹栏有Min = 50,Max = 200,这些值是百分比的缩放因子。增加/减少tbScale.Position 5的代码有点复杂,但工作正常,与我的问题的起源无关。问题是找到将根据轨迹栏位置计算适当比例因子的函数。 在将tbScale.Position直接传递给ScaleBy方法的天真方法中,如果我将轨迹栏移动到150(缩放因子1.5)然后再移动到200(因子2),我的控件将不会按照我想要的缩放2但是缩小为3(1.5 * 2)。简单的解决方案是保存someControl的初始尺寸,然后将它们与计算出的比例因子一起使用。不幸的是,在我的情况下someControl是TTabSheet,实际上我想扩展它的许多子控件。
答案 0 :(得分:1)
请考虑对您的代码进行以下更改:
tbScale.Position
,请使用
而是本地临时变量。实际上,你甚至不需要
暂时的。OnChange
tbScale.Tag
步= 5,您只使用它
用于比较(tbScale
)与之前的值。因此,您的代码将缩减为以下内容:
<, >
如果每步增加/减少5%的速度过快,则减少105,比如103。
procedure TForm22.tbScaleChange(Sender: TObject);
begin
if FtbScalePrevPos > tbScale.Position then
Button1.ScaleBy(100, 105)
else if FtbScalePrevPos < tbScale.Position then
Button1.ScaleBy(105, 100);
FtbScalePrevPos := tbScale.Position;
end;
默认为TTrackBar
和Min= 0
。如果您希望能够缩小缩放控件的大小,请设置例如Max=10
。如果您想增加步数,请调整Min := -10
和Min
。
在追加信息后进行修改。
我现在明白问题是什么(我认为)。在之前,尺寸变化是渐进的,您正在寻找线性变化。
我仍然坚持认为,使用Max
值进行的计算可以替换为使用第5个较小值分配min,max和initial位置,并在tbScale
过程中乘以5。
OnChange
的范围为10..40(而不是50..200),初始位置为20(而不是100),以及tbScale2
初始化为100,以下将操作从渐进变为线性。
FtbScale2PrevPos