Что нового

[Элементы GUI] Как правильно создать динамический combo бокс из другог combo бокса

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
наставьте пожалуйста на путь истинный не магу осилить своими знаниями, что я сделал не правильно ? как то криво работает :'(
Код:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;#include <GUIFFLabel.au3>


$Form2 = GUICreate("Dialog", 316, 238, 346, 262)
$GroupBox1 = GUICtrlCreateGroup("", 8, 1, 297, 193)
$Combo1 = GUICtrlCreateCombo("Combo1", 16, 16, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "111111|222222")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("&OK", 65, 203, 75, 25)
$Button2 = GUICtrlCreateButton("&Cancel", 162, 203, 75, 25)
GUISetState(@SW_SHOW)



While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case Else

			If	GUICtrlRead ($Combo1) = 'Combo1' Then
				Sleep(200)
			ElseIf GUICtrlRead ($Combo1) = '111111' Then
				$Combo2 = GUICtrlCreateCombo("Combo2", 16, 40, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL),$WS_EX_COMPOSITED)
				;$Combo2 = GUICtrlCreateCombo("Combo2", 16, 40, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL,$WS_EX_COMPOSITED))
				GUICtrlSetData(-1,'333333|444444')
				;Sleep(200)

			EndIf


	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
general66,
А если так?
Код:
;#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
;#include <WindowsConstants.au3>
;#include <GUIFFLabel.au3>

