Что нового

[Элементы GUI] Создание элементов на основе записей в ini файле

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Вот моя на полу рабочая программа
Код:
#include <GUIConstants.au3>

$hGUI = GUICreate("", 410, 450, 278, 149)
CreateCheakBoxOrIniFile('files.ini')
$Apply = GUICtrlCreateButton("&Применить", 6, 416, 75, 25, 0)
$Exit = GUICtrlCreateButton("&Выход", 230, 416, 75, 25, 0)
$About = GUICtrlCreateButton("&О программе", 312, 416, 91, 25, 0)
$Reset = GUICtrlCreateButton("&Перезапустить Explorer", 88, 416, 134, 25, 0)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $Exit
            Exit
        Case $Apply
            CheakMark('files.ini')
    EndSwitch
WEnd

Func CreateCheakBoxOrIniFile($IniFileName)
    Local $IniSections = IniReadSectionNames($IniFileName)
    If @error Then 
        MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
    Else
        Local $iTop = 20
        For $i = 1 To $IniSections[0]
            $NameButton = IniRead($IniFileName, $IniSections[$i],"Name","Ошибка!!!")
            Assign($IniSections[$i], GUICtrlCreateCheckbox($NameButton, 20, $iTop), 2)
            $iTop += 25
        Next
    EndIf
EndFunc
Func CheakMark($IniFileName)
    Local $IniSections = IniReadSectionNames($IniFileName)
    If @error Then 
        MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
    Else
        For $i = 1 To $IniSections[0]
            Local $KeyName = IniRead($IniFileName, $IniSections[$i], "KeyName", "Ошибка!!!")
            Local $ValueName = IniRead($IniFileName, $IniSections[$i], "ValueName", "Ошибка!!!")
            Local $Type = IniRead($IniFileName, $IniSections[$i], "Type", "Ошибка!!!")
            Local $Value = IniRead($IniFileName, $IniSections[$i], "Value", "Ошибка!!!")
            Local $StandartValue = IniRead($IniFileName, $IniSections[$i], "StandartValue", "Ошибка!!!")
            If GUICtrlRead($ShowFiles) = 1 Then
                RegWrite($KeyName, $ValueName, $Type, $Value)
            Else
                RegWrite($KeyName, $ValueName, $Type, $StandartValue)
            EndIf
        Next
    EndIf
EndFunc



Вот ini файл откуда настройки считываются
Код:
[ShowFiles]
Name="Показывать скрытые файлы"
KeyName="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
ValueName="hidden"
Type="REG_DWORD"
Value="00000001"
StandartValue="00000002"
[ShowSysFiles]
Name="Показывать скрытые системные файлы"
KeyName="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
ValueName="ShowSuperHidden"
Type="REG_DWORD"
Value="00000001"
StandartValue="00000000"
[ShowExt]
Name="Показывать расширения"
KeyName="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
ValueName="HideFileExt"
Type="REG_DWORD"
Value="00000000"
StandartValue="00000001"

Данная программа должна прочитать ini файл и создать кучу checkbox'ов. И потом, когда пользователь нажмет Применить, внести изменения в реестр в зависимости от того какие checkbox'ы отмечены.

Вопрос 1
Можно ли это всё как-то упростить?
Вопрос 2
Программа не правильно работает, работает только первый checkbox, зато работает как все сразу. В чём ошибка и как исправить?
 

beve

Осваивающий
Сообщения
104
Репутация
31
Re: [Элементы GUI] Проблемы с обработкой ini файла

Код:
#include <GUIConstants.au3>

$hGUI = GUICreate("", 410, 450, 278, 149)
CreateCheakBoxOrIniFile('files.ini')
$Apply = GUICtrlCreateButton("&Применить", 6, 416, 75, 25, 0)
$Exit = GUICtrlCreateButton("&Выход", 230, 416, 75, 25, 0)
$About = GUICtrlCreateButton("&О программе", 312, 416, 91, 25, 0)
$Reset = GUICtrlCreateButton("&Перезапустить Explorer", 88, 416, 134, 25, 0)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Exit
Exit
Case $Apply
CheakMark('files.ini')
EndSwitch
WEnd

