Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Обработка событий в GUICtrlCreateCombo (http://forum.oszone.net/showthread.php?t=149216)

Belfigor 28-08-2009 22:16 1205889

Обработка событий в GUICtrlCreateCombo
 
Код:

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 1205933

Вот пример Мастера:Ссылка
Тебе нужно создать глобальную переменную, которая будет хранить название языка, а далее делаеш в нужном месте (в начале соответствующего 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 1205944

Код:

#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 1205970

Ах! Действительно Комбо :). В следующий раз выложу готовый пример с ошибками :)

Creat0R 29-08-2009 01:17 1206006

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

Belfigor 29-08-2009 01:43 1206033

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

Creat0R 29-08-2009 02:40 1206061

Цитата:

Цитата Belfigor
Несовсем »

Я поправил свой пример выше. Теперь все данные хранятся в двухмерном массиве, что упрощает добавление новых записей.

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

Очччень сложная конструкция

В хелпе приводится пример с использованием 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 1206081

Цитата:

Цитата Belfigor
К чему ее надо будет приравнивать при написании условия? »

К $nMsg от GUIGetMsg().

Цитата:

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

Да.

Цитата:

Цитата Belfigor
вопросы про свич и селект так и остаются в силе »

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

Цитата:

Цитата Belfigor
Могу ли я узнать с помощью какой-нибудь команды имя функции которая выполняется в данный момент? »

Нет, без...
Цитата:

Цитата Belfigor
дополнительных заморочек »

никак.
Я бы и сам был рад такому функционалу в AutoIt.

Belfigor 29-08-2009 04:17 1206082

Спасибо за ответы. Надеюсь завтра смогу окончательно разобраться в комбо конструкциях :)

SyDr 29-08-2009 09:55 1206146

Так... Не такие уж и сильные заморочки. Просто к каждой функции в самое начало добавить присвоение глобальной переменной названия этой функции. Хотя можно и локальной.
Просто +одна строчка для каждой функции.

Код:

Local $sFunctionName = "FunctionNameHere"

Creat0R 29-08-2009 16:45 1206438

Цитата:

Цитата Belfigor
Еще возник вопрос не по теме но все же задам »

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


Время: 07:34.

Время: 07:34.
© OSzone.net 2001-