$hForm2 = GUICreate('Dialog', 316, 238)
$nGroupBox1 = GUICtrlCreateGroup('', 8, 1, 297, 193)
$nCombo1 = GUICtrlCreateCombo('Combo1', 16, 16, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, '111111|222222')
$nCombo2 = GUICtrlCreateCombo('Combo2', 16, 40, 145, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
GUICtrlSetData(-1, '333333|444444')
GUICtrlSetState(-1, $GUI_HIDE)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$nButton1 = GUICtrlCreateButton('&OK', 65, 203, 75, 25)
$nButton2 = GUICtrlCreateButton('&Cancel', 162, 203, 75, 25)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $nButton2
			Exit
		Case $nCombo1
			If GUICtrlRead($nCombo1) = '111111' Then
				GUICtrlSetState($nCombo2, $GUI_SHOW)
			Else
				GUICtrlSetState($nCombo2, $GUI_HIDE)
			EndIf
	EndSwitch
WEnd
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
general66
Стили $CBS_DROPDOWN,$CBS_AUTOHSCROLL добавлять не надо, они по умолчанию, при этом отсутствие умолчального $WS_VSCROLL всего лишь не даст возможности увидеть более 30 пункта в виду отсутствии прокрутки.
$WS_EX_COMPOSITED вроде должен использоваться для GUICreate, при котором дочерние окна (кнопки, лейблы, списки) будут иметь двойную буферизацию при перерисовке и не будут мерцать при изменении размера окна.

Код:
#include <GUIConstantsEx.au3>

$Form2 = GUICreate("Dialog", 316, 238, 346, 262)
$GroupBox1 = GUICtrlCreateGroup("", 8, 1, 297, 193)
$Combo1 = GUICtrlCreateCombo("Combo1", 16, 16, 145, 25)
GUICtrlSetData(-1, "111111|222222")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("&OK", 65, 203, 75, 25)
$Button2 = GUICtrlCreateButton("&Cancel", 162, 203, 75, 25)
$Combo2 = GUICtrlCreateCombo("Combo2", 16, 40, 145, 25)
GUICtrlSetData(-1, '333333|444444')
GUICtrlSetState(-1, $GUI_HIDE) ; скрываем комбо
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Combo1
			Switch GUICtrlRead($Combo1)
				Case 'Combo1'
					MsgBox(0, 'Сообщение', ';)')
				Case '111111'
					GUICtrlSetState($Combo2, $GUI_SHOW) ; открываем по выбору 111111
				Case '222222'
					GUICtrlSetState($Combo2, $GUI_HIDE) ; типа скрываем по выбору 222222
			EndSwitch
	EndSwitch
WEnd
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
madmasles [?]

Я так понимаю из за постоянного опроса в моем примере
Код:
ElseIf GUICtrlRead ($Combo1) = '111111' Then

без предварительного создания комбобокса не обойтись? но ведь если убрать из строчки $WS_EX_COMPOSITED и после появления combo2, значение combo1 вернуть по умолчанию, то второй комбобокс работает нормально . Неужели выхода нет?



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

AZJIO [?]
Стили $CBS_DROPDOWN,$CBS_AUTOHSCROLL

Форму в коде сделал она их прописала :-[


$WS_EX_COMPOSITED вроде должен использоваться для GUICreate

думал что он используется для всех GUICreate хотел мерцание убрать :-[ :-[ позже разобрался что мерцание из за другого
Спасибо за подсказки
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
AZJIO [?]
Для начала нужно определится когда комбобокс должен появится, а когда исчезнуть.

После запуска формы при выборе пункта 111111 в первом комбобоксе должен появится второй комбобокс, при выборе других пунктов 222222 появляются другие комбобоксы , при выборе пункта по умолчанию combo1 все комбобоксы должны исчезнуть, все возвращается в начальное состояние как при старте скрипта, пункты появившегося комбобокса будут влиять на отображение всей формы т.е. будут присваиваться значения отображаемым input
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
general66

с удалением комбо
Код:
#include <GUIConstantsEx.au3>

Global $ComboChild=100000

$Form2 = GUICreate("Dialog", 316, 238, 346, 262)
GUICtrlCreateGroup("", 8, 1, 297, 193)
$iCombo1 = GUICtrlCreateCombo('', 16, 16, 145, 25)
GUICtrlSetData(-1, "Ничего|Выбор1|Другой2", 'Ничего')

GUICtrlCreateGroup("", -99, -99, 1, 1)
$iButton1 = GUICtrlCreateButton("&OK", 65, 203, 75, 25)
$iButton2 = GUICtrlCreateButton("&Cancel", 162, 203, 75, 25)

$iInput = GUICtrlCreateInput('', 30, 160, 230, 22)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $ComboChild
			GUICtrlSetData($iInput, GUICtrlRead($ComboChild))
        Case $iCombo1
            Switch GUICtrlRead($iCombo1)
                ; Case ''
                    ; GUICtrlSetState($ComboChild, $GUI_HIDE) ; скрываем комбо
                Case 'Выбор1'
					_CreateCombo('333333|444444')
                Case 'Другой2'
					_CreateCombo('Текст|Другое')
                Case Else
					GUICtrlSetState($ComboChild, $GUI_HIDE) ; скрываем комбо
					$ComboChild=100000
            EndSwitch
    EndSwitch
WEnd

Func _CreateCombo($sData)
	If $ComboChild<>100000 Then GUICtrlDelete($ComboChild)
	$ComboChild = GUICtrlCreateCombo('', 16, 40, 145, 25)
	GUICtrlSetData(-1, '|Ничего|'&$sData, 'Ничего')
	GUICtrlSetState(-1, $GUI_SHOW)
EndFunc

А лучше так
Код:
#include <GUIConstantsEx.au3>

$Form2 = GUICreate("Dialog", 316, 238, 346, 262)
GUICtrlCreateGroup("", 8, 1, 297, 193)
$iCombo1 = GUICtrlCreateCombo('', 16, 16, 145, 25)
GUICtrlSetData(-1, "Ничего|Выбор1|Другой2", 'Ничего')

$ComboChild = GUICtrlCreateCombo('', 16, 40, 145, 25)
GUICtrlSetState(-1, $GUI_HIDE)

GUICtrlCreateGroup("", -99, -99, 1, 1)
$iButton1 = GUICtrlCreateButton("&OK", 65, 203, 75, 25)
$iButton2 = GUICtrlCreateButton("&Cancel", 162, 203, 75, 25)

$iInput = GUICtrlCreateInput('', 30, 160, 230, 22)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $ComboChild
			GUICtrlSetData($iInput, GUICtrlRead($ComboChild))
        Case $iCombo1
            Switch GUICtrlRead($iCombo1)
                Case 'Выбор1'
					_CreateCombo('Ага|Ещё|Три')
                Case 'Другой2'
					_CreateCombo('Текст|Другое')
                Case Else
					GUICtrlSetState($ComboChild, $GUI_HIDE) ; скрываем комбо
            EndSwitch
    EndSwitch
WEnd

Func _CreateCombo($sData)
	GUICtrlSetData($ComboChild, '|Ничего|'&$sData, 'Ничего') ; очистка списка с добавлением новых данных
	GUICtrlSetState($ComboChild, $GUI_SHOW) ; сделать видимым
EndFunc
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
AZJIO [?]

Действительно лучше так, этот пример позволяет нам создавать любую конфигурацию комбобоксов , заранее создаем комбобоксы столько сколько позволяет нам наша жадность , а потом отображаем их согласно запланировано конфигурации , благо данные в них не постоянные, и отображают они только то что выбрано по цепочке с максимальной гибкостью которую только можно себе представить :stars:
Все гениальное просто :ok: Спасибо за помощь.
 
Верх