德尔福计时器问题

时间:2011-01-27 18:09:26

标签: delphi

procedure TForm1.Timer2Timer(Sender: TObject);
var  ff : integer;
begin

  for ff := 0 to 32 do
    If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] then
    begin
       sndPlaySound('cashregister.wav', snd_Async or snd_NoDefault);
    end
    else
    begin
       SendClick(451,541);
    end;

end;

有人能找到原因导致错误的原因吗? 它触发SendClick()时它不应该......有一个原因,为什么if和else不工作?

 for i := 0 to 32 do
   If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[i] then
     sndPlaySound('cashregister.wav', snd_Async or snd_NoDefault);
   end;

是一个完全不同的计时器...并且当它应该播放声音时...所以条件在它应该是时返回有效...我几乎是正面的它必须是{{1}的东西因为我可以这样做....

ELSE

它会在条件恢复真实一次之后停止点击但不会再次重新启动......

所以我知道 if f1 = 0 then SendClick(451,541); for ff := 0 to 32 do If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] then begin sndPlaySound('cashregister.wav', snd_Async or snd_NoDefault); f1 := 1; end; 工作得非常好......我没有睡觉,如果这让你们感到困惑我很抱歉但是我不知道为什么你们需要任何进一步的代码然后我发帖的第一个片段告诉我什么是错的......

现在,如果你们想要ARRAYS ......

CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff]

所以举个例子来说这样做......

  CardArray[2] := '2';
  CardArray[3] := '3';
  CardArray[4] := '4';
  CardArray[5] := '5';
  CardArray[6] := '6';
  CardArray[7] := '7';
  CardArray[8] := '8';
  CardArray[9] := '9';
  CardArray[10] := '10';
  CardArray[11] := 'J';
  CardArray[12] := 'Q';
  CardArray[13] := 'K';
  CardArray[14] := 'A';
  SuiteArray[99] := 'c';
  SuiteArray[100] := 'd';
  SuiteArray[104] := 'h';
  SuiteArray[115] := 's';
  PlayArray[0] := '22';
  PlayArray[1] := '33';
  PlayArray[2] := '44';
  PlayArray[3] := '55';
  PlayArray[4] := '66';
  PlayArray[5] := '77';
  PlayArray[6] := '88';
  PlayArray[7] := '99';
  PlayArray[8] := '1010';
  PlayArray[9] := 'JJ';
  PlayArray[10] := 'QQ';
  PlayArray[11] := 'KK';
  PlayArray[12] := 'AA';
  PlayArray[13] := 'AK';
  PlayArray[14] := 'AQ';
  PlayArray[15] := 'AJ';
  PlayArray[16] := 'A10';
  PlayArray[17] := 'KA';
  PlayArray[18] := 'QA';
  PlayArray[19] := 'JA';
  PlayArray[20] := '10A';
  PlayArray[21] := 'KQ';
  PlayArray[22] := 'KJ';
  PlayArray[23] := 'K10';
  PlayArray[24] := 'QK';
  PlayArray[25] := 'QJ';
  PlayArray[26] := 'Q10';
  PlayArray[27] := 'JK';
  PlayArray[28] := 'JQ';
  PlayArray[29] := 'J10';
  PlayArray[30] := '10K';
  PlayArray[31] := '10Q';
  PlayArray[32] := '10J';

NewValue := 2; NewValue3 := 2; 会= 22

现在让我们检查播放数组22

带有for循环

CardArray[NewValue] +  CardArray[NewValue3]

....这是对现在发生的事情的有效解释吗?你们明白for循环在做什么吗?

5 个答案:

答案 0 :(得分:2)

sndPlaySound需要一些时间才能返回。

所以你应该在循环中禁用计时器:

procedure TForm1.Timer2Timer(Sender: TObject);
var
ff : integer;
 begin
   Timer2.Enabled := false;
for ff := 0 to 32 do
If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] then
   begin
   sndPlaySound('cashregister.wav', snd_Async or snd_NoDefault);
   end
else
   begin
   SendClick(451,541);
   end;
   Timer2.Enabled := true;
end;

而且...你的代码有什么奇怪的,你循环到33个值,每个值使用SendClick或sndPlaySound ......我猜你的代码永远不会这样......

编辑:这是一个修改过的版本 - 也许这就是你想要的东西:

procedure TForm1.Timer2Timer(Sender: TObject);
var
ff : integer;
 begin
   Timer2.Enabled := false;
   try
     for ff := 0 to 32 do
     If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] then
     begin
       sndPlaySound('cashregister.wav', snd_Async or snd_NoDefault);
       exit; // value found
     end;
     // not found
     SendClick(451,541);
   finally  
     Timer2.Enabled := true;
   end;
  end;

答案 1 :(得分:2)

我想你想做这样的事情:

Play := False;
Cards := CardArray[NewValue] + CardArray[NewValue3];
for ff := 0 to 32 do begin
  if Cards=PlayArray[ff] then begin
    Play := True;
    break;
  end;
end;
if Play then begin
  ContinuePlaying;//I've got great cards
end else begin
  Fold;//I've got a hand full of bus tickets and have to fold
end;

如果33个选项中的任何一个匹配,您想播放收银机声音,否则您点击折叠按钮。

我已经将CardArray[NewValue] + CardArray[NewValue3]代码移出了循环,因为它每次都会评估相同的内容,而这只会令我们所有人感到困惑!

这样吗?

答案 2 :(得分:1)

NewValue或NewValue3不包含您认为它包含的内容(并且没有人可以猜出这是什么,因为没有指示值来自何处)。

答案 3 :(得分:1)

你可能没有意识到if子句是从0到32的所有值ff执行的。所以你有33次检查,33次是声音或点击。

我的通灵能力告诉我,你正在寻找两个CardArray值的总和等于PlayArray中的一个值,然后在没有找到匹配时播放声音或点击。但这不是你编程的。

答案 4 :(得分:1)

简单地说,行:

If CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] then

当您期望它时,不会评估为真。它评估为false,因此执行sendclick。

在调试器中的'If'上设置断点,查看要添加的值,它们是您所期望的吗?