Что нового

select ...case... endselect в цикл

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
Доброго времени суток. Решил сократить количество строк в коде путем цикла.
основной цикл имел вот такой вид
Код:
While True
    Global $msg = GUIGetMsg()
    Select
        Case $msg = -3
            Exit
        Case $msg = $auto
            For $ii = GUICtrlRead($edit_number) To 21
                Sleep(1000)
                ClipPut(GUICtrlRead(Eval("acc" & $ii)))
                GUICtrlSetBkColor(Eval("acc" & $ii), 0xCCFFCC)
                voting()
                Sleep(5000)
            Next
        Case $msg = $acc1
            GUICtrlSetBkColor($acc1, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc1))
;~              WinActivate('[CLASS:MozillaWindowClass]')
            voting()
        Case $msg = $acc2
            GUICtrlSetBkColor($acc2, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc2))
            voting()
        Case $msg = $acc3
            GUICtrlSetBkColor($acc3, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc3))
            voting()
        Case $msg = $acc4
            GUICtrlSetBkColor($acc4, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc4))
            voting()
        Case $msg = $acc5
            GUICtrlSetBkColor($acc5, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc5))
            voting()
        Case $msg = $acc6
            GUICtrlSetBkColor($acc6, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc6))
            voting()
        Case $msg = $acc7
            GUICtrlSetBkColor($acc7, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc7))
        Case $msg = $acc8
            GUICtrlSetBkColor($acc8, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc8))
        Case $msg = $acc9
            GUICtrlSetBkColor($acc9, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc9))
        Case $msg = $acc10
            GUICtrlSetBkColor($acc10, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc10))
        Case $msg = $acc11
            GUICtrlSetBkColor($acc11, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc11))
        Case $msg = $acc12
            GUICtrlSetBkColor($acc12, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc12))
        Case $msg = $acc13
            GUICtrlSetBkColor($acc13, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc13))
        Case $msg = $acc14
            GUICtrlSetBkColor($acc14, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc14))
        Case $msg = $acc15
            GUICtrlSetBkColor($acc15, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc15))
        Case $msg = $acc16
            GUICtrlSetBkColor($acc16, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc16))
        Case $msg = $acc17
            GUICtrlSetBkColor($acc17, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc17))
        Case $msg = $acc18
            GUICtrlSetBkColor($acc18, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc18))
        Case $msg = $acc19
            GUICtrlSetBkColor($acc19, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc19))
        Case $msg = $acc20
            GUICtrlSetBkColor($acc20, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc20))
        Case $msg = $acc21
            GUICtrlSetBkColor($acc21, 0xCCFFCC)
            ClipPut(GUICtrlRead($acc21))

        Case $msg = $nik1
            GUICtrlSetBkColor($nik1, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik1))
        Case $msg = $nik2
            GUICtrlSetBkColor($nik2, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik2))
        Case $msg = $nik3
            GUICtrlSetBkColor($nik3, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik3))
        Case $msg = $nik4
            GUICtrlSetBkColor($nik4, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik4))
        Case $msg = $nik5
            GUICtrlSetBkColor($nik5, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik5))
        Case $msg = $nik6
            GUICtrlSetBkColor($nik6, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik6))
        Case $msg = $nik7
            GUICtrlSetBkColor($nik7, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik7))
        Case $msg = $nik8
            GUICtrlSetBkColor($nik8, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik8))
        Case $msg = $nik9
            GUICtrlSetBkColor($nik9, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik9))
        Case $msg = $nik10
            GUICtrlSetBkColor($nik10, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik10))
        Case $msg = $nik11
            GUICtrlSetBkColor($nik11, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik11))
        Case $msg = $nik12
            GUICtrlSetBkColor($nik12, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik12))
        Case $msg = $nik13
            GUICtrlSetBkColor($nik13, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik13))
        Case $msg = $nik14
            GUICtrlSetBkColor($nik14, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik14))
        Case $msg = $nik15
            GUICtrlSetBkColor($nik15, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik15))
        Case $msg = $nik16
            GUICtrlSetBkColor($nik16, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik16))
        Case $msg = $nik17
            GUICtrlSetBkColor($nik17, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik17))
        Case $msg = $nik18
            GUICtrlSetBkColor($nik18, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik18))
        Case $msg = $nik19
            GUICtrlSetBkColor($nik19, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik19))
        Case $msg = $nik20
            GUICtrlSetBkColor($nik20, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik20))
        Case $msg = $nik21
            GUICtrlSetBkColor($nik21, 0xCCFFCC)
            ClipPut(GUICtrlRead($nik21))
        Case $msg = $reset
            reset()
    EndSelect
    Sleep(10)