Func CreateCheakBoxOrIniFile($IniFileName)
Global $IniSections = IniReadSectionNames($IniFileName)
If @error Then 
MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
Return
EndIf

Local $iTop = 20
For $i = 1 To $IniSections[0]
$NameButton = IniRead($IniFileName, $IniSections[$i],"Name","Ошибка!!!")
Assign("var",GUICtrlCreateCheckbox($NameButton, 20, $iTop))
$IniSections[$i]=$var
$iTop += 25
Next
EndFunc

Func CheakMark($IniFileName)
Local $aIniSections = IniReadSectionNames($IniFileName)
If @error Then 
MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
Return
EndIf

Local $KeyName[$aIniSections[0]+1]
Local $ValueName[$aIniSections[0]+1]
Local $Type[$aIniSections[0]+1]
Local $Value[$aIniSections[0]+1]
Local $StandartValue[$aIniSections[0]+1]

For $i = 1 To $aIniSections[0]
$KeyName[$i] = IniRead($IniFileName, $aIniSections[$i], "KeyName", "Ошибка!!!")
$ValueName[$i] = IniRead($IniFileName, $aIniSections[$i], "ValueName", "Ошибка!!!")
$Type[$i] = IniRead($IniFileName, $aIniSections[$i], "Type", "Ошибка!!!")
$Value[$i] = IniRead($IniFileName, $aIniSections[$i], "Value", "Ошибка!!!")
$StandartValue[$i] = IniRead($IniFileName, $aIniSections[$i], "StandartValue", "Ошибка!!!")
Next

For $i=1 To $IniSections[0]
If GUICtrlRead($IniSections[$i]) = 1 Then
MsgBox(0,$aIniSections[$i],$KeyName[$i]&@CRLf&@CRLf&$ValueName[$i]&@CRLf&@CRLf& $Type[$i]&@CRLf&@CRLf&$Value[$i])
;RegWrite($KeyName[$i], $ValueName[$i], $Type[$i], $Value[$i])
Else
MsgBox(0,$aIniSections[$i],"не отмечен")
;RegWrite($KeyName[$i], $ValueName[$i], $Type[$i], $StandartValue[$i])
EndIf
Next
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Проблемы с обработкой ini файла

Вариант №1:

Код:
#include <GUIConstants.au3>

Global $aCheckBoxes[1]

$hGUI = GUICreate("", 410, 450, 278, 149)
CreateCheckBoxOrIniFile('files.ini')
$Apply = GUICtrlCreateButton("&Применить", 6, 416, 75, 25, 0)
$Exit = GUICtrlCreateButton("&Выход", 230, 416, 75, 25, 0)
$About = GUICtrlCreateButton("&О программе", 312, 416, 91, 25, 0)
$Reset = GUICtrlCreateButton("&Перезапустить Explorer", 88, 416, 134, 25, 0)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Exit
			Exit
		Case $Apply
			CheckMark('files.ini')
	EndSwitch
WEnd

