在Delphi中自动增加跟踪栏的过程

时间:2018-09-09 22:35:58

标签: delphi

我在寻找解决方案方面遇到困难。我正在设计一个模拟应用程序,需要以一定的时间间隔显示图形。我有一个TTrackBar。我想在每次增加步长之间延迟500毫秒来增加其值。

我编写了从FormShow(Sender: TObject)过程中调用的方法

PROCEDURE playTrackBar (t: Real);
VAR
  v   : REAL;
BEGIN
  v   := t;
  while <CONDITION> do
  BEGIN
    v := v + 1;
    if (v >= Form4.TrackBar1.Max) then
    BEGIN
      v := 0;
    END;
    Form4.TrackBar1.Value := v;
    sleep(500);
  END;
END;

我一直在寻找类似trackbar.isClicked()的事件,该事件返回一个布尔值,因此我可以停止while循环,但是找不到任何这样的函数。当我在true处使用值<CONDITION>时,应用程序崩溃了(可能是因为死循环)。

需要一些帮助来确定<CONDITION>应该是什么。会接受是否提供其他实现自动增加/自动播放轨迹栏的解决方案。

1 个答案:

答案 0 :(得分:2)

程序不得分配所有CPU资源。当您更新GUI组件或需要用户输入时,系统必须有时间反映这些事件。拨打电话不是正确的方法。

使用TTimer事件为轨迹栏设置动画。 将TTimer放在表单上,​​并将Enabled设置为false。添加OnTimer事件:

procedure TMyForm.OnTimer1(Sender: TObject);
var
  trackPos : Integer;
begin
  trackPos := TrackBar1.Value;
  if trackPos >= TrackBar1.Max then begin // Time to stop animation
    Timer1.Enabled := False;  // Or move this line to another event
    TrackBar1.Value := 0; // Reset the value to zero
    Exit; 
  end;
  TrackBar1.Value := trackPos + 1;
end;

在表单Show事件中,设置更新间隔并启动计时器:

procedure TMyForm.FormShow(Sender: TObject);
begin
  TrackBar1.Max := 200;
  TrackBar1.Value := 0;
  Timer1.Interval := 500;
  Timer1.Enabled := True; // Start the animation     
end;

当轨迹栏值达到最大值时,动画停止。


如果您想通过事件(用户点击某些内容)来停止动画, 只需将启用计时器的设置移到该事件中即可。