WEnd


после внедрения цикла код стал такого вида

Код:
While True
    Global $msg = GUIGetMsg()
    For $zz = 1 To UBound($nicks) - 1
        Select
            Case $msg = -3
                Exit
            Case $msg = Eval("acc" & $zz)
                GUICtrlSetBkColor(Eval("acc" & $zz, 0xCCFFCC))
;~             ClipPut(GUICtrlRead(Eval("acc" & $zz)))
                voting()
            Case $msg = Eval("nik" & $zz)
                GUICtrlSetBkColor(Eval("nik" & $zz), 0xCCFFCC)
                ClipPut(GUICtrlRead(Eval("nik" & $zz)))
            Case $msg = $auto
;~             Sleep(2*60*60*1000) ; время отложки скрипта
                For $ii = GUICtrlRead($edit_number) To 21
                    ConsoleWrite($ii&@CRLF)
                    Sleep(1000)
;~                     ClipPut(GUICtrlRead(Eval("acc" & $ii)))
                    GUICtrlSetBkColor(Eval("acc" & $ii), 0xCCFFCC)
                    voting()
;~                     _mac_adrdress_changer()
                    Sleep(10000)
                    If StringCompare(GUICtrlRead(Eval('acc' & $ii)), $ii & " already voted") > 0 Then Sleep(Random(8 * 60 * 1000, 11 * 60 * 1000))
                Next
            Case $msg = $reset
                reset()
        EndSelect
    Next
    Sleep(10)
WEnd

Как бы все работает. Но я заметил то, что скрипт работает без завершения цикла For $ii = GUICtrlRead($edit_number) To 21. Если $ii=21, то цикл проработает как нужно, но почему то цикл на этом не завершится и переменная ii сбросится на значение GUICtrlRead($edit_number). И цикл так работает постоянно. Я думал о том, что возможно кнопка $auto нажалась дважды, но нет. Да знаю, можно добавить в конце строку if $ii=21 then exitloop. Но меня волнует то, правильно ли я ввел select ...case... endselect в цикл. Может этого не следует делать? Или есть какой то другой метод?
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
... скрипт работает без завершения цикла For $ii = GUICtrlRead($edit_number) To 21...
Без завершения, но только не этого цикла.
Для наглядности сократил ваш код:
Код:
While True
    Global $iMsg = GUIGetMsg()
    For $zz = 1 To UBound($nicks) - 1
        ; ... после "For" --> "While" и сразу же опять "For"
    Next
    Sleep(10)
WEnd

А вообще я бы предложил вам такую "оптимизацию".
Код:
While Sleep(10)
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case -3
            Exit
        Case $auto
            For $ii = GUICtrlRead($edit_number) To 21
                Sleep(1000)
                ClipPut(GUICtrlRead(Eval("acc" & $ii)))
                GUICtrlSetBkColor(Eval("acc" & $ii), 0xCCFFCC)
                voting()
                Sleep(5000)
            Next
        Case $acc1, $acc2, $acc3, $acc4, $acc5, $acc6
            GUICtrlSetBkColor($iMsg, 0xCCFFCC)
            ClipPut(GUICtrlRead($iMsg))
            voting()
        Case $acc7, $acc8, $acc9, $acc10, $acc11, $acc12, $acc13, $acc14, $acc15, _
                $acc16, $acc17, $acc18, $acc19, $acc20, $acc21, $nik1, $nik2, $nik3, _
                $nik4, $nik5, $nik6, $nik7, $nik8, $nik9, $nik10, $nik11, $nik12, $nik13, _
                $nik14, $nik15, $nik16, $nik17, $nik18, $nik19, $nik20, $nik21
                ; Если элементы были созданы по порядку, то можно и так:
                ; Case $acc7 To $nik21
            GUICtrlSetBkColor($iMsg, 0xCCFFCC)
            ClipPut(GUICtrlRead($iMsg))
        Case $reset
            reset()
    EndSelect
