【问题标题】:Delphi timer - not so simpleDelphi 计时器 - 没那么简单
【发布时间】:2017-02-26 17:42:28
【问题描述】:

我在 Windows 10 上使用 Delphi 2009。

我有一个简单的计时器(JvTimer,但 TTimer 也有同样的问题),它的 Interval 在对象检查器中设置为 1000 毫秒。它在标签中显示倒计时。

我已经这样做了很多次,但由于某种原因,这次它不起作用。好像是随机跳过9、7、5等。

我已经更改了标签、计时器、间隔但仍然相同 - 调试给出了正确的步骤,但是一旦我在调试器之外运行它,我就会遇到问题。

var
  timeout: integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if timeout1 < 1 then
  begin
    jvTimer1.Enabled := False; 
    if WindowState = wsNormal then
      WindowState := wsMinimized;
  end
  else
  begin
    Dec(timeout1);
    LabeledEdit5.Text := IntToStr(timeout1);
  end;
end;

【问题讨论】:

  • 我们不能有一个 MCVE
  • Labeled5.update 可能会对您有所帮助。听起来其他事情正在发生,没有时间重新绘制控件。
  • 谢谢 - 但我已经尝试过了,还刷新了表单。没有不同。奇怪的是,如果我创建一个只有计时器、按钮和标签的新项目 - 它工作正常。当这个 ttimer 倒计时时,原来的 prog 中没有任何东西会导致任何事件。此外,数字以更高的速率倒计时(大约 500 毫秒,即 7-5-3 以 1 秒为间隔),尽管数字以正确的速率变化。很奇特!!
  • 我正在调试模式下测试这个 - 如果我在除计时器事件之外的每个函数和过程中放置​​断点,它们都不会被触发,所以我认为它与任何其他部分
  • 如果我在没有调试的情况下运行 - 仍然是同样的问题。

标签: delphi delphi-2009


【解决方案1】:

计时器不是很精确。不要通过计算计时器事件执行的次数来计算时间。

改为:在启动计时器时在变量中记住当前的 TDateTime,然后在计时器事件中,通过将当前时间与记住的开始时间进行比较来计算自启动计时器以来经过的时间。

【讨论】:

  • 当然,一秒钟的计时器应该不会造成问题!据我所知,应用程序中没有同时发生其他事件。
  • @user 如果您不向我们展示您的代码,我们如何提供帮助。为什么哦为什么我们不能有一个 MCVE?你需要帮助吗?
【解决方案2】:

谢谢戴夫, 我破解了所有内容以提供 MCVE,但我发现了问题。 不知何故,这个错误已经悄悄出现了! 我已经创建了两次主窗体。这一定是导致计时器问题的原因。 克里斯

program mail2p;    
uses
  madExcept,
  madLinkDisAsm,
  madListHardware,
  madListProcesses,
  madListModules,
  Forms,
  mail2 in 'mail2.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
 // Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

【讨论】:

  • 还要将timeout变量从全局变量改为表单类的成员字段,这样表单的不同实例就不会使用同一个变量。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多