Delphi Timer Issue

大城市里の小女人 提交于 2020-01-06 19:30:44

问题


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;

Can anyone spot a reason to why this would be working incorrectly? Its triggering SendClick() when it shouldn't be... is there a reason why the if and else is not working ?

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

Is in a completely different timer... and plays the sound when it should... so the condition is returning valid when it should be..I'm almost positive it has to be something with the ELSE because i can do this....

  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;

and it will stop clicking after the condiition has returned true one time but wont start back up again...

so i know CardArray[NewValue] + CardArray[NewValue3] = PlayArray[ff] is working perfectly fine ...I have not had sleep and I'm sorry if this is confusing to you guys but I don't know why you would need any further code then the first snippet ive posted to tell me whats wrong...

Now if you guys would like the ARRAYS here...

  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';

so for example lets say do this...

NewValue := 2;
NewValue3 := 2;

CardArray[NewValue] + CardArray[NewValue3] would = 22

now lets check the play array for 22

with a for loop

for ff := 0 to 32 do
 if PlayArray[ff] = CardArray[NewValue] +  CardArray[NewValue3] then
begin
dowhatever...
end;

.... is this a valid explanation of whats going on now do you guys understand what the for loop is doing?


回答1:


I think you want to do something like this:

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;

You want to play your cash register sound if any single one of the 33 options matches, otherwise you click the fold button.

I've moved the CardArray[NewValue] + CardArray[NewValue3] code out of the loop because it evaluates the same every time round and that was just confusing the heck out of us all!

Does this to it?




回答2:


The sndPlaySound is taking some time to return.

So you should disable the timer during the loop:

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;

And... what is strange with your code that you're looping into 33 values, with SendClick or sndPlaySound for each value... I guess your code will never work as such...

Edit: here is a modified version - perhaps it's what you want to have:

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;



回答3:


NewValue or NewValue3 does not contain what you think it contains (and no one can guess what that is because there's no indication of where the values come from).




回答4:


You are probably not aware of the fact that the if clause is executed for all values ff from 0 to 32. So you have 33 checks and 33 times either the sound or the click.

My psychic power tells me that you are looking for the sum of the both CardArray values being equal to one value inside PlayArray and then playing a sound or making a click when no match is found. But that is not what you programmed.




回答5:


Simply put, the line:

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

Is not evaluating to true when you expect it to. It is evaluating to false, so the sendclick is executed.

Set a breakpoint on the 'If' in the debugger, look at the values you are adding, are they what you expect?



来源:https://stackoverflow.com/questions/4820118/delphi-timer-issue

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!