Что нового

[Элементы GUI] Удобное отключение разных групп GUI елементов.

Heler

Знающий
Сообщения
70
Репутация
11
Добрый день! Программирую приложение в котором много кнопок и полей ввода. На разных стадиях программы мне нужно отключать разные групы этих елементов. Придумал использовать битовую маску:
Код:
#include <GUIConstantsEx.au3>

Dim $bits[9] = [1,2,4,8,16,32,64,128,256]

GUICreate(":)", 165, 165, 250, 250, -1)

$L1   = GUICtrlCreateButton("1", 20, 20, 40, 40)
$L2   = GUICtrlCreateButton("2", 60, 20, 40, 40)
$L4   = GUICtrlCreateButton("4", 100, 20, 40, 40)
$L8   = GUICtrlCreateButton("8", 20, 60, 40, 40)
$L16  = GUICtrlCreateButton("16", 60, 60, 40, 40)
$L32  = GUICtrlCreateButton("32", 100, 60, 40, 40)
$L64  = GUICtrlCreateButton("64", 20, 100, 40, 40)
$L128 = GUICtrlCreateButton("128", 60, 100, 40, 40)
$L256 = GUICtrlCreateButton("256", 100, 100, 40, 40)
GUISetState()

$Answer = InputBox("Disable", "Введите суму чисел, нарисованых на кнопках, что бы выключить их.", "", "", -1, -1, 430, 250)
Disable($Answer)

Func Disable($var)
For $i = 0 To 8
	If BitAND($var,$bits[$i]) > 0 Then
		GUICtrlSetState(Eval('L'&$bits[$i]), $GUI_DISABLE)
	Endif
Next
EndFunc

While GUIGetMsg() <> -3
WEnd


Но тогда я жестко привязан к не удобным названиям этих елементов.($L1,$L8,$L128...)
Помогите с написанием функционала, что бы я мог также удобно отключать групы елементов, но с "удобными" названиями переменных.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Код:
#include <GUIConstantsEx.au3>

Dim $bits[9] = [1, 2, 4, 8, 16, 32, 64, 128, 256]

GUICreate(":)", 165, 165, 250, 250, -1)

$iStart_Group1 = GUICtrlCreateDummy()
GUICtrlCreateButton("1", 20, 20, 40, 40)
GUICtrlCreateButton("2", 60, 20, 40, 40)
GUICtrlCreateButton("4", 100, 20, 40, 40)
GUICtrlCreateButton("8", 20, 60, 40, 40)
GUICtrlCreateButton("16", 60, 60, 40, 40)
GUICtrlCreateButton("32", 100, 60, 40, 40)
GUICtrlCreateButton("64", 20, 100, 40, 40)
GUICtrlCreateButton("128", 60, 100, 40, 40)
GUICtrlCreateButton("256", 100, 100, 40, 40)
$iEnd_Group1 = GUICtrlCreateDummy()

GUISetState()

$Answer = InputBox("Disable", "Введите суму чисел, нарисованых на кнопках, что бы выключить их.", "", "", -1, -1, 430, 250)
Disable($Answer)

While GUIGetMsg() <> -3
WEnd

Func Disable($iVar)
	$iVar = Execute($iVar) ;Если юзер ввёл 1 + 2 + 4 и т.д.
	
	For $i = $iStart_Group1 + 1 To $iEnd_Group1 - 1
		If BitAND($iVar, GUICtrlRead($i)) Then
			GUICtrlSetState($i, $GUI_DISABLE)
		EndIf
	Next
EndFunc
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
CreatoR, спасибо большое. Гениально.

------------------------------------------------

Этот вариант не совсем подойдет, потому что данные в элементах будут не цифровые(Set,Start,Stop,Connect). Если еще есть идеи, то буду рад :smile:
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
#include <GUIConstantsEx.au3>

Dim $ahButton[11]
Dim $nBit = 1

GUICreate(":)", 400, 400, 400, 400)

