Компьютерный форум 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=173839)

Centrinar 22-04-2010 22:59 1398866

[решено] Как узнать кол-во отмеченных чекбоксов?
 
Без вас господа никуда :) Как можно посчитать кол-во чекбоксов которые были отмеченны? СПАСИБО!

beve 22-04-2010 23:12 1398878

Самое малое - двумя способами: или во время того, как отмечаете эти самые чекбоксы, или уже после того как они отмечены-неотмечены пройтись по ним... Может еще кто способов добавит... но поможет ли это вам? :) Если нет, то объясните продробнее, что вы делаете и пример вашего скрипта.

Centrinar 22-04-2010 23:48 1398905

Можно на этом продемонстрировать
Код:

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

Global $sProgs = 'Setup.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

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

$Form1 = GUICreate("", 100, 150, -1, -1)

$iTop = 10

For $i = 1 To $aProgs[0]
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), 10, $iTop, 100, 15)
    $iTop += 20
Next

$Button1 = GUICtrlCreateButton("Button1", 10, 110, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

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

                    MsgBox(64, $sProgName, $sProgExe)
                EndIf
            Next
    EndSwitch
WEnd


beve 23-04-2010 01:23 1398949

Код:

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

Global $k=0
;счетчик для отмеченных чекбоксов
Global $sProgs = 'Setup.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'

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

$Form1 = GUICreate("", 100, 150, -1, -1)

$iTop = 10

For $i = 1 To $aProgs[0]
   
$anCheckBoxes[$i] =
GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), 10, $iTop, 100, 15)
   
$iTop += 20
Next

$Button1 =
GUICtrlCreateButton("Button1", 10, 110, 80, 25)

GUISetState(@SW_SHOW)

While 1
   
$nMsg =
GUIGetMsg()

   
Switch $nMsg
       
Case $GUI_EVENT_CLOSE
           
Exit
        Case
$Button1
           
For $i = 1 To $aProgs[0]
               
If
GUICtrlRead($anCheckBoxes[$i]) = 1 Then
                   
$sProgName =
StringRegExpReplace($aProgs[$i], '^.*=', '')
                   
$sProgExe =
StringRegExpReplace($aProgs[$i], '=.*$', '')
                   
$k+=1
                   
MsgBox
(64, $sProgName, $sProgExe)
               
EndIf
            Next
           
MsgBox(0,"Количество отмеченных чекбоксов", $k)
           
$k=0
   
EndSwitch
WEnd


Centrinar 23-04-2010 13:51 1399220

Cделал прогрессбар, смысл в том что бы он прибовлаль число ($iProgr) которое равно 100/$k, $k соответственно это кол-во отмеченных чекбоксов, но он категорически не хочет выполнять дилние т.е. не может разделить 100/$k
Код:

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

Global $k=0 ;счетчик для отмеченных чекбоксов
Global $sProgs = 'Setup.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
Global  $iProgr = 0

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

$Form1 = GUICreate("", 300, 300, -1, -1)

$iTop = 10

For $i = 1 To $aProgs[0]
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), 10, $iTop, 100, 15)
    $iTop += 20
Next

$progressbar1 = GUICtrlCreateProgress (150,150,150,20)
GUICtrlSetColor(-1,32250)

$Button1 = GUICtrlCreateButton("Button1", 10, 110, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            For $i = 1 To $aProgs[0]
                If GUICtrlRead($anCheckBoxes[$i]) = 1 Then
                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')
                    $k+=1
                                        $iProgr += 100/$k
                                        MsgBox(64, $sProgName, $sProgExe)
                EndIf
            Next
            MsgBox(0,"Количество отмеченных чекбоксов", $k)
            $k=0
    EndSwitch
WEnd


Creat0R 23-04-2010 14:30 1399237

Цитата:

Цитата Centrinar
н категорически не хочет выполнять дилние т.е. не может разделить 100/$k »

Ну почему, деление как раз происходит, если к примеру отметить две птички, то $iProgr будет равна 150, т.к первый раз мы делим 100 на 1 (один отмечены чекбокс) и получаем естественно 100, а второй раз мы уже делим 100 на 2 и получаем 50, отсюда и результат: 100 + 50 = 150 :)

