Что нового

Есть ли в AutoIT такая функция, как GoTo?

fasfromua

Новичок
Сообщения
7
Репутация
0
Есть ли в AutoIT такая функция, как GoTo ?
Если есть, то как её правильно использовать (где и как описывается метка или номер строки на которую необходимо будет ссылаться) ?
СПАСИБО.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Нет, такой функции в AutoIt v3 нет.
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
goto это из Basic... (За это часто Basic и не любили)
В QBasic она еще есть, а вот начиная с VBasic 2.0 её уже нет.(если не ошибаюсь... и было это кажется году в 1992/1993)
Её убрали из-за того, что в коде который переваливает за 200-500 строк уже почти не возможно разобраться... из-за goto был похоронен проэкт моего учителя информатики в котором было более 10000 строк. :smile:

В AutoIt естественно этой команды быть не может. :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
и раздел выбран вполне удачно :smile:
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
Неужели в скриптах AutoIT нет возможности перехода с одной части кода в другую ?
Может есть какой аналог GoTo ? Оч. надо...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fasfromua
ИМХО, чем скорее Вы опишите свою проблему поточнее, тем скорее Вам дадут совет.
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
Я думал организовать проверку на наличие файла на диске, а там если файл есть, то продолжить выполнение кода, если файла нет, вернуться на начало проверки. Т. е. проверять до тех пор, пока файл не появиться на диске.
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
Вот как я планировал реализовать это в коде, используя GoTo:
Код:
FileDelete("D:\PDF\21.pdf");
WinWaitActive("Сохранить как")
Send("D:\PDF\New.pdf{Enter}")
Send("{Enter}")
MyLabel:
If FileExists("D:\PDF\New.pdf") Then
FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1);
Else
GoTo MyLabel
EndIf
Как теперь сделать это без GoTo - ума не приложу
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Получается цикл... проверки на наличие... как только находит, то выходит из цикла
While...WEnd
Код:
FileDelete("D:\PDF\21.pdf");
WinWaitActive("Сохранить как")
Send("D:\PDF\New.pdf{Enter}")
Send("{Enter}")
; Получается цикл... проверки на наличие... как только находит, то выходит из цикла
While 1
If FileExists("D:\PDF\New.pdf") Then
ExitLoop
EndIf
sleep(100)
wend
FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1)

Do...Until
Код:
FileDelete("D:\PDF\21.pdf");
WinWaitActive("Сохранить как")
Send("D:\PDF\New.pdf{Enter}")
Send("{Enter}")
; Получается цикл... проверки на наличие... как только находит, то выходит из цикла
Do
sleep(100)
Until FileExists("D:\PDF\New.pdf")
FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1)

For...Next
Код:
FileDelete("D:\PDF\21.pdf");
WinWaitActive("Сохранить как")
Send("D:\PDF\New.pdf{Enter}")
Send("{Enter}")
; Получается цикл... проверки на наличие... как только находит, то выходит из цикла
For $i=1 to 10
If FileExists("D:\PDF\New.pdf") Then
ExitLoop
EndIf
sleep(100)
$i=1
Next
FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1)
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
А какому из этих двух способов лучше отдать предпочтение (While...WEnd или Do...Until) ?
И какова роль задержки в 100 ms (sleep(100)) ?
 

Alexander

Новичок
Сообщения
105
Репутация
2
Делай так:

Код:
While 1
If FileExists("D:\PDF\New.pdf") Then 
FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1)
ExitLoop
EndIf
Wend
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
1. Смотри сам... мне ближе While/Wend... я его лучше воспринемаю... Хотя Do...Until более короткая и правильная запись.
2. Цикл исполняется бесконечно и с максимальной скоростью... без sleep(100) будет кушать ресурсы компьютера...
Alexander
Тоже вариант. :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
fasfromua
Так, наверное, лучше, если я правильно Вас понял
Код:
;...
While 1
	If FileExists("D:\PDF\New.pdf") Then
		FileMove("D:\PDF\New.pdf", "D:\PDF\21.pdf", 1)
	Else
		ExitLoop
	EndIf
	Sleep(20)
WEnd
;...
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
madmasles
Он же если сразу не найдет сразу из цикла выскочит...
А нужно вроде, чтобы пока не нашел не выскочил? :smile:
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
Всё верно. Нужно, чтобы пока не нашёл не выскочил из цикла.
 
Автор
F

fasfromua

Новичок
Сообщения
7
Репутация
0
Всем СПАСИБО !!! Помогли. Тема решена.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
While WEnd - это цикл с препроверкой, Do Until - c постпрверкой. Первый сначала проверит условие и если оно истинно войдет в цикл и будет проверять это условие при каждой итерации, а второй сначала выполнит первую итерацию, получит значение параметра проверки и только потом проверит, и если ложь то продолжит итерации. Вот некоторые примеры
Код:
;------case 1
$sPath = 'file.txt'
$hRead = FileOpen($sPath, 0)
While 1
    $line = FileReadLine($hRead)
    If @error = -1 Then ExitLoop
WEnd
FileClose($hRead)

;------case 2
$sPath = 'file.txt'
$hRead = FileOpen($sPath, 0)
$err = 1
While $err
    $line = FileReadLine($hRead)
    $err = @error + 1
WEnd
FileClose($hRead)
;------case 3
$sPath = 'file.txt'
$hRead = FileOpen($sPath, 0)
$line = FileReadLine($hRead)
While $line
    $line = FileReadLine($hRead)
WEnd
FileClose($hRead)
;------case 4
$sPath = 'file.txt'
$hRead = FileOpen($sPath, 0)
Do
    $line = FileReadLine($hRead)
Until @error = -1
FileClose($hRead)
;-----------etc etc

Как можно видеть, последний пример для этого конкретного случая более предпочтителен, в силу естественной направленности и лаконичности. так что все зависит от задачи.
 

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
а второй сначала выполнит первую итерацию, получит значение параметра проверки и только потом проверит, и если истина то продолжит итерации
Я прошу прощения, но по моему в ваше описание закралась ошибка. Do ... Until как раз таки не станет повторять цикл если условие истина, а вот если ложь - то продолжит.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
NoMad73rus
да. ты прав. спасибо за поправку.
 
Верх