И снова здравствуйте. Очередная задача взрывающая мой мозг.
Есть задача собрать фильтр отметив нужные галочки. Но что-то не могу понять или я в структуру INI не правильно собрал, или что-то не учел. Ткните носом плиз, как правильнее.
Есть INI, в котором список цветов со своим ID и filter, значение которого является сохраненным набором цветов при предыдущем запуске. т.е. если изменить цвета, то filter должен изменить значение.
И есть скрипт
Прочитать и вывести весь список в окне это получилось, заставить верхнюю галочку менять название тоже. А вот активировать одной галочкой всё и передать выбранные поля при закрытии с сохранением в формате так не вышло. Выходит, что цифры у каждого цвета статичны. их больше 100. НО вот так и не понял как получить цифры каждого чекбокса при закрытии/сохранении. кнопку не делал, хотя бы по выходу реализовать.
Заранее спасибо!!!
P.S. разбил на 5 столбцов, т.к. удобнее отобрать большое количество., и что странно. скрипт запускается только когда количество ID кратно 5. в остальных случаях выдает ошибку. ругается на несоответствие массива, я так и не понял почему. просто сделал кратное количество.
Вроде получилось, гляньте глазом, что можно еще упростит/ускорить в этом процессе. Кроме вывода через цикл столбцов. Вопрос можно считать закрытым.
Есть задача собрать фильтр отметив нужные галочки. Но что-то не могу понять или я в структуру INI не правильно собрал, или что-то не учел. Ткните носом плиз, как правильнее.
Есть INI, в котором список цветов со своим ID и filter, значение которого является сохраненным набором цветов при предыдущем запуске. т.е. если изменить цвета, то filter должен изменить значение.
[ID]
56983=Красный
34567470=Синий
433=Желтый
467=Розовый
64809=Малиновый
45644=Фиолетовый
211622=Белый
4566=Лавандовый
456210=Салатовый
4637=Берюзовый
[Filter]
filter=64809,456210,433
И есть скрипт
Прочитать и вывести весь список в окне это получилось, заставить верхнюю галочку менять название тоже. А вот активировать одной галочкой всё и передать выбранные поля при закрытии с сохранением в формате так не вышло. Выходит, что цифры у каждого цвета статичны. их больше 100. НО вот так и не понял как получить цифры каждого чекбокса при закрытии/сохранении. кнопку не делал, хотя бы по выходу реализовать.
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#Include <Array.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
_Main()
Exit
Func _Main ()
GUICreate("Сделайте выбор",1000,100)
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$ini = @ScriptDir & "\rules.ini"
If FileOpen($ini, 0) = -1 Then FileWrite($ini,"")
Global $aINI = IniReadSection($ini, "ID")
If Not @error Then
For $i = 1 To $aINI[0][0]
Assign ($aINI[$i][0], $aINI[$i][1],2)
Next
EndIf
Global $CheckIn = GUICtrlCreateCheckbox("Выборочно", 20, 10)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($CheckIn, "CheckIn")
$row = 40 ; Начальная точка
$next_row = 20 ; Расстояние между строками
Global $kolINI = UBound($aINI)
_ArrayDisplay($aINI)
GUICtrlCreateGroup("",10,30,970,60)
Dim $id[$kolINI]
For $i = 1 To $kolINI
$aINI[$i][0] = GUICtrlCreateCheckbox($aINI[$i][1], 20, $row)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($aINI[$i][0], "CheckColor")
$i += 1
$aINI[$i][0] = GUICtrlCreateCheckbox($aINI[$i][1], 200, $row)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($aINI[$i][0], "CheckColor")
$i += 1
$aINI[$i][0] = GUICtrlCreateCheckbox($aINI[$i][1], 400, $row)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($aINI[$i][0], "CheckColor")
$i += 1
$aINI[$i][0] = GUICtrlCreateCheckbox($aINI[$i][1], 620, $row)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($aINI[$i][0], "CheckColor")
$i += 1
$aINI[$i][0] = GUICtrlCreateCheckbox($aINI[$i][1], 800, $row)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($aINI[$i][0], "CheckColor")
$row = $row + $next_row ; Переход на другую строку в главном окне
$i = $i + 0.00001
Next
While 1
Sleep(1000) ; Цикл ожидания
WEnd
EndFunc
Func CheckIn ()
$chs = GUICtrlRead($CheckIn)
Switch $chs
Case $GUI_CHECKED
ConsoleWrite("поставил" & @CRLF)
GUICtrlSetData($CheckIn, "Все цвета")
Dim $id[$kolINI]
For $i = 1 To $kolINI
;~ GUICtrlSetState($id[$i], $GUI_CHECKED)
Next
Case $GUI_UNCHECKED
ConsoleWrite("снял" & @CRLF)
GUICtrlSetData($CheckIn, "Выборочно")
For $i = 1 To $kolINI
;~ GUICtrlSetState($id[$i], $GUI_UNCHECKED)
Next
EndSwitch
EndFunc
Func CheckColor ()
ConsoleWrite(@GUI_CtrlId)
EndFunc
Func CLOSEClicked()
Exit
EndFunc
Заранее спасибо!!!
P.S. разбил на 5 столбцов, т.к. удобнее отобрать большое количество., и что странно. скрипт запускается только когда количество ID кратно 5. в остальных случаях выдает ошибку. ругается на несоответствие массива, я так и не понял почему. просто сделал кратное количество.
Сообщение автоматически объединено:
Вроде получилось, гляньте глазом, что можно еще упростит/ускорить в этом процессе. Кроме вывода через цикл столбцов. Вопрос можно считать закрытым.
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#Include <Array.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
_Main()
Exit
Func _Main ()
GUICreate("Сделайте выбор",1000,130)
GUISetState(@SW_SHOW)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
Global $ini = @ScriptDir & "\rules.ini"
If FileOpen($ini, 0) = -1 Then FileWrite($ini,"")
Local $aINI = IniReadSection($ini, "ID")
If Not @error Then
For $i = 1 To $aINI[0][0]
Assign ($aINI[$i][0], $aINI[$i][1],2)
Next
EndIf
Local $filterINI = IniRead($ini,"Filter","filter","")
$filretArr = StringSplit($filterINI,",",2)
;~ ConsoleWrite(UBound($filretArr))
_ArrayDisplay($filretArr)
Global $checkIn = GUICtrlCreateCheckbox("Выборочно", 20, 10)
Global $saveCheck = GUICtrlCreateButton("Сохранить", 875, 95, 100, 25)
GUICtrlSetState(-1, $GUI_UNCHECKED)
GUICtrlSetOnEvent($checkIn, "CheckIn")
GUICtrlSetOnEvent($saveCheck, "saveCheck")
$row = 40 ; Начальная точка
$next_row = 20 ; Расстояние между строками
Global $kolINI = UBound($aINI)
;~ _ArrayDisplay($aINI)
GUICtrlCreateGroup("",10,30,970,60)
$f = 0
Dim $id[$kolINI]
Dim $id_id[$i]
Dim $fArr[$f]
;~ ConsoleWrite($fArr)
Global $array[$i][2]
$a = 1
For $i = 1 To $kolINI
$id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], 20, $row)
$id_id[$id] = $aINI[$i][0]
$array[$a][0] = $id[$i]
$array[$a][1] = $id_id[$id]
For $f = 0 To UBound($filretArr) - 1
If $aINI[$i][0] = $filretArr[$f] Then GUICtrlSetState(-1, $GUI_CHECKED)
next
$a += 1
$i += 1
$id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], 200, $row)
$id_id[$id] = $aINI[$i][0]
$array[$a][0] = $id[$i]
$array[$a][1] = $id_id[$id]
For $f = 0 To UBound($filretArr) - 1
If $aINI[$i][0] = $filretArr[$f] Then GUICtrlSetState(-1, $GUI_CHECKED)
next
$a += 1
$i += 1
$id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], 400, $row)
$id_id[$id] = $aINI[$i][0]
$array[$a][0] = $id[$i]
$array[$a][1] = $id_id[$id]
For $f = 0 To UBound($filretArr) - 1
If $aINI[$i][0] = $filretArr[$f] Then GUICtrlSetState(-1, $GUI_CHECKED)
next
$a += 1
$i += 1
$id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], 620, $row)
$id_id[$id] = $aINI[$i][0]
$array[$a][0] = $id[$i]
$array[$a][1] = $id_id[$id]
For $f = 0 To UBound($filretArr) - 1
If $aINI[$i][0] = $filretArr[$f] Then GUICtrlSetState(-1, $GUI_CHECKED)
next
$a += 1
$i += 1
$id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], 800, $row)
$id_id[$id] = $aINI[$i][0]
$array[$a][0] = $id[$i]
$array[$a][1] = $id_id[$id]
For $f = 0 To UBound($filretArr) - 1
If $aINI[$i][0] = $filretArr[$f] Then GUICtrlSetState(-1, $GUI_CHECKED)
next
$a += 1
$row = $row + $next_row ; Переход на другую строку в главном окне
$i += 0.00001
Next
While 1
Sleep(1000) ; Цикл ожидания
WEnd
EndFunc
Func CheckIn ()
$chs = GUICtrlRead($CheckIn)
Switch $chs
Case $GUI_CHECKED
ConsoleWrite("поставил" & @CRLF)
GUICtrlSetData($CheckIn, "Все цвета")
Dim $id[$kolINI]
For $i = 1 To $kolINI
;~ GUICtrlSetState($id[$i], $GUI_CHECKED)
Next
Case $GUI_UNCHECKED
ConsoleWrite("снял" & @CRLF)
GUICtrlSetData($CheckIn, "Выборочно")
For $i = 1 To $kolINI
;~ GUICtrlSetState($id[$i], $GUI_UNCHECKED)
Next
EndSwitch
EndFunc
Func saveCheck ()
local $savearray
For $i = 1 To UBound($array)-1
$p = ","
if GUICtrlRead($array[$i][0]) = $GUI_CHECKED Then $savearray = $savearray & $array[$i][1] & $p
Next
ConsoleWrite(StringTrimRight($savearray,1))
IniWrite($ini,"Filter","filter",StringTrimRight($savearray,1))
EndFunc
Func CLOSEClicked()
Exit
EndFunc
Последнее редактирование: