在delphi中自动增加轨迹栏的过程

问题描述 投票:0回答:1

我发现很难找到解决方案。我正在设计一个模拟应用程序,需要以一定的间隔显示图形。我有一个TTrackBar。我想在每步增加之间延迟500ms来增加其值。

我写了这个从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>应该是什么。如果提供任何其他可能的解决方案来实现自动递增/自动播放轨迹栏,则会接受。

delphi
1个回答
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;

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


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

© www.soinside.com 2019 - 2024. All rights reserved.