Войти

Показать полную графическую версию : [решено] Обработка событий в 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"??

beve
28-08-2009, 23:30
Вот пример Мастера:Ссылка (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)

Creat0R
28-08-2009, 23:47
#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
Ах! Действительно Комбо :). В следующий раз выложу готовый пример с ошибками :)

Creat0R
29-08-2009, 01:17
Belfigor, Так что с примером, он помог? или я не правильно понял задачу? Сомниваюсь что и beve угадал :)

Belfigor
29-08-2009, 01:43
Несовсем, хочу сделать так чтобы когда пользователь выбирает другой язык на месте прежних двух пунктов в нижнем списке появлялись две совершенно другие надписи, тоесть если выбран Русский, то во втором списке пользователь может выбрать например строки с названиями "архиваторы" и "файловые менеджеры", если же выбран английский, пользователь уже не видит варианты "архиваторы" и "файловые менеджеры", после выбора "Английский" во втором списке ему предоставляется возможность выбрать только из например "Браузеры" и "Графические редакторы". Сижу вот немогу понять как это делается. В гиу я полный 0 :)

Creat0R
29-08-2009, 02:40
Несовсем »
Я поправил свой пример выше. Теперь все данные хранятся в двухмерном массиве, что упрощает добавление новых записей.

А вообще можно и само событие проверять, необязательно регистрировать 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

Creat0R
29-08-2009, 04:03
К чему ее надо будет приравнивать при написании условия? »
К $nMsg от GUIGetMsg().

GUICtrlRead. Это и есть та команда которая возвращает значение выбранного в данный момент пункта в выпадающем листе? »
Да.

вопросы про свич и селект так и остаются в силе »
Полные ответы на них есть в справке.

Могу ли я узнать с помощью какой-нибудь команды имя функции которая выполняется в данный момент? »
Нет, без...дополнительных заморочек »никак.
Я бы и сам был рад такому функционалу в AutoIt.

Belfigor
29-08-2009, 04:17
Спасибо за ответы. Надеюсь завтра смогу окончательно разобраться в комбо конструкциях :)

SyDr
29-08-2009, 09:55
Так... Не такие уж и сильные заморочки. Просто к каждой функции в самое начало добавить присвоение глобальной переменной названия этой функции. Хотя можно и локальной.
Просто +одна строчка для каждой функции.

Local $sFunctionName = "FunctionNameHere"

Creat0R
29-08-2009, 16:45
Еще возник вопрос не по теме но все же задам »
В следующий раз создавайте отдельную тему (если не нашли похожую), я позволил в первый раз этот вопрос так как ответ был короткий и сводящий к завершению обсуждения. SyDr решил продолжить обсуждение (за что ему отдельно спаси... предупреждение :) ), что в конце концов обычно приводит к разведению оффтопика.




© OSzone.net 2001-2012