For $nCount = 0 To UBound($ahButton, 1) - 1
	$ahButton[$nCount] = GUICtrlCreateButton($nBit, ($nCount + 1) * 30, 30, 30, 30)
	$nBit = BitShift($nBit, -1)
Next
GUISetState(@SW_SHOW)

$Answer = InputBox("Disable", "Введите суму чисел, нарисованых на кнопках, что бы выключить их.", "", "", -1, -1, 430, 250)
Disable($Answer)

Func Disable($var)
	Local $nBit = 1
	For $nCount = 0 To UBound($ahButton, 1) - 1
		If BitAND($var, $nBit) <> 0 Then
			GUICtrlSetState($ahButton[$nCount], $GUI_DISABLE)
		Endif
		$nBit = BitShift($nBit, -1)
	Next
EndFunc

While GUIGetMsg() <> -3
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Heler [?]
данные в элементах будут не цифровые
Тогда зачем битность? юзер будет вводить числа на угад? :smile:

Можно ещё так:

Код:
...

Func Disable($iVar)
    Local $iBit = 1
    
    $iVar = Execute($iVar) ;Если юзер ввёл 1 + 2 + 4 и т.д.
    
    For $i = $iStart_Group1 + 1 To $iEnd_Group1 - 1
        If BitAND($iVar, $iBit) = $iBit Then
            GUICtrlSetState($i, $GUI_DISABLE)
        EndIf
		
        $iBit *= 2
    Next
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
Тогда зачем битность? юзер будет вводить числа на угад?
Heler [?]
На разных стадиях программы мне нужно отключать разные групы этих елементов.
Я так понял, что есть у него, к примеру 5 кнопок (1, 2, 3, 4, 5 :smile:)
На первом этапе программы должны быть доступны все кнопки.
При нажатии на кнопку 1 - кнопки 2 и 3 блокируются, а 4 разблокируется.
При нажатии на кнопку 2 - что-блокируется, что-то разблокируется.
И т.д.
Мне показалось, что автору темы нужно что-то типо этого.

Хотя да, зачем реализовывать это так, непонятно.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
На быструю руку набросал тот функционал о котором идет речь. Код в таком виде выглядит очень не оптимизированным. Помогите пожалуйста привести его к нормальному виду, без потери функционала. Или дайте дельный совет.
Код:
#include <GUIConstantsEx.au3>

Global $nState = 0 , $ActiveRadio = 1
GUICreate(":)", 260, 173, 400, 400)

$hRadio_A  = GUICtrlCreateRadio("", 15, 30, 12, 12)
$hInput_A  = GUICtrlCreateInput("", 40, 27, 90, 20)
$hButton_A = GUICtrlCreateButton("Set", 150, 25, 92, 23)

$hRadio_B  = GUICtrlCreateRadio("", 15, 80, 12, 12)
$hInput_B  = GUICtrlCreateInput("", 40, 77, 90, 20)
$hButton_B = GUICtrlCreateButton("Set", 150, 75, 92, 23)

$hRadio_C  = GUICtrlCreateRadio("", 15, 130, 12, 12)
$hInput_C  = GUICtrlCreateInput("", 40, 127, 90, 20)
$hButton_C = GUICtrlCreateButton("Set", 150, 125, 92, 23)

GUICtrlSetState($hRadio_A , $GUI_CHECKED)
SwitchLine(2, $GUI_DISABLE)
SwitchLine(3, $GUI_DISABLE)

GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $hButton_A
			Switcher($hButton_A, $hInput_A)
		Case $hButton_B
			Switcher($hButton_B, $hInput_B)
		Case $hButton_C
			Switcher($hButton_C, $hInput_C)
		Case $hRadio_A
			If $ActiveRadio <> 1 Then
				SwitchLine(1, $GUI_ENABLE)
				SwitchLine(2, $GUI_DISABLE)
				SwitchLine(3, $GUI_DISABLE)
				$ActiveRadio = 1
			Endif
		Case $hRadio_B
			If $ActiveRadio <> 2 Then
				SwitchLine(1, $GUI_DISABLE)
				SwitchLine(2, $GUI_ENABLE)
				SwitchLine(3, $GUI_DISABLE)
				$ActiveRadio = 2
			Endif
		Case $hRadio_C
			If $ActiveRadio <> 3 Then
				SwitchLine(1, $GUI_DISABLE)
				SwitchLine(2, $GUI_DISABLE)
				SwitchLine(3, $GUI_ENABLE)
				$ActiveRadio = 3
			EndIF
	EndSwitch
WEnd

Func SwitchLine($nRow, $nMode)
	$nState = 0
	Switch $nRow
		Case 1
				GUICtrlSetState($hButton_A, $nMode)
				GUICtrlSetState($hInput_A,  $nMode)
				If $nMode = $GUI_DISABLE Then
					GUICtrlSetData($hInput_A,"")
					GUICtrlSetData($hButton_A,"Set")
				Endif
		Case 2
				GUICtrlSetState($hButton_B, $nMode)
				GUICtrlSetState($hInput_B,  $nMode)
				If $nMode = $GUI_DISABLE Then
					GUICtrlSetData($hInput_B,"")
					GUICtrlSetData($hButton_B,"Set")
				Endif
		Case 3
				GUICtrlSetState($hButton_C, $nMode)
				GUICtrlSetState($hInput_C,  $nMode)
				If $nMode = $GUI_DISABLE Then
					GUICtrlSetData($hInput_C,"")
					GUICtrlSetData($hButton_C,"Set")
				Endif
	EndSwitch
EndFunc

Func Switcher($hButton, $hInput)
			If $nState = 0 Then
					GUICtrlSetData($hButton,"Change")
					GUICtrlSetState($hInput, $GUI_DISABLE)
					$nState = 1
			Else
					GUICtrlSetData($hButton,"Set")
					GUICtrlSetState($hInput, $GUI_ENABLE)
					$nState = 0
			EndIf
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Heler [?]
привести его к нормальному виду, без потери функционала
Вроде функционал не повреждён...

Код:
#include <GUIConstantsEx.au3>

GUICreate(":)", 260, 173, 400, 400)

$nFirst_ID = GUICtrlCreateDummy() + 1

$hRadio_A  = GUICtrlCreateRadio("", 15, 30, 12, 12)
$hInput_A  = GUICtrlCreateInput("", 40, 27, 90, 20)
$hButton_A = GUICtrlCreateButton("Set", 150, 25, 92, 23)

$hRadio_B  = GUICtrlCreateRadio("", 15, 80, 12, 12)
$hInput_B  = GUICtrlCreateInput("", 40, 77, 90, 20)
$hButton_B = GUICtrlCreateButton("Set", 150, 75, 92, 23)

$hRadio_C  = GUICtrlCreateRadio("", 15, 130, 12, 12)
$hInput_C  = GUICtrlCreateInput("", 40, 127, 90, 20)
$hButton_C = GUICtrlCreateButton("Set", 150, 125, 92, 23)

$nLast_ID  = GUICtrlCreateDummy() - 1

GUICtrlSetState($nFirst_ID, $GUI_CHECKED)
SwitchLine($nFirst_ID)

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $hButton_A, $hButton_B, $hButton_C
            Switcher($nMsg, $nMsg-1)
        Case $hRadio_A, $hRadio_B, $hRadio_C
			SwitchLine($nMsg)
    EndSwitch
WEnd

Func SwitchLine($nCurrentRadio)
	For $nCtrlID = $nFirst_ID To $nLast_ID Step 3
		$nRadio = $nCtrlID
		$nInput = $nCtrlID+1
		$nButton = $nCtrlID+2
		
		GUICtrlSetData($nInput, "")
		GUICtrlSetData($nButton, "Set")
		
		If $nRadio = $nCurrentRadio Then
			GUICtrlSetState($nRadio, $GUI_ENABLE)
			GUICtrlSetState($nInput, $GUI_ENABLE)
			GUICtrlSetState($nButton, $GUI_ENABLE)
		Else
			GUICtrlSetState($nInput, $GUI_DISABLE)
			GUICtrlSetState($nButton, $GUI_DISABLE)
		EndIf
	Next
