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