2 pętle until - zapętla się

0

Piszę prosty program, który klika 40 razy myszką w jednej linii (za każdym razem o 10 px przesuwa się w prawo) i tak 5 razy, niestety używając mojego kodu nie wiem dlaczego on wykonuje to co jest w małej pętli, ale nie wykonuje nic z dużej. Wg mojego założenia powinien działać tak:

  • to punkt w którym kursor klika LPM:

+++++++++[40 razy]++++++++++ (wraca do pierwszego plusa i zaczyna znowu to samo)
a tymczasem dzieje się:
+++++++++[40 razy]++++++++++ Zatrzymuje się na 3 sekundy i leci dalej++++++++++++++++++[nieskończenie wiele razy]+++++++++++(następuje zapętlenie)

 a:=0;
z:=0;
repeat //duza petla
x1:=x;
  repeat //mala petla krokow
   SetCursorPos(x1, y);
   mouse_event(MOUSEEVENTF_LEFTDOWN, X1, Y, 0, 0);
   mouse_event(MOUSEEVENTF_LEFTUP, X1, Y, 0, 0);
   x1:=x1+10; // dlugosc skoku
   a:=a+1;
  until a=40; //koniec malej
z:=z+1;
sleep(3000);
until z=5;//koniec duzej

Czy ktoś mi powie, gdzie popełniłem błąd? Pozdrawiam.

1
a:=0;
z:=0;
repeat //duza petla
x1:=x;
  repeat //mala petla krokow
   SetCursorPos(x1, y);
   mouse_event(MOUSEEVENTF_LEFTDOWN, X1, Y, 0, 0);
   Application.ProcessMessages;   
   mouse_event(MOUSEEVENTF_LEFTUP, X1, Y, 0, 0);
   Inc(x1,10); // dlugosc skoku
   Inc(a);
  until a>40; //koniec malej
Inc(z);

{Nie podoba mi się to zwolnienie...}
Sleep(1000);
Application.ProcessMessages; 
Sleep(1000);
Application.ProcessMessages; 
Sleep(1000);

until z>5;//koniec duzej
0

Dzięki Opi, teraz działa. A te zwolnienia to tylko po to, bym mógł zaobserwować działanie tego programu, potem i tak zostaną usunięte.

Czy mój błąd to to, że używam formułki x:=x+1; zamiast Inc(x) ?

2

Nie zrobiłeś błędu ponieważ Delphi (przynajmniej wersja 7 optymalizacja włączona)
Z a:= a + 1 i tak zrobi Inc rejestr (a więc na jedno wychodzi):

user image

Natomiast z a:= a + X czy Inc(a, X) i tak zrobi add rejestr, wartość czyli także to samo (co w tym przypadku jest oczywiste ponieważ assemblerowy inc nie ma drugiego parametru).
user image

user image

Natomiast zastanawiam się czemu nie użyłeś pętli for? Przecież wiesz ile razy pętla ma się wykonać , miałbyś spokój z tym Inc(a); i Inc(z); kod bardziej zoptymalizowany i czytelniejszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1