EndFunc

Func Switcher($hButton, $hInput)
	If BitAND(GUICtrlGetState($hInput), $GUI_ENABLE) Then
		GUICtrlSetData($hButton, "Change")
		GUICtrlSetState($hInput, $GUI_DISABLE)
	Else
		GUICtrlSetData($hButton, "Set")
		GUICtrlSetState($hInput, $GUI_ENABLE)
	EndIf
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
А почему никто не хочет использовать массивы? Оно само здесь напрашивается.

Код:


Код удален, см. следующий мой пост. (Yashied)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Вот самый оптимальный вариант (IMHO).

Код:
#Include <GUIConstantsEx.au3>

Global $Msg
Global $ID[4][3] = [[1]]

#cs

$ID[0][0]   - Активный элемент (Radio) = (1..3)
$ID[0][1-2] - Не используется

$ID[i][0]   - Radio
$ID[i][1]   - Input
$ID[i][2]   - Button

#ce

GUICreate(":)", 260, 173, 400, 400)

For $i = 1 To 3
	$ID[$i][0] = GUICtrlCreateRadio("", 15, 30 + 50 * ($i - 1), 12, 12)
	$ID[$i][1] = GUICtrlCreateInput("", 40, 27 + 50 * ($i - 1), 90, 20)
	$ID[$i][2] = GUICtrlCreateButton("Set", 150, 25 + 50 * ($i - 1), 92, 23)
Next

GUICtrlSetState($ID[$ID[0][0]][0], $GUI_CHECKED)
State($ID[0][0])
GUISetState(@SW_SHOW)

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ID[1][2], $ID[2][2], $ID[3][2]
			If GUICtrlRead($ID[$ID[0][0]][2]) = "Set" Then
				GUICtrlSetData($ID[$ID[0][0]][2], "Change")
				GUICtrlSetState($ID[$ID[0][0]][1], $GUI_DISABLE)
			Else
				GUICtrlSetData($ID[$ID[0][0]][2], "Set")
				GUICtrlSetState($ID[$ID[0][0]][1], BitOR($GUI_ENABLE, $GUI_FOCUS))
			EndIf
		Case $ID[1][0], $ID[2][0], $ID[3][0]
			State(3 - ($ID[3][0] - $Msg) / 3)
	EndSwitch
WEnd

Func State($Index)

	If $ID[0][0] = $Index Then
		Return
	EndIf

	Local $State

	For $i = 1 To 3
		If $i = $Index Then
			$State = $GUI_ENABLE
		Else
			$State = $GUI_DISABLE
			If GUICtrlRead($ID[$i][2]) = "Change" Then
				GUICtrlSetData($ID[$i][2], "Set")
				GUICtrlSetData($ID[$i][1], "")
			EndIf
		EndIf
		For $j = 1 To 2
			If Not BitAND(GUICtrlGetState($ID[$i][$j]), $State) Then
				GUICtrlSetState($ID[$i][$j], $State)
			EndIf
		Next
	Next
	GUICtrlSetState($ID[$Index][1], $GUI_FOCUS)
	$ID[0][0] = $Index
EndFunc   ;==>State



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

CreatoR сказал(а):
Потому что это сложнее для разбора.
Я думаю, что любую задачу нужно изначально решать наиболее эффективными методами. Да, массивы немного сложнее чем вагон переменных, но это основа программирования. В конце концов, он придет к использованию массивов (когда код перевалит за несколько тысяч строк, в то время, как хватило бы и 200-300), но боюсь, что тогда ему придется переписывать полностью всю программу. Лучше это сделать на начальном этапе.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Yashied [?]
В конце концов, он придет к использованию массивов
Придёт, но в данном случае это не обязательно, я показал что подобный алгоритм может работать и без указания переменных для каждого создаваемого элемента. У меня есть несколько утилит которые работают именно по такому принципу, утилиты не простые, однако в них почти не используются массивы (я про элементы GUI конечно).


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

