Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как сделать выбор устанавливаемых программ по чекбокс? (http://forum.oszone.net/showthread.php?t=185762)

Pozia 17-09-2010 18:30 1497969

Как сделать выбор устанавливаемых программ по чекбокс?
 
Собственно нашел вот такую тему но не смог переделать под свои нужды. Прикол с папками как в той теме мне не нужен. Мне просто нужна возможность выбирать птичками необходимые пункты. Снизу кнопка Выполнить или Отмена. При выполнении скрипта нужно чтобы каждой птичке соответствовала выполнение своего действия через команду RunWait. При этом, после нажатия Выполнить желательно чтобы кнопки и птички затемнились чтоб нельзя было чего нить нажать. А окно пусть не исчезает. А для индикации того, что система не висит может можно чтонить в окно повесить типо как в винде снизу справа точки моргают или что нить другое. Желательно чтобы количество птичек можно было бы легко изменять без сильной переделки скрипта. Спасибо.

Creat0R 17-09-2010 18:55 1497980

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

; Только эту строку и нужно править для добавления новых, или удаления пунктов ;)
Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1] = [$aProgs[0]]

$Form1 = GUICreate("", 500, 500)

$iTop = 10
$iLeft = 20

For $i = 1 To $aProgs[0]
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15)
    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)

    $iTop += 20

    If $iTop > 440 Then
        $iTop = 10
        $iLeft += 100
    EndIf
Next

GUICtrlCreateLabel("Status:", 200, 475, 460, 15)
GUICtrlSetFont(-1, 9, 800)
$nStatus = GUICtrlCreateLabel("", 250, 476, 240, 15)
GUICtrlSetColor(-1, 0xFF0000)

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)
$nCancel = GUICtrlCreateButton("Отмена", 100, 470, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nCancel
            Exit
        Case $nStart
            For $i = 1 To $aProgs[0]
                If GUICtrlRead($anCheckBoxes[$i]) = $GUI_CHECKED Then
                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    GUICtrlSetData($nStatus, StringFormat("Please wait, installing [%s]...", $sProgName))

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 800)
                    _ControlsSetState($GUI_DISABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])

                    RunWait($sProgExe)

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)
                    _ControlsSetState($GUI_ENABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])
                EndIf
            Next

            GUICtrlSetData($nStatus, "Done!")
    EndSwitch
WEnd

Func _ControlsSetState($nState, $iFirst, $iLast)
    For $iCtrlID = $iFirst To $iLast
        GUICtrlSetState($iCtrlID, $nState)
    Next
EndFunc


Pozia 17-09-2010 19:06 1497990

Два вопроса.
1. Как все же добавить такого рода команды:
HTML код:

      Run(@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"', @ScriptDir)
      Run(@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"', @ScriptDir)
      Run(@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"', @ScriptDir)
      Run(@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"', @ScriptDir)
      Run(@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"', @ScriptDir)

Копчиком чую что это где то в строке:
Код:

$sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
а как правильно записать не знаю.

2. После нажатия кнопки Выполнить и выполнения всех команд необходимо чтобы окно закрылось

Creat0R 17-09-2010 19:25 1498005

Цитата:

Цитата Pozia
Копчиком чую что это где то в строке »

Угу, вот только не знаю зачем копчик использовать :dont-know , в скрипте ведь над этой строкой написано что её только и нужно править:

Код:

Global $sProgs =
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"=Driver 1|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"=Driver 2|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"=Driver 3|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"=Driver 4|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"=Driver 5'

Цитата:

Цитата Pozia
После нажатия кнопки Выполнить и выполнения всех команд необходимо чтобы окно закрылось »

Поссле (или вместо, т.к при закрытий оно особо значения не имеет)
Код:

GUICtrlSetData($nStatus, "Done!")
Добавь
Код:

GUIDelete($Form1)
Exit


Pozia 17-09-2010 20:22 1498064

Creat0R, выскакивает ошибка Error: Error in expression

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

; Только эту строку и нужно править для добавления новых, или удаления пунктов ;)

Global $sProgs =
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"=Driver 1|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"=Driver 2|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"=Driver 3|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"=Driver 4|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"=Driver 5'

Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1] = [$aProgs[0]]

$Form1 = GUICreate("", 500, 500)

$iTop = 10
$iLeft = 20

For $i = 1 To $aProgs[0]
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15)
    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)

    $iTop += 20

    If $iTop > 440 Then
        $iTop = 10
        $iLeft += 100
    EndIf
Next

GUICtrlCreateLabel("Status:", 200, 475, 460, 15)
GUICtrlSetFont(-1, 9, 800)
$nStatus = GUICtrlCreateLabel("", 250, 476, 240, 15)
GUICtrlSetColor(-1, 0xFF0000)

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)
$nCancel = GUICtrlCreateButton("Отмена", 100, 470, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nCancel
            Exit
        Case $nStart
            For $i = 1 To $aProgs[0]
                If GUICtrlRead($anCheckBoxes[$i]) = $GUI_CHECKED Then
                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    GUICtrlSetData($nStatus, StringFormat("Please wait, installing [%s]...", $sProgName))

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 800)
                    _ControlsSetState($GUI_DISABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])

                    RunWait($sProgExe)

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)
                    _ControlsSetState($GUI_ENABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])
                EndIf
            Next

            GUICtrlSetData($nStatus, "Done!")
            GUIDelete($Form1)
            Exit
    EndSwitch
WEnd

Func _ControlsSetState($nState, $iFirst, $iLast)
    For $iCtrlID = $iFirst To $iLast
        GUICtrlSetState($iCtrlID, $nState)
    Next
EndFunc


Creat0R 17-09-2010 20:32 1498071

Цитата:

Цитата Pozia
выскакивает ошибка Error »

