ScaleBy +轨迹栏

时间:2017-12-22 18:56:16

标签: delphi controls scaling

我需要帮助来实现带轨迹栏的控制缩放(通过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,实际上我想扩展它的许多子控件。

1 个答案:

答案 0 :(得分:1)

请考虑对您的代码进行以下更改:

  1. 请勿在{{1​​}}事件中更改tbScale.Position,请使用 而是本地临时变量。实际上,你甚至不需要 暂时的。
  2. 由于第1点,您可以删除处理的代码 OnChange
  3. 不需要tbScale.Tag步= 5,您只使用它 用于比较(tbScale)与之前的值。
  4. 因此,您的代码将缩减为以下内容:

    <, >

    如果每步增加/减少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; 默认为TTrackBarMin= 0。如果您希望能够缩小缩放控件的大小,请设置例如Max=10。如果您想增加步数,请调整Min := -10Min

    在追加信息后进行修改

    我现在明白问题是什么(我认为)。在之前,尺寸变化是渐进的,您正在寻找线性变化。

    我仍然坚持认为,使用Max值进行的计算可以替换为使用第5个较小值分配min,max和initial位置,并在tbScale过程中乘以5。

    OnChange的范围为10..40(而不是50..200),初始位置为20(而不是100),以及tbScale2初始化为100,以下将操作从渐进变为线性。

    FtbScale2PrevPos