А вот похожий пример, где элементы создаются в цикле:

Код:
#include <GUIConstantsEx.au3>

Global $iTotalElements = 3 ;5

GUICreate(":)", 260, 200 + 50 * ($iTotalElements - 3) - 10)

$nFirst_ID = GUICtrlCreateDummy() + 1

For $i = 1 To $iTotalElements
	GUICtrlCreateRadio("Radio", 15, 30 + 50 * ($i - 1), 12, 12)
	GUICtrlCreateInput("", 40, 27 + 50 * ($i - 1), 90, 20)
	GUICtrlCreateButton("Set", 150, 25 + 50 * ($i - 1), 92, 23)
Next

$nLast_ID  = GUICtrlCreateDummy() - 1

GUICtrlSetState($nFirst_ID, $GUI_CHECKED)
SwitchLine($nFirst_ID)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nFirst_ID To $nLast_ID
			If Not StringRegExp(GUICtrlRead($nMsg, 1), "^(Radio|Set|Change)$") Then ContinueLoop
			
			If Mod($nMsg, 3) = 0 Then
				Switcher($nMsg, $nMsg-1)
			Else
				SwitchLine($nMsg)
			EndIf
    EndSwitch
WEnd

Func SwitchLine($nCurrentRadio)
    For $nCtrlID = $nFirst_ID To $nLast_ID Step 3
        $nRadio = $nCtrlID
        $nInput = $nCtrlID+1
        $nButton = $nCtrlID+2
        
        GUICtrlSetData($nInput, "")
        GUICtrlSetData($nButton, "Set")
        
        If $nRadio = $nCurrentRadio Then
            GUICtrlSetState($nRadio, $GUI_ENABLE)
            GUICtrlSetState($nInput, $GUI_ENABLE)
            GUICtrlSetState($nButton, $GUI_ENABLE)
        Else
            GUICtrlSetState($nInput, $GUI_DISABLE)
            GUICtrlSetState($nButton, $GUI_DISABLE)
        EndIf
    Next
EndFunc

Func Switcher($hButton, $hInput)
    If BitAND(GUICtrlGetState($hInput), $GUI_ENABLE) Then
        GUICtrlSetData($hButton, "Change")
        GUICtrlSetState($hInput, $GUI_DISABLE)
    Else
        GUICtrlSetData($hButton, "Set")
        GUICtrlSetState($hInput, $GUI_ENABLE)
    EndIf
EndFunc


Для добавления строчки достаточно изменить число у переменной $iTotalElements.
 
Автор
H

Heler

Знающий
Сообщения
70
Репутация
11
CreatoR и Yashied спасибо большое за примеры. Вечером будет чем заняться. ;)

Добавлено:

Мне в программе нужно управлять не одинаковыми группами элементов. Написал два варианта того что мне нужно. Помогите пожалуйста оптимизировать.

Реализация 1:
Код:
#Include <GUIConstantsEx.au3>
#include <EditConstants.au3>

Global $Msg
Global $ID[5][4] = [[3]]

GUICreate(";)", 370, 230, -1, -1, -1)

	$ID[1][1] = GUICtrlCreateInput("", 30, 18, 90, 20)
	$ID[1][2] = GUICtrlCreateInput("", 30, 50, 90, 20,$ES_PASSWORD)
	$ID[1][3] = GUICtrlCreateButton("Connect", 29, 81, 92, 23)
    $ID[2][1] = GUICtrlCreateInput("", 30, 115, 200, 20)
    $ID[2][2] = GUICtrlCreateButton("Set", 249, 114, 92, 23)
