Что нового

[Процессы] Помогите найти ошибку: вложенные циклы Do/Until совместно не работают

Кайгородов В. Ю.

В универе только TurboBASIC изучал и то забыл уже
Сообщения
25
Репутация
0
Написал скрипт:
Код:
While 1
$begin = TimerInit()
    Do
        Click_1()
        Sleep ( '550' )
    Until TimerDiff($begin) > $timeint
        MouseClick("secondary", 894, 1006, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 594, 812, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 711, 133, 2, 0)
        Sleep ( '550' )
        MouseClick("primary", 1187, 422, 2, 0)
        Sleep ( '550' )
WEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func Click_1()
    Do
  $pi = PixelSearch(1180, 843, 1188, 851, $x, 5)
        MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )
    Until @error
        MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )
EndFunc

Визуально его работа должна выглядеть так: Есть цикл из двух кликов, который прекращается если в точке 1184, 847 нет указанного цвета, и после завершения этого цикла производится ещё 2 клика (необходимо чтоб эти клики не повторялись пока цвет не изменится). Этот цикл сделан функцией, которая выполняется как цикл, завершающийся по завершении определённого времени, после чего выполняется серия кликов (так же необходимо чтоб эти клики не повторялись пока вновь не пройдет заданный интервал времени). И вся эта конструкция заключена в бесконечный цикл.

Работает она только по циклу Do/Until @error, не выходя из него.
Каждый цикл по отдельности работает корректно, а вместе отказываются. Помогите найти ошибку.
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Кайгородов В. Ю.
Код:
Func Click_1()
 PixelSearch(1180, 843, 1188, 851, $x, 5)
     if NOT @error then
   MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )
    else
        MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )
endif
EndFunc


В вашем же варианте, @error возвращает (вернее не возвращает) MouseClick.
 
Автор
К

Кайгородов В. Ю.

В универе только TurboBASIC изучал и то забыл уже
Сообщения
25
Репутация
0
mr.Gbabak Я из такого скрипта как раз и сделал этот. Хочу разобраться почему у меня вложенные циклы не работают.
Просто этот скрипт модель которая позволит мне в последствии писать что-то более сложное не делая десятков ступеней из if/else/endif.

Целесообразность такой конструкции связанно с тем, что часть кода:
Код:
MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )

Должна один раз выполниться, без повторения пока не пройдет новый цикл. Более того, вот такой скрипт корректно работает.
Код:
While 1
    Do
  $pi = PixelSearch(1180, 843, 1188, 851, $x, 5)
        MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )
    Until @error
        MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )
WEnd
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Кайгородов В. Ю.
Так вы основной цикл так и оставьте, а функцию сделайте через IF...Then...Else, ну или попробуйте так:
Код:
Func Click_1()
 PixelSearch(1180, 843, 1188, 851, $x, 5)
Select
Case Not @error
   MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )
Case @error
        MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )
EndSelect
EndFunc

Так тоже работать будет, но плюс этого метода то, что условий Case может быть множество...
 
Автор
К

Кайгородов В. Ю.

В универе только TurboBASIC изучал и то забыл уже
Сообщения
25
Репутация
0
Основная задача, которую я пытаюсь решить этим скриптом это чтоб этот скрипт после смены цвета выполнялся один раз. Так как второе выполнение нажатий отменяет результат первого.
Код:
MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )

А этот:
Код:
MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )

Должен повторяться пока цвет не изменится.

Я даже не совсем уверен, что моя конструкция работала так как я её описал.
Может как-то по другому можно?
 
Автор
К

Кайгородов В. Ю.

В универе только TurboBASIC изучал и то забыл уже
Сообщения
25
Репутация
0
Я стараюсь максимально яснее изъясняться, не знаю как проще объяснить.
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
угу, вроде вник. А если попробовать через While..Wend?

Код:
Func Click_1()
   while 1
  $pi = PixelSearch(1180, 843, 1188, 851, $x, 5)
If Not @error Then
		MsgBox (0, "", "Not @error")
		Sleep (200)
        MouseClick("primary", 898, 762, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 894, 1006, 1, 0)
        Sleep ( '550' )

    Else

		MsgBox (0, "", "@error")
		Sleep (200)
        MouseClick("primary", 904, 533, 1, 0)
        Sleep ( '550' )
        MouseClick("primary", 1189, 8, 1, 0)
        Sleep ( '550' )
		ExitLoop
	EndIf
	WEnd
EndFunc

Но, опять же здесь используется If..Then..Else, которые вы не любите, но по этому-же принципу можно сделать через Switch...EndSwitch, и Select...Case...EndSelect
 
Автор
К

Кайгородов В. Ю.

В универе только TurboBASIC изучал и то забыл уже
Сообщения
25
Репутация
0
Написал два варианта функции:
Код:
Func Click_1()
Select
Case PixelGetColor(1044, 750) = $x
While PixelGetColor(1044, 750) = $x        
        MouseClick("primary", 812, 544, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 812, 580, 2, 0)
        Sleep ( '150' )
WEnd
Case PixelGetColor(1044, 750) = $y
        MouseClick("primary", 812, 580, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 1107, 642, 2, 0)
        Sleep ( '150' )
Case PixelGetColor(1044, 750) = 0x000000
        MouseClick("primary", 812, 544, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 1107, 642, 2, 0)
        Sleep ( '150' )
Case Else
    Sleep ( '150' )
EndSelect
EndFunc

и
Код:
Func Click_1()
If PixelGetColor(1044, 750) = $x Then
While PixelGetColor(1044, 750) = $x        
        MouseClick("primary", 812, 544, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 812, 580, 2, 0)
        Sleep ( '150' )
WEnd
ElseIf PixelGetColor(1044, 750) = $y Then
        MouseClick("primary", 812, 580, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 1107, 642, 2, 0)
        Sleep ( '150' )
ElseIf PixelGetColor(1044, 750) = 0x000000 Then
        MouseClick("primary", 812, 544, 2, 0)
        Sleep ( '150' )
        MouseClick("primary", 1107, 642, 2, 0)
        Sleep ( '150' )
Else
    Sleep ( '150' )
EndIf
EndFunc

Протестил на реальном объекте работает :laugh:
 
Верх