А вообще прогресс строится не так, нужно получить шаг прогресса методом деления 100% на общее количество чекбоксов, а потом каждый раз прибавлять этот шаг в цикле:

Код:

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

Global $sProgs = 'Setup.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1]

Global $iChecked_Counter = 0 ;Счетчик для отмеченных чекбоксов
Global $iProgress_Step = 100 / $aProgs[0] ;Шаг прогресса
Global $iProgress = 0 ;Счётчик прогресса

$Form1 = GUICreate("", 300, 300, -1, -1)

$iTop = 10

For $i = 1 To $aProgs[0]
    $anCheckBoxes[$i] = GUICtrlCreateCheckbox(StringRegExpReplace($aProgs[$i], '^.*=', ''), 10, $iTop, 100, 15)
    $iTop += 20
Next

$ProgressBar1 = GUICtrlCreateProgress(150, 150, 150, 20)
GUICtrlSetColor(-1, 32250)

$Button1 = GUICtrlCreateButton("Button1", 10, 110, 80, 25)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            For $i = 1 To $aProgs[0]
                $iProgress += $iProgress_Step

                If GUICtrlRead($anCheckBoxes[$i]) = 1 Then
                    $iChecked_Counter += 1

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    MsgBox(64, $sProgName, $sProgExe)
                EndIf

                GUICtrlSetData($ProgressBar1, $iProgress)
            Next

            MsgBox(0, "Количество отмеченных чекбоксов", $iChecked_Counter)
            $iChecked_Counter = 0
    EndSwitch
WEnd


kaster 23-04-2010 14:30 1399239

Centrinar, а зачем тебе второй счетчик $k? используй тот, что входит в цикл - $i - вместо него
а твоя ошибка в том, что он ($k) у тебя изначально не проинициализирован. А ты хочешь к нему автоинкремент прмименить

Creat0R 23-04-2010 14:44 1399244

Цитата:

Цитата kaster
зачем тебе второй счетчик $k? используй тот, что входит в цикл - $i - вместо него »

$i это общий счётчик, он отобразит не количество отмеченных чекбоксов, а всех перечисленных в цикле.

Centrinar 23-04-2010 14:49 1399246

Сделал как в образце, но он прибовляет сразу 100
Код:

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

Global $sProgs = 'Setup1.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'



Global  $iProgr = 0
Global Const $aProgs = StringSplit($sProgs, '|')
Global $anCheckBoxes[$aProgs[0]+1]
Global $aCheckedIcons[$aProgs[0]+1]
Global $aUnCheckedIcons[$aProgs[0]+1]
Global $iChecked_Counter = 0 ;Счетчик для отмеченных чекбоксов
Global $iProgress_Step = 100 / $aProgs[0] ;Шаг прогресса
Global $iProgress = 0 ;Счётчик прогресса
$Form1 = GUICreate("", 600, 500, -1, -1)

$iTop = 10
$iLeft = 20


For $i = 1 To $aProgs[0]
    $aCheckedIcons[$i] = -5
    $aUnCheckedIcons[$i] = -4

    $anCheckBoxes[$i] = _GUICtrlCreateCheckboxEx(StringRegExpReplace($aProgs[$i], '^.*=', ''), $iLeft, $iTop, -1, 15, "shell32.dll", $aUnCheckedIcons[$i])
    $iTop += 20

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

$ProgressBar1 = GUICtrlCreateProgress(150, 150, 150, 20)
GUICtrlSetColor(-1, 32250)

$nStart = GUICtrlCreateButton("Выполнить", 10, 470, 80, 25)
$nButton1 = GUICtrlCreateButton("Отметить все", 100, 470, 80, 25)
$nButton2 = GUICtrlCreateButton("Отметить все", 190, 470, 80, 25)

GUIStartGroup()



GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
          Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton1
                        For $i = 1 to $aProgs[0]
            $aArray=$anCheckBoxes[$i]
      GUICtrlSetState ($aArray[1],$GUI_CHECKED)
  Next
  Case $nButton2
                        For $i = 1 to $aProgs[0]
            $aArray=$anCheckBoxes[$i]
      GUICtrlSetState ($aArray[1],$GUI_UNCHECKED)
          Next
                Case $nStart
                        For $i = 1 To $aProgs[0]
            $iProgress += $iProgress_Step
                        $aCheckBox = $anCheckBoxes[$i]
                If GUICtrlRead($aCheckBox[1]) = 1 Then
                                        $iChecked_Counter += 1
                                        GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])
                    GuiCtrlSetData($progressbar1, $iProgr)
                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')
                    Call ("_MonitorOFF")
                    MsgBox(64, $sProgName, "sss", 3)
                                        Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            GUICtrlSetData($ProgressBar1, $iProgress)
                        Next
                $iChecked_Counter = 0
                EndSwitch