$nFirst_ID = GUICtrlCreateDummy() + 1
	$ID[3][0] = GUICtrlCreateRadio("", 9, 152, 12, 12)
    $ID[3][1] = GUICtrlCreateInput("", 30, 148, 90, 20)
	$ID[3][2] = GUICtrlCreateInput("", 140, 148, 90, 20)
	$ID[3][3] = GUICtrlCreateButton("Set", 249, 146, 92, 23)
	$ID[4][0] = GUICtrlCreateRadio("", 9, 185, 12, 12)
    $ID[4][1] = GUICtrlCreateInput("", 30, 181, 200, 20)
	GUICtrlCreateDummy()
    $ID[4][3] = GUICtrlCreateButton("Set", 249, 179, 92, 23)
$nLast_ID  = GUICtrlCreateDummy() - 1

GUICtrlSetState($ID[$ID[0][0]][0], $GUI_CHECKED)
SwitchLine($ID[3][0])
GUISetState(@SW_SHOW)

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case 	$ID[3][3], $ID[4][3]
            If GUICtrlRead($ID[$ID[0][0]][3]) = "Set" Then
                GUICtrlSetData($ID[$ID[0][0]][3], "Change")
				Switcher($ID[0][0], 2, $GUI_DISABLE)
            Else
                GUICtrlSetData($ID[$ID[0][0]][3], "Set")
				Switcher($ID[0][0], 2, $GUI_ENABLE)
            EndIf
		Case $ID[1][3]
			If GUICtrlRead($ID[1][3]) = "Connect" Then
                GUICtrlSetData($ID[1][3], "Disconnect")
                Switcher(1, 2, $GUI_DISABLE)
            Else
                GUICtrlSetData($ID[1][3], "Connect")
				Switcher(1, 2, $GUI_ENABLE)
            EndIf
				Case $ID[2][2]
			If GUICtrlRead($ID[2][2]) = "Set" Then
                GUICtrlSetData($ID[2][2], "Change")
                Switcher(2, 1, $GUI_DISABLE)
            Else
                GUICtrlSetData($ID[2][2], "Set")
				Switcher(2, 1, BitOR($GUI_ENABLE, $GUI_FOCUS))
            EndIf
        Case $ID[3][0]
			SwitchLine($ID[3][0])
		Case $ID[4][0]
			SwitchLine($ID[4][0])
    EndSwitch
WEnd

Func Switcher($Num, $objects, $Mode)
	For $e = 1 To $objects
		GUICtrlSetState($ID[$Num][$e], $Mode)
	Next
EndFunc

Func SwitchLine($nCurrentRadio)
Local $Count = 2
For $nCtrlID = $nFirst_ID To $nLast_ID Step 4
        $nRadio = $nCtrlID
        $nInput = $nCtrlID+1
		$nInput2 = $nCtrlID+2
		$nButton = $nCtrlID+3
		$Count += 1

		GUICtrlSetData($nInput, "")
		GUICtrlSetData($nInput2, "")
        GUICtrlSetData($nButton, "Set")

        If $nRadio = $nCurrentRadio Then
            GUICtrlSetState($nInput, $GUI_ENABLE)
			GUICtrlSetState($nInput2, $GUI_ENABLE)
            GUICtrlSetState($nButton, $GUI_ENABLE)
			$ID[0][0] = $Count
        Else
            GUICtrlSetState($nInput, $GUI_DISABLE)
			GUICtrlSetState($nInput2, $GUI_DISABLE)
            GUICtrlSetState($nButton, $GUI_DISABLE)
        EndIf
Next
EndFunc


Реализация 2:
Код:
#Include <GUIConstantsEx.au3>
#include <EditConstants.au3>

Global $Msg
Global $ID[5][4] = [[3]]

