Показать полную графическую версию : [решено] Обработка событий в GUICtrlCreateCombo
Belfigor
28-08-2009, 22:16
GUICtrlCreateLabel ("Язык:", 10, 10, 50)
GUICtrlCreateCombo("Русский", 100, 7,150) ; create first item
GUICtrlSetData(-1, "English", "Русский") ; add other item snd set a new default
GUICtrlCreateLabel ("Тип программы:", 10, 33, 100)
GUICtrlCreateCombo("Архиваторы", 100, 30,150) ; create first item
GUICtrlSetData(-1, "Файловые менеджеры", "Архиваторы") ; add other item snd set a new default
Я создаю два выпадающих списка, как мне сделать чтобы далее в этом цикле:
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
исходя из того что было выделенно в выпадающем списке, менялись данные идущего ниже списка?
Тоесть если выделен Русский то все остается как есть, а если выделить Eanglish там оборазится например "File managers" и "Archivators"??
Вот пример Мастера:Ссылка (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=1700#8)
Тебе нужно создать глобальную переменную, которая будет хранить название языка, а далее делаеш в нужном месте (в начале соответствующего Case) проверку на выбранный язык, и в зависимости уже от этого следующие действия.
Каждый же шаг будеш прописывать примерно так:;Step 2 Eng
$Input_Step2Eng = GUICtrlCreateInput("Some input", 10, 20, 180, 20)
$CheckBox_Step2Eng = GUICtrlCreateCheckbox("Some checkbox", 10, 50)
;Step 2 Rus
$Input_Step2Rus = GUICtrlCreateInput("Некоторый инпут", 10, 20, 180, 20)
$CheckBox_Step2Rus = GUICtrlCreateCheckbox("Некоторый чекбокс", 10, 50)
#include <GUIConstantsEx.au3>
#include <GUIComboBoxEx.au3>
#include <WindowsConstants.au3>
;
Global $aLangs_Data[3][3] = _
[ _
[2, ""], _
["English", "Браузеры|Графические редакторы", "Браузеры"], _
["Русский", "Архиваторы|Файловые менеджеры", "Архиваторы"] _
]
$hGUI = GUICreate("Test Script")
GUICtrlCreateLabel("Язык:", 10, 10, 50)
$nCombo_1 = GUICtrlCreateCombo($aLangs_Data[2][0], 100, 7, 150, 30, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, $aLangs_Data[1][0], $aLangs_Data[2][0]) ; add other item snd set a new default
GUICtrlCreateLabel("Тип программы:", 10, 33, 100)
$nCombo_2 = GUICtrlCreateCombo("", 100, 30, 150, 30, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST)) ; create first item
GUICtrlSetData(-1, $aLangs_Data[2][1], $aLangs_Data[2][2]) ;add other item snd set a new default
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
Func WM_COMMAND($hWndGUI, $nMsgID, $wParam, $lParam)
If Not BitAND(WinGetState($hWndGUI), 2) Then Return $GUI_RUNDEFMSG
Local $iIDFrom = BitAND($wParam, 0xFFFF) ; Low Word
Local $iCode = BitShift($wParam, 16) ; Hi Word
Switch $iIDFrom
Case $nCombo_1
Switch $iCode
Case $CBN_SELCHANGE
Local $sComboData = GUICtrlRead($nCombo_1)
Local $sComboIndex = ControlCommand($hWndGUI, "", $nCombo_1, "FindString", $sComboData)
For $i = 1 To $aLangs_Data[0][0]
If $aLangs_Data[$i][0] = $sComboData Then
GUICtrlSetData($nCombo_2, "")
GUICtrlSetData($nCombo_2, $aLangs_Data[$i][1], $aLangs_Data[$i][2])
ExitLoop
EndIf
Next
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
На будущее, выкладывайте рабочие примеры, мне пришлось добавлять инклюды и GUICreate, не хорошо ;)
P.S
В названии темы опечатка? возможно не GuiCtrlCreateLabel, а GUICtrlCreateCombo?
Belfigor
29-08-2009, 00:36
Ах! Действительно Комбо :). В следующий раз выложу готовый пример с ошибками :)
Belfigor, Так что с примером, он помог? или я не правильно понял задачу? Сомниваюсь что и beve угадал :)
Belfigor
29-08-2009, 01:43
Несовсем, хочу сделать так чтобы когда пользователь выбирает другой язык на месте прежних двух пунктов в нижнем списке появлялись две совершенно другие надписи, тоесть если выбран Русский, то во втором списке пользователь может выбрать например строки с названиями "архиваторы" и "файловые менеджеры", если же выбран английский, пользователь уже не видит варианты "архиваторы" и "файловые менеджеры", после выбора "Английский" во втором списке ему предоставляется возможность выбрать только из например "Браузеры" и "Графические редакторы". Сижу вот немогу понять как это делается. В гиу я полный 0 :)
Несовсем »
Я поправил свой пример выше. Теперь все данные хранятся в двухмерном массиве, что упрощает добавление новых записей.
А вообще можно и само событие проверять, необязательно регистрировать WM_COMMAND:
#include <GUIConstantsEx.au3>
#include <GUIComboBoxEx.au3>
#include <WindowsConstants.au3>
;
Global $iTotal_Elmnts = 2 ;Обязательно указать кол-во элементов в массиве перед добавление/удалением строки
Global $aLangs_Data[$iTotal_Elmnts+1][3] = _
[ _
[$iTotal_Elmnts, 2, ""], _ ;2-йка это язык по умолчанию в списке ниже
["English", "Браузеры|Графические редакторы", "Браузеры"], _ ;Третьий параметр это строка по умолчанию из списка
["Русский", "Архиваторы|Файловые менеджеры", "Архиваторы"] _
]
Global $iDefault_Lang = $aLangs_Data[0][1]
Global $sDefault_Lang = $aLangs_Data[$iDefault_Lang][0]
$hGUI = GUICreate("Test Script")
GUICtrlCreateLabel("Язык:", 10, 10, 50)
$nCombo_1 = GUICtrlCreateCombo("", 100, 7, 150, 30, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
For $i = 1 To $aLangs_Data[0][0]
GUICtrlSetData(-1, $aLangs_Data[$i][0], $sDefault_Lang)
Next
GUICtrlCreateLabel("Тип программы:", 10, 33, 100)
$nCombo_2 = GUICtrlCreateCombo("", 100, 30, 150, 30, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, $aLangs_Data[$iDefault_Lang][1], $aLangs_Data[$iDefault_Lang][2])
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $nCombo_1
Local $sComboData = GUICtrlRead($nCombo_1)
Local $sComboIndex = ControlCommand($hGUI, "", $nCombo_1, "FindString", $sComboData)
For $i = 1 To $aLangs_Data[0][0]
If $aLangs_Data[$i][0] = $sComboData Then
GUICtrlSetData($nCombo_2, "")
GUICtrlSetData($nCombo_2, $aLangs_Data[$i][1], $aLangs_Data[$i][2])
ExitLoop
EndIf
Next
EndSwitch
WEnd
Belfigor
29-08-2009, 03:02
Очччень сложная конструкция http://smayly.net.ru/gallery/anime/pictures/Yolks_1/hi.png
В хелпе приводится пример с использованием Select Case, в твоем примере используется Switch Case.
Для использования Select в кейсах надо проверять равны ли переменные заданным данным. И вот я хотел узнать можно ли в данном случае использовать Select Case и как вот эта строка:
Case $nCombo_1
Будет выглядеть в конструкции Select Case. К чему ее надо будет приравнивать при написании условия?
И в своем примере ты используешь GUICtrlRead. Это и есть та команда которая возвращает значение выбранного в данный момент пункта в выпадающем листе?
В принципе работы конструкции вроде бы разобрался, но вопросы про свич и селект так и остаются в силе.
Еще возник вопрос не по теме но все же задам:
Могу ли я узнать с помощью какой-нибудь команды имя функции которая выполняется в данный момент?
Тоесть например
Func 1()
MsgBox(0,'',GetFuncName()) ;Ну или что-нибудь в этом роде? Хочется чтобы Меседж бокс вывел название исполяемой в данный момент функции, без всяких дополнительных заморочек.
EndFunc
К чему ее надо будет приравнивать при написании условия? »
К $nMsg от GUIGetMsg().
GUICtrlRead. Это и есть та команда которая возвращает значение выбранного в данный момент пункта в выпадающем листе? »
Да.
вопросы про свич и селект так и остаются в силе »
Полные ответы на них есть в справке.
Могу ли я узнать с помощью какой-нибудь команды имя функции которая выполняется в данный момент? »
Нет, без...дополнительных заморочек »никак.
Я бы и сам был рад такому функционалу в AutoIt.
Belfigor
29-08-2009, 04:17
Спасибо за ответы. Надеюсь завтра смогу окончательно разобраться в комбо конструкциях :)
Так... Не такие уж и сильные заморочки. Просто к каждой функции в самое начало добавить присвоение глобальной переменной названия этой функции. Хотя можно и локальной.
Просто +одна строчка для каждой функции.
Local $sFunctionName = "FunctionNameHere"
Еще возник вопрос не по теме но все же задам »
В следующий раз создавайте отдельную тему (если не нашли похожую), я позволил в первый раз этот вопрос так как ответ был короткий и сводящий к завершению обсуждения. SyDr решил продолжить обсуждение (за что ему отдельно спаси... предупреждение :) ), что в конце концов обычно приводит к разведению оффтопика.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.