Упс:

Код:

Global $sProgs = _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"=Driver 1|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"=Driver 2|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"=Driver 3|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"=Driver 4|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"=Driver 5'


Pozia 17-09-2010 20:57 1498088

еще нюанс. Вот при такой записи обрывает слова:

Код:

Global $sProgs = _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"=DriversNEW Computer|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"=DriversNEW Notebook|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"=Driver 3|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"=Driver 4|' & _
    @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"=Driver 5'

В окне только DriversNEW Compu и DriversNEW Noteboo

Как сделать чтоб не обрезало? Фразы планирую еще чуть длинее писать

Pozia 17-09-2010 21:23 1498111

и еще. пытаюсь записать команду чтоб выполнялась скрыто и получаю ошибку: Unterminated string

Пишу так:

Код:

Global $sProgs = _
@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\DriversNEWComputer.7z"', @ScriptDir, @SW_HIDE"=DriversNEW Computer|' & _
@ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\DriversNEWNotebook.7z"=DriversNEW Notebook'


Creat0R 17-09-2010 21:23 1498112

Цитата:

Цитата Pozia
при такой записи обрывает слова »

Это из за размера Checkbox:

Код:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

Global $iTotalProgs = 5

Global $aProgs[$iTotalProgs + 1][4] = _
    [[$iTotalProgs], _
        ['DriversNEW Computer',  @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\1.7z"', @ScriptDir, @SW_HIDE], _
        ['DriversNEW Notebook',  @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\2.7z"', @ScriptDir, @SW_HIDE], _
        ['Driver 3',            @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\3.7z"', @ScriptDir, @SW_HIDE], _
        ['Driver 4',            @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\4.7z"', @ScriptDir, @SW_HIDE], _
        ['Driver 5',            @ScriptDir & '\7z.exe x -y -aoa -o"' & @WindowsDir & '\DriversPozia" "' & @ScriptDir & '\5.7z"', @ScriptDir, @SW_HIDE] _
    ]

Global $anCheckBoxes[$iTotalProgs + 1] = [$iTotalProgs]

$Form1 = GUICreate("", 500, 500)

$iTop = 10
$iLeft = 20

For $i = 1 To $iTotalProgs
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox($aProgs[$i][0], $iLeft, $iTop, 200, 15)
    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)

    $iTop += 20

    If $iTop > 440 Then
        $iTop = 10
        $iLeft += 210
    EndIf
Next

GUICtrlCreateLabel("Status:", 200, 475, 460, 15)
GUICtrlSetFont(-1, 9, 800)
$nStatus = GUICtrlCreateLabel("", 250, 476, 240, 15)
GUICtrlSetColor(-1, 0xFF0000)

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)
$nCancel = GUICtrlCreateButton("Отмена", 100, 470, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nCancel
            Exit
        Case $nStart
            For $i = 1 To $iTotalProgs
                If GUICtrlRead($anCheckBoxes[$i]) = $GUI_CHECKED Then
                    $sProgramName = $aProgs[$i][0]
                    $sProgramExe = $aProgs[$i][1]
                    $sWorkingDir = $aProgs[$i][2]
                    $nRunState = $aProgs[$i][3]

                    If $sWorkingDir == "" Then $sWorkingDir = @WorkingDir
                    If $nRunState == "" Then $nRunState = @SW_SHOW

                    GUICtrlSetData($nStatus, StringFormat("Please wait, installing [%s]...", $sProgramName))

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 800)
                    _ControlsSetState($GUI_DISABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])

                    RunWait($sProgramExe, $sWorkingDir, $nRunState)

                    GUICtrlSetFont($anCheckBoxes[$i], 9, 400)
                    _ControlsSetState($GUI_ENABLE, $anCheckBoxes[1], $anCheckBoxes[$anCheckBoxes[0]])
                EndIf
            Next

            GUICtrlSetData($nStatus, "Done!")
            GUIDelete($Form1)
            ExitLoop
    EndSwitch
WEnd

Func _ControlsSetState($nState, $iFirst, $iLast)
    For $iCtrlID = $iFirst To $iLast
        GUICtrlSetState($iCtrlID, $nState)
    Next
EndFunc


Pozia 17-09-2010 21:41 1498127

Creat0R, а по поводу выполнения команды скрыто подскажете?

Creat0R 17-09-2010 21:43 1498130

Цитата:

Цитата Pozia
пытаюсь записать команду чтоб выполнялась скрыто и получаю ошибку »

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

Pozia 17-09-2010 22:01 1498140

Цитата:

Цитата Creat0R
Это из за размера Checkbox: »

не совсем понял. вижу вы изменили 9 на 8,5. Это высота шрифта? В данном случае помогло. Но я записал фразу длиннее и опять обрезало. Шрифт ведь уменьшать все время не получится. По другому обрезку никак не устранить?

Цитата:

Цитата Creat0R
Поправил пример. »

все работатет, но дос окно по прежнему не скрыто. А в нем виден весь процесс распаковки

Creat0R 17-09-2010 23:37 1498193

Цитата:

Цитата Pozia
Шрифт ведь уменьшать все время не получится »

Ну в последнем варианте я задал точную длину строки (200), если этого мало, то можно добавить. Но также нужно будет увеличить и итерацию переменной $iLeft.

Цитата:

Цитата Pozia
дос окно по прежнему не скрыто »

Поправил.

Pozia 18-09-2010 00:21 1498209

Последний вроде вопрос. Опять же по вместительности. В строке

Код:

GUICtrlSetData($nStatus, StringFormat("Please wait, installing [%s]...", $sProgramName))
не все влазит в переменой %s. Где расширить поле?

разобрался


Время: 04:25.

Время: 04:25.
© OSzone.net 2001-