GUICreate(";)", 370, 230, -1, -1, -1)

	$ID[1][0] = GUICtrlCreateInput("", 30, 18, 90, 20)
	$ID[1][1] = GUICtrlCreateInput("", 30, 50, 90, 20,$ES_PASSWORD)
	$ID[1][2] = GUICtrlCreateButton("Connect", 29, 81, 92, 23)
    $ID[2][1] = GUICtrlCreateInput("", 30, 115, 200, 20)
    $ID[2][2] = GUICtrlCreateButton("Set", 249, 114, 92, 23)
	$ID[3][0] = GUICtrlCreateRadio("", 9, 152, 12, 12)
    $ID[3][1] = GUICtrlCreateInput("", 30, 148, 90, 20)
	$ID[3][2] = GUICtrlCreateButton("Set", 249, 146, 92, 23)
	$ID[4][0] = GUICtrlCreateRadio("", 9, 185, 12, 12)
    $ID[4][1] = GUICtrlCreateInput("", 30, 181, 200, 20)
    $ID[4][2] = GUICtrlCreateButton("Set", 249, 179, 92, 23)
	$ID[3][3] = GUICtrlCreateInput("", 140, 148, 90, 20)

GUICtrlSetState($ID[$ID[0][0]][0], $GUI_CHECKED)
State($ID[0][0], 2)
GUISetState(@SW_SHOW)

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            Exit
        Case 	$ID[3][2], $ID[4][2]
            If GUICtrlRead($ID[$ID[0][0]][2]) = "Set" Then
                GUICtrlSetData($ID[$ID[0][0]][2], "Change")
                GUICtrlSetState($ID[$ID[0][0]][1], $GUI_DISABLE)
				If $ID[0][0] = 3 Then
					GUICtrlSetState($ID[$ID[0][0]][3], $GUI_DISABLE)
				Endif
            Else
                GUICtrlSetData($ID[$ID[0][0]][2], "Set")
                GUICtrlSetState($ID[$ID[0][0]][1], BitOR($GUI_ENABLE, $GUI_FOCUS))
				If $ID[0][0] = 3 Then
					GUICtrlSetState($ID[$ID[0][0]][3], $GUI_ENABLE)
				Endif
            EndIf
		Case $ID[1][2]
			If GUICtrlRead($ID[1][2]) = "Connect" Then
                GUICtrlSetData($ID[1][2], "Disconnect")
                GUICtrlSetState($ID[1][1], $GUI_DISABLE)
				GUICtrlSetState($ID[1][0], $GUI_DISABLE)
            Else
                GUICtrlSetData($ID[1][2], "Connect")
                GUICtrlSetState($ID[1][0], $GUI_ENABLE)
				GUICtrlSetState($ID[1][1], $GUI_ENABLE)
            EndIf
				Case $ID[2][2]
			If GUICtrlRead($ID[2][2]) = "Set" Then
                GUICtrlSetData($ID[2][2], "Change")
                GUICtrlSetState($ID[2][1], $GUI_DISABLE)
            Else
                GUICtrlSetData($ID[2][2], "Set")
                GUICtrlSetState($ID[2][1], BitOR($GUI_ENABLE, $GUI_FOCUS))
            EndIf
        Case $ID[3][0], $ID[4][0]
            State(4 - ($ID[4][0] - $Msg) / 3)
    EndSwitch
WEnd

Func State($Index, $Option = 0)
    If $ID[0][0] = $Index And $Option = 0 Then
        Return
    EndIf

    Local $State

    For $i = 3 To 4
        If $i = $Index Then
            $State = $GUI_ENABLE
        Else
            $State = $GUI_DISABLE
            If GUICtrlRead($ID[$i][2]) = "Change" Then
                GUICtrlSetData($ID[$i][2], "Set")
                GUICtrlSetData($ID[$i][1], "")
				GUICtrlSetData($ID[$i][3], "")
            EndIf
        EndIf
        For $j = 1 To 3
           If Not BitAND(GUICtrlGetState($ID[$i][$j]), $State) Then
                GUICtrlSetState($ID[$i][$j], $State)
            EndIf
        Next
    Next
    GUICtrlSetState($ID[$Index][1], $GUI_FOCUS)
    $ID[0][0] = $Index
EndFunc   ;==>State
 
Верх