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

delphi中自动增加轨迹栏的过程,delphi,Delphi,我发现很难找到解决办法。我正在设计一个模拟应用程序,需要以一定的间隔显示图形。我有一个TTrackBar。我想在每一步增加之间增加500毫秒的延迟来增加它的值 我编写了这个方法,它是从FormShow(发送方:TObject)过程调用的 PROCEDURE playTrackBar (t: Real); VAR v : REAL; BEGIN v := t; while <CONDITION> do BEGIN v := v + 1; if (

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

我编写了这个方法,它是从
FormShow(发送方: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;
程序playTrackBar(t:Real);
变量
五:真实;
开始
v:=t;
而你呢
开始
v:=v+1;
如果(v>=Form4.TrackBar1.Max),则
开始
v:=0;
结束;
Form4.TrackBar1.Value:=v;
睡眠(500);
结束;
结束;
我在寻找一个类似于
trackbar.isClicked()
的事件,它返回一个布尔值,这样我就可以停止while循环,但找不到任何这样的函数。当我在
中使用值
true
时,应用程序崩溃(可能是因为无限循环)


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

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

使用事件设置轨迹栏的动画。 将
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;
当轨迹栏值达到最大值时,动画停止


如果要通过事件停止动画(用户单击某个对象),
只需将计时器启用设置移到此事件中。

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

使用事件设置轨迹栏的动画。 将
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;
当轨迹栏值达到最大值时,动画停止


如果要通过事件停止动画(用户单击某个对象),
只需将计时器启用设置移到此事件中。

似乎它适用于
TTimer
而不是
Sleep
如果您的代码花费所有时间执行此循环,视频将如何播放?抱歉,不清楚。我并不是在设计视频播放器。我只是举了一个例子,轨迹栏有自动播放功能。我正在设计一个模拟应用程序,需要在每个间隔显示图形。(将此添加到问题中。谢谢。)问题仍然存在。当你的程序在这个循环中度过整个生命周期时,它将如何响应输入?David想说:把这个代码放在一个线程中。在单线程应用程序中,您的代码无法正常工作。睡眠让其他线程有机会完成它们的工作。但是如果只有一个线程…似乎是为
TTimer
工作,而不是为
Sleep
工作。如果您的代码花费所有时间执行此循环,视频将如何播放?很抱歉,不清楚。我并不是在设计视频播放器。我只是举了一个例子,轨迹栏有自动播放功能。我正在设计一个模拟应用程序,需要在每个间隔显示图形。(将此添加到问题中。谢谢。)问题仍然存在。当你的程序在这个循环中度过整个生命周期时,它将如何响应输入?David想说:把这个代码放在一个线程中。在单线程应用程序中,您的代码无法正常工作。睡眠让其他线程有机会完成它们的工作。但是如果只有一个线程。。。