【问题标题】:how to use while loop with more than one argument?如何使用带有多个参数的while循环?
【发布时间】:2015-05-04 22:12:21
【问题描述】:

我想在 Delphi 中制作一个倒数计时器。我用过

while(t<>0 and m<>0 and s<>0) do

但程序不接受它。我该如何解决这个问题?

【问题讨论】:

  • 应该是while (t0) and (m0) and (s0) do。
  • 只有一个音符;这不能作为倒数计时器的主循环(如果这是意图;我不确定,因为我希望变量 hms,而不是 t、@987654326 @,s,但这可能来自您的母语,我假设 t 是一个小时变量)。如果是这样,考虑一下当你开始数数时会发生什么,比如 10 秒。您将拥有h=0, m=0, s=10,并且仅当(h &lt;&gt; 0) and (m &lt;&gt; 0) and (s &lt;&gt; 0) 甚至不会通过单次迭代时才尝试倒计时,因为hm 变量已经在0 中。
  • 感谢您的回答,非常感谢。我使用它并且它有效,但我有一个问题,即循环非常非常快并且它显示最后时间,0:0:0。其次它没有显示 coutdown...我需要你的帮助来解决这个问题,为此我添加了程序,谢谢
  • procedure TForm1.Timer1Timer(Sender: TObject) begin while (t0) or (m0) or (s0) do begin Label1.Caption:=IntToStr(t) +':'+IntToStr(m)+':'+IntToStr(s); for i:=0 to 59 do begin ms:=ms+1;如果 s0 则开始 dec(s); endelse begin if m=0 then begin if t=0 then Label2.Caption:='it is done' else begin dec(t);米:=59; s:=60;结尾; end else begin dec(m); s:=60; Label1.Caption:=IntToStr(t)+':'+IntToStr(m)+':'+IntToStr(s) ;
  • 很抱歉我无法附加该程序,我不得不删除很多内容才能将其发送给您。希望您能看到它。谢谢。

标签: delphi


【解决方案1】:

你需要的代码是:

while (t<>0) and (m<>0) and (s<>0) do

原因是 Pascal 优先规则意味着在您的代码中,and 尝试作为按位运算符绑定到它周围的整数。需要上面的括号才能使and 在此处作为逻辑运算符运行。

你的表情是

t<>0 and m<>0 and s<>0

因为and的优先级高于&lt;&gt;,所以表达式被解释为:

t<>(0 and m)<>(0 and s)<>0

这是一个明显的语法错误。

此处记录了优先级:

Expressions (Delphi) | Operator Precedence

【讨论】:

    【解决方案2】:

    您的函数内部根本不需要循环。这是因为您正在使用每个时间间隔调用一次的计时器工作。

    你只需要像这样减少变量

    procedure TForm1.Timer1Timer(Sender: TObject) 
    begin 
      Label1.Caption:=IntToStr(t)+':'+IntToStr(m)+':'+IntToStr(s); 
      if s > 0 then dec( s)
      else
      begin
        s := 59;
        if m>0 then dec(m)
        else
        begin
          m := 59;
          if t>0 then dec( t )
          else Label2.Caption:='it is done' 
        end;
      end;
    end;
    

    【讨论】:

    • 谢谢...整个应用程序,但它不起作用。我关闭计算机并再次重新启动并使用其他值编译程序,但计时器与旧时间继续......我不知道我应该如何重置计时器?因为没有这样的命令...感谢您的帮助...最好的问候,维纳斯
    • 您需要说明您从何处获得初始计时器值(t、m 和 s)。他们坚持是不寻常的 - 或者你是说他们不坚持而你希望他们坚持?
    • 感谢您的回复...我举了一个例子,倒计时效果很好。我在倒计时完成之前关闭了程序。当我运行原始程序时,它出现了旧时间并继续倒计时。我实际上计算了一些东西,这个过程需要特殊的时间,应该倒计时来完成这个过程。我使用Application.Terminate 放置了一个按钮来停止或完成它,但它不起作用。我添加了 Timer1.Enabled:=false;它几乎可以工作。在之前的过程中,我添加了 Timer1.Enabled:=true;它工作..我需要更好的解决方案,金星
    • 好的,我想我明白了。这确实是另一个问题,因此您应该将其标记为已完成并开始一个新问题。但是,您需要做的是在 Form.OnClose 中存储当前时间 (Now()) 以及某处的 t、m 和 s 的值,例如。在注册表或 INI 文件中,然后读回这些值,以便使用新值重新计算 t、m 和 s。如果您需要更多帮助,请创建一个新主题。
    猜你喜欢
    • 2016-08-06
    • 2011-08-09
    • 2016-07-24
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多