0

我发现很难找到解决方案。我正在设计一个模拟应用程序,需要以一定的间隔显示图表。我有一个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 循环,但找不到任何这样的函数。当我使用 at 的值true<CONDITION>,应用程序崩溃了(可能是因为无限循环)。

需要一些帮助来找到<CONDITION>应该是什么。如果提供任何其他可能的解决方案来实现自动递增/自动播放轨迹栏,将接受。

4

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

当 trackbar 值达到最大值时动画停止。


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

于 2018-09-10T09:32:25.453 回答