Показать полную графическую версию : [решено] Как узнать кол-во отмеченных чекбоксов?
Centrinar
22-04-2010, 22:59
Без вас господа никуда :) Как можно посчитать кол-во чекбоксов которые были отмеченны? СПАСИБО!
Самое малое - двумя способами: или во время того, как отмечаете эти самые чекбоксы, или уже после того как они отмечены-неотмечены пройтись по ним... Может еще кто способов добавит... но поможет ли это вам? :) Если нет, то объясните продробнее, что вы делаете и пример вашего скрипта.
Centrinar
22-04-2010, 23:48
Можно на этом продемонстрировать
#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
#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
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
н категорически не хочет выполнять дилние т.е. не может разделить 100/$k »
Ну почему, деление как раз происходит, если к примеру отметить две птички, то $iProgr будет равна 150, т.к первый раз мы делим 100 на 1 (один отмечены чекбокс) и получаем естественно 100, а второй раз мы уже делим 100 на 2 и получаем 50, отсюда и результат: 100 + 50 = 150 :)
А вообще прогресс строится не так, нужно получить шаг прогресса методом деления 100% на общее количество чекбоксов, а потом каждый раз прибавлять этот шаг в цикле:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $sProgs = 'Setup.exe=Прог1|Seup2.exe=Прог2|Seup3.exe=Прог3|Seup4.exe=Прог4|Seup5.exe=Прог5'
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) Const (http://www.autoitscript.com/autoit3/docs/keywords.htm#Const) $aProgs = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)($sProgs, '|')
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $anCheckBoxes[$aProgs[0]+1]
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $iChecked_Counter = 0 ;Счетчик для отмеченных чекбоксов
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $iProgress_Step = 100 / $aProgs[0] ;Шаг прогресса
Global (http://www.autoitscript.com/autoit3/docs/keywords.htm#Global) $iProgress = 0 ;Счётчик прогресса
$Form1 = GUICreate (http://www.autoitscript.com/autoit3/docs/functions/GUICreate.htm)("", 300, 300, -1, -1)
$iTop = 10
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aProgs[0]
$anCheckBoxes[$i] = GUICtrlCreateCheckbox (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateCheckbox.htm)(StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aProgs[$i], '^.*=', ''), 10, $iTop, 100, 15)
$iTop += 20
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
$ProgressBar1 = GUICtrlCreateProgress (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateProgress.htm)(150, 150, 150, 20)
GUICtrlSetColor (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetColor.htm)(-1, 32250)
$Button1 = GUICtrlCreateButton (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlCreateButton.htm)("Button1", 10, 110, 80, 25)
GUISetState (http://www.autoitscript.com/autoit3/docs/functions/GUISetState.htm)(@SW_SHOW (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_SHOW))
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$nMsg = GUIGetMsg (http://www.autoitscript.com/autoit3/docs/functions/GUIGetMsg.htm)()
Switch (http://www.autoitscript.com/autoit3/docs/keywords.htm#Switch) $nMsg
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $GUI_EVENT_CLOSE
Exit (http://www.autoitscript.com/autoit3/docs/keywords.htm#Exit)
Case (http://www.autoitscript.com/autoit3/docs/keywords.htm#Case) $Button1
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aProgs[0]
$iProgress += $iProgress_Step
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) GUICtrlRead (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlRead.htm)($anCheckBoxes[$i]) = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iChecked_Counter += 1
$sProgName = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aProgs[$i], '^.*=', '')
$sProgExe = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aProgs[$i], '=.*$', '')
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, $sProgName, $sProgExe)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
GUICtrlSetData (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetData.htm)($ProgressBar1, $iProgress)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(0, "Количество отмеченных чекбоксов", $iChecked_Counter)
$iChecked_Counter = 0
EndSwitch (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndSwitch)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Centrinar, а зачем тебе второй счетчик $k? используй тот, что входит в цикл - $i - вместо него
а твоя ошибка в том, что он ($k) у тебя изначально не проинициализирован. А ты хочешь к нему автоинкремент прмименить
зачем тебе второй счетчик $k? используй тот, что входит в цикл - $i - вместо него »
$i это общий счётчик, он отобразит не количество отмеченных чекбоксов, а всех перечисленных в цикле.
Centrinar
23-04-2010, 14:49
Сделал как в образце, но он прибовляет сразу 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
Сделал как в образце, но он прибовляет сразу 100 »
Потому что в цикле вместо $iProgress используется $iProgr. И ещё, а зачем тогда нужен счётчик отмеченных чекбоксов?
Centrinar
23-04-2010, 15:13
Что бы он делил не на общще кол-во чек боксов а только на отмеченные, а как иначе?
Что бы он делил не на общще кол-во чек боксов а только на отмеченные, а как иначе? »
В чём заключается цель? ведь нужно отображать общий прогресс, какой смысл отображать прогресс только для отмеченных чекбоксов?
Centrinar
23-04-2010, 15:24
Если я не отмечу чекбокс то он всеравно его будет учитывать в прогресс баре т.е. будет не точно отображать, а если учитывать только отмеченные то прогрессбар будет более точным т.к. если чекбокс не отмечен то и операция не выполняеться
Если я не отмечу чекбокс то он всеравно его будет учитывать в прогресс баре »
Верно, он его пропустит, но ведь не нужен же частичный прогресс, а полный?
В принципе вот, можно посмотреть на результат, для меня это конечно не логично:
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aProgs[0]
$aCheckBox = $anCheckBoxes[$i]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) GUICtrlRead (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlRead.htm)($aCheckBox[1]) = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iChecked_Counter += 1
$iProgress += 100 / ($iChecked_Counter + 1)
GUICtrlSetData (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetData.htm)($ProgressBar1, $iProgress)
GUICtrlSetImage (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetImage.htm)($aCheckBox[0], "shell32.dll", $aCheckedIcons[$i])
$sProgName = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aProgs[$i], '^.*=', '')
$sProgExe = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aProgs[$i], '=.*$', '')
Call (http://www.autoitscript.com/autoit3/docs/functions/Call.htm)("_MonitorOFF")
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, $sProgName, "sss", 3)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
GUICtrlSetImage (http://www.autoitscript.com/autoit3/docs/functions/GUICtrlSetImage.htm)($aCheckBox[0], "shell32.dll", $aUnCheckedIcons[$i])
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
Centrinar
23-04-2010, 15:40
да, согласен :)
Как можно посчитать кол-во чекбоксов которые были отмеченны? »
Простой ответ на вопрос :
;.........................
$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
Простой ответ на вопрос »
А если проверить? :) оно не будет работать, т.к $anCheckBoxes[1] является сам по себе массивом.
А если проверить? оно не будет работать, т.к $anCheckBoxes[1] является сам по себе массивом. »
Способ проверялся на твоем примере : (где $anCheckBoxes создавался встроенной ф-ей , а не самопальной).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.