delphi 使用repeat-until启动和停止操作

7kjnsjlb  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(162)

我想指定要重复的操作。
使用名为spbRewind的按钮调用该操作。按下spbRewind后,将进入Rewind模式。TimeForRewind使用设置为10ms的计时器设置(因此,理论上,该操作将每10ms重复一次)。
下面是代码:

TimeForRewind := Rewind and (CurrTime - PrevCallTime > IdealFrameTimeMSRewind);

  if TimeForRewind then
    begin
      repeat
        GotoSaveState(Game.CurrentIteration -4, 0);
      until ???;
    end;

我需要“until???”变成“until the button is pressed again”,但我不知 prop 体该怎么做。

33qvvth1

33qvvth11#

你在评论中所说的:

if TimeForRewind then
begin
  RewindTimer := TTimer.Create(self);
  RewindTimer.Interval := 200;
  RewindTimer.OnTimer := GotoSaveState(Max(Game.CurrentIteration-1, 0));
end;

看起来像是内存灾难。每次运行这段代码,你都会创建一个新的TTimer,但你从来没有释放过它们(或者你可能释放了?)
与其不断地创建新的计时器,并希望释放它们,不如在设计时或启动时创建一次计时器,并使其处于禁用状态(Timer.Enabled = False),然后,当需要它时,只需启用它,当不需要它时,再次禁用它。
我知道你想用一个切换类型的按钮来控制它,所以例如:

procedure TYourForm.spbRewindClick(Sender: TObject);
begin
  TimeForRewind := not TimeForRewind; // Do you actually need this?
  RewindTimer.Enabled := TimeForRewind;
end;

评论后编辑

  • 计时器在哪里 *

假设你有一个表单,比如说你把它命名为MyForm,最简单的方法是在设计时把TTimer组件从Tool Palette-System放到表单中(就像你对TButton所做的那样),把Timer1重命名为RewindTimer

  • 如何指定间隔?*

Interval属性设置为200(即毫秒)并双击timer控件,这将在表单中创建事件处理程序procedure RewindTimerTimer(Sender: TObject);声明和实现存根

procedure TMyForm.RewindTimerTimer(Sender: TObject);
begin

end;

从这里你可以调用GotoSaveState(...)

  • 我猜是RewindTimer。免费;是防止内存问题所需的全部吗?*

是的,但是如果你把计时器整合到你的形态中就不需要了。形态会处理破坏。

  • E2010不兼容类型:“TNotifyEvent”和“过程、非类型指针或非类型参数”*

如果你按照第一点所述在窗体中添加计时器,这个问题就会消失。

相关问题