我发现很难找到解决方案。我正在设计一个模拟应用程序,需要以一定的间隔显示图形。我有一个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>
应该是什么。如果提供任何其他可能的解决方案来实现自动递增/自动播放轨迹栏,则会接受。
程序不能分配所有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;
当轨迹栏值达到最大值时,动画停止。
如果您想通过事件停止动画(用户点击某些内容),只需将启用计时器的设置移动到此事件中即可。