WEnd
 
Последнее редактирование:
Автор
A

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
Без завершения, но только не этого цикла.
Для наглядности сократил ваш код:
Код:
While True
    Global $iMsg = GUIGetMsg()
    For $zz = 1 To UBound($nicks) - 1
        ; ... после "For" --> "While" и сразу же опять "For"
    Next
    Sleep(10)
WEnd


Не понял. Что я не правильно сделал?
 
Последнее редактирование:

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Что я не правильно сделал?
Практически все время скрипт будет в цикле "For $zz = 1", а не в "While".
И это только на первый взгляд. Потому как, для того что бы понять что не так нужно смотреть весь скрипт: как создаются элементы и какие действия вы от них добиваетесь.
но почему то цикл на этом не завершится и переменная ii сбросится
для того чтобы так происходило нужно чтобы "$auto = 0", проверьте ее.
И еще, у вас в цикле While цикл For, внутри которого еще For - это не есть гуд. Почему? Потому что проверка GUIGetMsg() происходит только в While. Кроме того, когда процесс попадет во второй For он там зависнет.
Код:
For $ii = GUICtrlRead($edit_number) To 21
; ...
    Sleep(1000) ; 1 секунда простоя
; ...
    voting() ; Что тут происходит я не знаю
; ...
    Sleep(10000) ; 10 секунд простоя
    ; как минимум 8 минут простоя
    If StringCompare(GUICtrlRead(Eval('acc' & $ii)), $ii & " already voted") > 0 Then Sleep(Random(8 * 60 * 1000, 11 * 60 * 1000))
Next
... т.е. в это время скрипт не будет отвечать на нажатие кнопок.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
как вариант, если много элементов, то свести их в массив с флагами функций
можно динамические менять флаги функций
Код:
Global $aCtrl[6][2];первая колонка это id элемента, вторая колонка - флаг функции: 1 - voting(), 2 - reset() и так далее
;вместо Select использовать
$Form1 = GUICreate("Form1", 313, 330, 192, 124)
$aCtrl[0][0] = GUICtrlCreateRadio("Radio1", 48, 24, 113, 17)
$aCtrl[1][0] = GUICtrlCreateRadio("Radio2", 48, 64, 113, 17)
$aCtrl[2][0] = GUICtrlCreateRadio("Radio3", 56, 104, 113, 17)
$aCtrl[3][0] = GUICtrlCreateRadio("Radio4", 48, 144, 113, 17)
$aCtrl[3][1] = 1
$aCtrl[4][0] = GUICtrlCreateRadio("Radio5", 48, 192, 113, 17)
$aCtrl[5][0] = GUICtrlCreateRadio("Radio6", 40, 248, 113, 17)
$aCtrl[5][1] = 2
GUICtrlCreateRadio("Radio7", 40, 280, 113, 17)
GUISetState()
While 1
    $imsg = GUIGetMsg()
    Switch $imsg
        Case -3
            Exit
        Case $aCtrl[0][0] To $aCtrl[5][0]
            For $i = 0 To 5
                If $aCtrl[$i][0] = $imsg Then
                    Switch $aCtrl[$i][1]
                        Case 1
                            _voting()
                        Case 2
                            _reset()
                    EndSwitch
                EndIf
            Next
    EndSwitch
WEnd

Func _voting()
    ConsoleWrite('voting' & @LF)
EndFunc   ;==>_voting

Func _reset()
    ConsoleWrite('reset' & @LF)
EndFunc   ;==>_reset
 
Автор
A

ahjkcfout7