WEnd

Func _GUICtrlCreateCheckboxEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $sIconFile="", $nIconIndex=0)
    Local $aRetArr[2]

    $aRetArr[0] = GUICtrlCreateIcon($sIconFile, $nIconIndex, $iLeft + 17, $iTop, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

    $aRetArr[1] = GUICtrlCreateCheckbox("      " & $sText & " ", $iLeft, $iTop, $iWidth, $iHeight, $WS_CLIPSIBLINGS)

    Return $aRetArr
EndFunc


Creat0R 23-04-2010 15:11 1399263

Цитата:

Цитата Centrinar
Сделал как в образце, но он прибовляет сразу 100 »

Потому что в цикле вместо $iProgress используется $iProgr. И ещё, а зачем тогда нужен счётчик отмеченных чекбоксов?

Centrinar 23-04-2010 15:13 1399265

Что бы он делил не на общще кол-во чек боксов а только на отмеченные, а как иначе?

Creat0R 23-04-2010 15:18 1399269

Цитата:

Цитата Centrinar
Что бы он делил не на общще кол-во чек боксов а только на отмеченные, а как иначе? »

В чём заключается цель? ведь нужно отображать общий прогресс, какой смысл отображать прогресс только для отмеченных чекбоксов?

Centrinar 23-04-2010 15:24 1399272

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

Creat0R 23-04-2010 15:27 1399275

Цитата:

Цитата Centrinar
Если я не отмечу чекбокс то он всеравно его будет учитывать в прогресс баре »

Верно, он его пропустит, но ведь не нужен же частичный прогресс, а полный?

В принципе вот, можно посмотреть на результат, для меня это конечно не логично:

Код:

            For $i = 1 To $aProgs[0]
                $aCheckBox = $anCheckBoxes[$i]

                If GUICtrlRead($aCheckBox[1]) = 1 Then
                    $iChecked_Counter += 1
                    $iProgress += 100 / ($iChecked_Counter + 1)

                    GUICtrlSetData($ProgressBar1, $iProgress)

                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])

                    $sProgName = StringRegExpReplace($aProgs[$i], '^.*=', '')
                    $sProgExe = StringRegExpReplace($aProgs[$i], '=.*$', '')

                    Call("_MonitorOFF")
                    MsgBox(64, $sProgName, "sss", 3)
                Else
                    GUICtrlSetImage($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
                EndIf
            Next


Centrinar 23-04-2010 15:40 1399284

да, согласен :)

gregaz 23-04-2010 18:35 1399372

Цитата:

Цитата Centrinar
Как можно посчитать кол-во чекбоксов которые были отмеченны? »

Простой ответ на вопрос :
PHP код:

;.........................
$iii=0
GUISetState
(@SW_SHOW)

While 
1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$anCheckBoxes[1],$anCheckBoxes[2],$anCheckBoxes[3],$anCheckBoxes[4],$anCheckBoxes[5]
            
$ii=GUICtrlRead($nMsg)
            If 
$ii=4 Then $ii=-1
            $iii
+=$ii
        
Case $Button1
            MsgBox
(0,'Info','Отмечено : ' $iii 'чекбоксов')
    EndSwitch
WEnd 


Creat0R 24-04-2010 00:13 1399578

Цитата:

Цитата gregaz
Простой ответ на вопрос »

А если проверить? :) оно не будет работать, т.к $anCheckBoxes[1] является сам по себе массивом.

gregaz 24-04-2010 08:05 1399669

Цитата:

Цитата Creat0R
А если проверить? оно не будет работать, т.к $anCheckBoxes[1] является сам по себе массивом. »

Способ проверялся на твоем примере : (где $anCheckBoxes создавался встроенной ф-ей , а не самопальной).


Время: 02:55.

Время: 02:55.
© OSzone.net 2001-