Func CheckMark($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	Local $KeyName, $ValueName, $Type, $Value, $StandartValue
	
	For $i = 1 To $IniSections[0]
		$KeyName = IniRead($IniFileName, $IniSections[$i], "KeyName", "Ошибка!!!")
		$ValueName = IniRead($IniFileName, $IniSections[$i], "ValueName", "Ошибка!!!")
		$Type = IniRead($IniFileName, $IniSections[$i], "Type", "Ошибка!!!")
		$Value = IniRead($IniFileName, $IniSections[$i], "Value", "Ошибка!!!")
		$StandartValue = IniRead($IniFileName, $IniSections[$i], "StandartValue", "Ошибка!!!")
		
		If $i <= $aCheckBoxes[0] And GUICtrlRead($aCheckBoxes[$i]) = 1 Then
			RegWrite($KeyName, $ValueName, $Type, $Value)
		Else
			RegWrite($KeyName, $ValueName, $Type, $StandartValue)
		EndIf
	Next
EndFunc

Func CreateCheckBoxOrIniFile($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	Local $iTop = 20
	ReDim $aCheckBoxes[$IniSections[0] + 1]
	
	For $i = 1 To $IniSections[0]
		$NameButton = IniRead($IniFileName, $IniSections[$i], "Name", "Ошибка!!!")
		
		$aCheckBoxes[0] += 1
		$aCheckBoxes[$aCheckBoxes[0]] = GUICtrlCreateCheckbox($NameButton, 20, $iTop)
		$iTop += 25
	Next
EndFunc


Вариант №2 (с Assign):

Код:
#include <GUIConstants.au3>

$hGUI = GUICreate("", 410, 450, 278, 149)
CreateCheckBoxOrIniFile('files.ini')
$Apply = GUICtrlCreateButton("&Применить", 6, 416, 75, 25, 0)
$Exit = GUICtrlCreateButton("&Выход", 230, 416, 75, 25, 0)
$About = GUICtrlCreateButton("&О программе", 312, 416, 91, 25, 0)
$Reset = GUICtrlCreateButton("&Перезапустить Explorer", 88, 416, 134, 25, 0)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Exit
			Exit
		Case $Apply
			CheckMark('files.ini')
	EndSwitch
WEnd

Func CheckMark($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	Local $KeyName, $ValueName, $Type, $Value, $StandartValue
	
	For $i = 1 To $IniSections[0]
		$KeyName = IniRead($IniFileName, $IniSections[$i], "KeyName", "Ошибка!!!")
		$ValueName = IniRead($IniFileName, $IniSections[$i], "ValueName", "Ошибка!!!")
		$Type = IniRead($IniFileName, $IniSections[$i], "Type", "Ошибка!!!")
		$Value = IniRead($IniFileName, $IniSections[$i], "Value", "Ошибка!!!")
		$StandartValue = IniRead($IniFileName, $IniSections[$i], "StandartValue", "Ошибка!!!")
		
		If GUICtrlRead(Eval($IniSections[$i])) = 1 Then
			RegWrite($KeyName, $ValueName, $Type, $Value)
		Else
			RegWrite($KeyName, $ValueName, $Type, $StandartValue)
		EndIf
	Next
EndFunc

Func CreateCheckBoxOrIniFile($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	Local $iTop = 20
	
	For $i = 1 To $IniSections[0]
		$NameButton = IniRead($IniFileName, $IniSections[$i], "Name", "Ошибка!!!")
		
		Assign($IniSections[$i], GUICtrlCreateCheckbox($NameButton, 20, $iTop), 2)
		$iTop += 25
	Next
EndFunc



Добавлено:
Сообщение автоматически объединено:

beve [?]
Код:
If GUICtrlRead($IniSections[$i]) = 1 Then
Тут $IniSections[$i] содержит имя секции, а не ID-элемента ;)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Проблемы с обработкой ini файла

beve [?]
Сорри, не заметил что там используется другой массив. Хотя это не совсем и правильно, ведь ini-файл может измениться за это время... да и вообще вся затея неверная (это к автору затеи :smile: ), элементы нужно проверять те что имеются, а не те что могут или не могут существовать.
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Re: [Элементы GUI] Проблемы с обработкой ini файла

Так что, лучше создать постоянные элементы и обойтись без ini файла?
Хотелось бы иметь возможность изменять/добавлять/удалять элементы без повторной компиляции :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Проблемы с обработкой ini файла

Anton [?]
лучше создать постоянные элементы и обойтись без ini файла?
Ну почему, можно с ini-файлом, просто будет больше работы, и... больше риска :smile:
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Re: [Элементы GUI] Проблемы с обработкой ini файла

Ну что больше работы не страшно, а вот что больше риска.... :-\

Непойму почему функция ошибку вызывает :blink:
Код:
Func ReadIniFile($IniFileName)
	Local $IniSections = IniReadSectionNames($IniFileName)
	If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
	
	Global $ContentIniFile[$IniSections[0]][7]
	For $i = 1 To $IniSections[0]
		$ContentIniFile[$i][0] = $IniSections[$i]
		$ContentIniFile[$i][1] = IniRead($IniFileName, $IniSections[$i], "Name", "Ошибка!!!")
		$ContentIniFile[$i][2] = IniRead($IniFileName, $IniSections[$i], "KeyName", "Ошибка!!!")
		$ContentIniFile[$i][3] = IniRead($IniFileName, $IniSections[$i], "ValueName", "Ошибка!!!")
		$ContentIniFile[$i][4] = IniRead($IniFileName, $IniSections[$i], "Type", "Ошибка!!!")
		$ContentIniFile[$i][5] = IniRead($IniFileName, $IniSections[$i], "Value", "Ошибка!!!")
		$ContentIniFile[$i][6] = IniRead($IniFileName, $IniSections[$i], "StandartValue", "Ошибка!!!")
	Next
EndFunc
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Re: [Элементы GUI] Проблемы с обработкой ini файла

Спасибо, помогло. :smile:
beve, а разясните как понимать данную строку
Global $ContentIniFile[$IniSections[0]+1][7]
зачем +1 нужен?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Проблемы с обработкой ini файла

Anton [?]
Массив начинается с 0-ого ( [0] ), а в цикле начало с первого, поэтому дойдя до 6-ого обращения к массиву достигается последний элемент (7-й в двумерном массиве, т.к от 0-я до 6-ти это 7 :smile: ), что и вызывает ошибку. +1 даёт ещё один элемент. Правильнее конечно будет отминусовывать от $i 1-цу:

Код:
$ContentIniFile[$i-1][0]
$ContentIniFile[$i-1][1]
;и т.д.



Добавлено:
Сообщение автоматически объединено:

P.S
И кстати я уже писал, что не очень верно объявлять глобальные переменные внутри функций.
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
Re: [Элементы GUI] Проблемы с обработкой ini файла

Понятно. :smile:
И кстати я уже писал, что не очень верно объявлять глобальные переменные внутри функций.
А разве есть возможность объявить их вне функции???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Проблемы с обработкой ini файла

Anton [?]
А разве есть возможность объявить их вне функции?
:smile:

Код:
Global $ContentIniFile[1][1]

Func ReadIniFile($IniFileName)
    Local $IniSections = IniReadSectionNames($IniFileName)
    If @error Then Return MsgBox(4096, "Ошибка!!!", "Не найден файл конфигураций.")
    
    ReDim $ContentIniFile[$IniSections[0]][7]

    For $i = 1 To $IniSections[0]
        $ContentIniFile[$i-1][0] = $IniSections[$i]
        $ContentIniFile[$i-1][1] = IniRead($IniFileName, $IniSections[$i], "Name", "Ошибка!!!")
        $ContentIniFile[$i-1][2] = IniRead($IniFileName, $IniSections[$i], "KeyName", "Ошибка!!!")
        $ContentIniFile[$i-1][3] = IniRead($IniFileName, $IniSections[$i], "ValueName", "Ошибка!!!")
        $ContentIniFile[$i-1][4] = IniRead($IniFileName, $IniSections[$i], "Type", "Ошибка!!!")
        $ContentIniFile[$i-1][5] = IniRead($IniFileName, $IniSections[$i], "Value", "Ошибка!!!")
        $ContentIniFile[$i-1][6] = IniRead($IniFileName, $IniSections[$i], "StandartValue", "Ошибка!!!")
    Next
EndFunc
 
Автор
A

Anton

Твори! Пусть завистники твои захлебываются пылью!
Сообщения
69
Репутация
3
И как я не додумался!!! :laugh:
Спасибо, CreatoR
 
Верх