Знающий
Сообщения
26
Репутация
6
как вариант, если много элементов, то свести их в массив с флагами функций
можно динамические менять флаги функций
Код:
Global $aCtrl[6][2];первая колонка это id элемента, вторая колонка - флаг функции: 1 - voting(), 2 - reset() и так далее
;вместо Select использовать
$Form1 = GUICreate("Form1", 313, 330, 192, 124)
$aCtrl[0][0] = GUICtrlCreateRadio("Radio1", 48, 24, 113, 17)
$aCtrl[1][0] = GUICtrlCreateRadio("Radio2", 48, 64, 113, 17)
$aCtrl[2][0] = GUICtrlCreateRadio("Radio3", 56, 104, 113, 17)
$aCtrl[3][0] = GUICtrlCreateRadio("Radio4", 48, 144, 113, 17)
$aCtrl[3][1] = 1
$aCtrl[4][0] = GUICtrlCreateRadio("Radio5", 48, 192, 113, 17)
$aCtrl[5][0] = GUICtrlCreateRadio("Radio6", 40, 248, 113, 17)
$aCtrl[5][1] = 2
GUICtrlCreateRadio("Radio7", 40, 280, 113, 17)
GUISetState()
While 1
    $imsg = GUIGetMsg()
    Switch $imsg
        Case -3
            Exit
        Case $aCtrl[0][0] To $aCtrl[5][0]
            For $i = 0 To 5
                If $aCtrl[$i][0] = $imsg Then
                    Switch $aCtrl[$i][1]
                        Case 1
                            _voting()
                        Case 2
                            _reset()
                    EndSwitch
                EndIf
            Next
    EndSwitch
WEnd

Func _voting()
    ConsoleWrite('voting' & @LF)
EndFunc   ;==>_voting

Func _reset()
    ConsoleWrite('reset' & @LF)
EndFunc   ;==>_reset
Вообще супер. Я любитель массивов, и постоянно их использую, иногда там, где они не требуются. И почему то не подумал, что можно гуи элементы вводить в массив. Все потому что не читал форум(в чем искренне каюсь), а писал программы основываясь на моих ограниченных знаниях.
Код:
#include <array.au3>
GUICreate("l2voting", 360, 690)
$offsetY = 30
$offsetX = 20
Dim $myarray[43][2]
$emails = "email"
For $i = 1 To 42
    If $i < 22 Then
        $myarray[$i][1] = 1
        $myarray[$i][0] = GUICtrlCreateButton($i & " " & $emails, 5, -25 + $offsetY * $i, 150, 30)
        GUICtrlSetFont(-1, 12, 400, "Comic Sans MS")
;~     GUICtrlSetColor(-1, 0xDC143C)
    Else
        $myarray[$i][0] = GUICtrlCreateButton($i - 21 & " nick", 180, -25 + $offsetY * ($i - 21), 150, 30)
;~     GUICtrlSetColor(-1, 0xDC143C)
        GUICtrlSetFont(-1, 12, 400, "Comic Sans MS")
        $myarray[$i][1] = 2
    EndIf
Next
;~ _ArrayDisplay($myarray)
GUISetState()
While 1
    $imsg = GUIGetMsg()
    Switch $imsg
        Case -3
            Exit
        Case $myarray[1][0] To $myarray[42][0]
            For $i = 1 To 42
                If $myarray[$i][0] = $imsg Then
                    Switch $myarray[$i][1]
                        Case 1
                            _email()
                        Case 2
                            _nick()
                    EndSwitch
                EndIf
            Next
    EndSwitch
WEnd
Func _email()
    ConsoleWrite('email' & @LF)
EndFunc   ;==>_email

Func _nick()
    ConsoleWrite('nick' & @LF)
EndFunc   ;==>_nick
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно извратиться ещё короче :
Код:
#include <array.au3>
GUICreate("l2voting", 360, 690)
$offsetY = 30
$offsetX = 20
Dim $myarray[43][2]
Dim $emails[2] =[ "email","nick"]
For $i = 1 To 42

    $K= int($i/22)
    $myarray[$i][1] = $K+1
    $myarray[$i][0] = GUICtrlCreateButton($i & " " & $emails[$K], 5+$K*180, -25 + $offsetY * ($i - $K*21), 150, 30)
   GUICtrlSetFont(-1, 12, 400, "Comic Sans MS")

Next
;~ _ArrayDisplay($myarray)
GUISetState()
While 1
    $imsg = GUIGetMsg()
    Switch $imsg
        Case -3
            Exit
        Case $myarray[1][0] To $myarray[42][0]
            For $i = 1 To 42
                If $myarray[$i][0] = $imsg Then
                    Switch $myarray[$i][1]
                        Case 1
                            _email()
                        Case 2
                            _nick()
                    EndSwitch
                EndIf
            Next
    EndSwitch
WEnd
Func _email()
    ConsoleWrite('email' & @LF)
EndFunc   ;==>_email

Func _nick()
    ConsoleWrite('nick' & @LF)
EndFunc   ;==>_nick
 
Верх