gpt4 book ai didi

delphi - 缩放比例 + 轨迹栏

转载 作者:行者123 更新时间:2023-12-03 02:12:51 29 4
gpt4 key购买 nike

我需要帮助来使用轨迹栏实现控件缩放(通过 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;

缩放后,随着轨迹栏的移动,上述控件的尺寸增长得太快。

编辑:我的轨迹栏的最小值 = 50,最大值 = 200,这些值是以百分比为单位的缩放因子。将 tbScale.Position 增加/减少 5 的代码有点复杂,但工作正常,并且与我的问题的根源无关。问题是找到根据轨迹栏位置计算适当缩放因子的函数。在将 tbScale.Position 直接传递给 ScaleBy 方法的简单方法中,如果我将轨迹栏移动到 150(缩放因子 1.5),然后移动到 200(因子 2),我的控件将不会按我想要的那样缩放 2,而是缩放 3(1.5) *2).简单的解决方案是保存 someControl 的初始尺寸,然后使用计算出的缩放因子来使用它们。不幸的是,在我的例子中, someControl 是 TTabSheet,事实上我想缩放它的许多子控件。

最佳答案

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

  1. 请勿更改 tbScale.PositionOnChange事件,使用而是局部临时变量。事实上,你甚至不需要暂时的。
  2. 由于第 1 点,您可以删除处理以下内容的代码 tbScale.Tag
  3. 制作tbScale步骤 = 5 不是必需的,您只是使用它用于与之前的值进行比较( <, > )。

因此您的代码将减少为以下内容:

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;

如果每步增加/减少 5% 的速度太快,请减少 105,例如 103。

TTrackBar有一个Min= 0Max=10作为默认值。如果您希望能够减小缩放控件的大小,请设置例如Min := -10 。如果想增加步数,调整MinMax .

<小时/>

添加附加信息后进行编辑

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

我仍然认为你用 tbScale 进行的计算值可以替换为分配最小、最大和初始位置第 5 个较小的值,并在 OnChange 中乘以 5。程序。

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

procedure TForm22.FormCreate(Sender: TObject);
begin
FtbScale2PrevPos := 100;
end;

procedure TForm22.tbScale2Change(Sender: TObject);
begin
Button1.ScaleBy(tbScale2.Position * 5, FtbScale2PrevPos);

FtbScale2PrevPos := tbScale2.Position * 5;
end;

关于delphi - 缩放比例 + 轨迹栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47946113/

29 4 0