Что нового

[Массивы и чекбоксы] Собрать набор чекбоксов из 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
 
Последнее редактирование:

avs1972

Новичок
Сообщения
1
Репутация
0
Маленькая косметика:
Код:
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#Include <Array.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

AutoItSetOption("GUIOnEventMode", 1) ; Enable/disable OnEvent functions notifications. 0 = (default) disable. 1 = enable.
AutoItSetOption("SendCapslockMode", 0) ; 0 = don't store/restore, 1 = store and restore (default)
AutoItSetOption("MustDeclareVars", 1) ; 1 = Variables must be pre-declared, 0 = Variables don't need to be pre-declared (default)
AutoItSetOption("TrayAutoPause", 0) ; 0 = no pause 1 = (default) pause. If there is no DefaultMenu no pause will occurs.
AutoItSetOption("TrayIconDebug", 1) ; 0 = no debug information (default), 1 = show debug
AutoItSetOption("TrayIconHide", 1) ; 0 = show icon (default), 1 = hide icon

#pragma compile(UPX, True)
#pragma compile(Console, True)
#pragma compile(x64, False)
; #pragma compile(Out, dd.exe)
; #pragma compile(Icon, "Z:\.NSIS\.icons\MSWINNT.ICO")

Dim $id[1]
Global $nUnions = 3 ; Число блоков в строке
Global $CheckLeft = 20 ; Левая граница блока
Global $CheckWidth = 200 ; Ширина блока
Global $row = 40 ; Начальная точка
Global $Next_row = 20 ; Расстояние между строками
Local $a, $f

    Global $ini = @ScriptDir & "\rules.ini"
    If FileOpen($ini, 0) = -1 Then FileWrite($ini,"")

_Main()
Exit



Func _Main ()
    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","")
    Local $filretArr = StringSplit($filterINI,",",2)
    ; ConsoleWrite(UBound($filretArr) & @CRLF)
    ; _ArrayDisplay($filretArr)

    Global $kolINI = UBound($aINI)
    ; _ArrayDisplay($aINI)
    Local $iStrings = Floor(($kolINI-1+$nUnions-1)/$nUnions)
    ; MsgBox(0, "", $kolINI-1 & "/" & $nUnions & "  " & $iStrings, 5)

    GUICreate("Сделайте выбор",2*$CheckLeft+$nUnions*$CheckWidth,90+$Next_row*$iStrings)
    GUISetState(@SW_SHOW)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

    Global $checkIn = GUICtrlCreateCheckbox("Выборочно", $CheckLeft, 10)
    Global $saveCheck = GUICtrlCreateButton("Сохранить", $nUnions*$CheckWidth-100, 55+$Next_row*$iStrings, 100, 25)
    GUICtrlSetState(-1, $GUI_UNCHECKED)
    GUICtrlSetOnEvent($checkIn, "CheckIn")
    GUICtrlSetOnEvent($saveCheck, "saveCheck")

    GUICtrlCreateGroup("",10,10+$Next_row,$nUnions*$CheckWidth,20+$Next_row*$iStrings)
    $f = 0
    ReDim $id[$kolINI]
    Dim $id_id[$i]
    Dim $fArr[$f]
    ; ConsoleWrite($fArr)
    Global $array[$i][2]
    $a = 1
    For $i = 1 To $kolINI
        For $j = 0 To $nUnions-1
            If $i<$kolINI Then
                $id[$i] = GUICtrlCreateCheckbox($aINI[$i][1], $CheckLeft+$j*$CheckWidth, $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
            EndIf
            $a += 1
            $i += 1
        Next
        $row = $row + $Next_row ; Переход на другую строку в главном окне
        $i -= 0.99999
    Next

    While 1
        Sleep(1000)  ; Цикл ожидания
    WEnd
EndFunc



Func CheckIn()
    ; Dim $id[$kolINI]
    Local $chs = GUICtrlRead($CheckIn)

    Switch $chs
        Case $GUI_CHECKED
            ; ConsoleWrite("set" & @CRLF)
            GUICtrlSetData($CheckIn, "Все цвета")
            For $i = 1 To $kolINI-1
                GUICtrlSetState($id[$i], $GUI_CHECKED)
            Next
        Case $GUI_UNCHECKED
            ; ConsoleWrite("clean" & @CRLF)
            GUICtrlSetData($CheckIn, "Выборочно")
            For $i = 1 To $kolINI-1
                GUICtrlSetState($id[$i], $GUI_UNCHECKED)
            Next
    EndSwitch
EndFunc



Func saveCheck()
    Local $savearray

    For $i = 1 To UBound($array)-1
        Local $p = ","
        if GUICtrlRead($array[$i][0]) = $GUI_CHECKED Then $savearray = $savearray & $array[$i][1] & $p
    Next

    ConsoleWrite(StringTrimRight($savearray,1) & @CRLF)

    IniWrite($ini,"Filter","filter",StringTrimRight($savearray,1))
EndFunc



Func CLOSEClicked()
    Exit
EndFunc
 

Вложения

  • _ini1.au3
    4.2 КБ · Просмотры: 0
  • rules.ini.zip
    332 байт · Просмотры: 0
Верх