Что нового

[Массивы и чекбоксы] Собрать набор чекбоксов из INI-файла и сохранить только выбранные

Fanatmb

Новичок
Сообщения
59
Репутация
0
И снова здравствуйте. Очередная задача взрывающая мой мозг.

Есть задача собрать фильтр отметив нужные галочки. Но что-то не могу понять или я в структуру 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
 
Последнее редактирование:
Верх