Форум » GUI » Combo » Ответить

Combo

Vlad04: Комбобокс строится на основании массива [quote] DEFINE COMBOBOX Comb_F ROW 10 COL 110 WIDTH 1007 HEIGHT 100 ITEMS mFilter FONTNAME 'Arial' TOOLTIP '' END COMBOBOX [/quote] Массив mFilter в процессе работы меняется, а как Комбобокс обновить динамически.

Ответов - 10

Haz: Vlad04 пишет: как Комбобокс обновить динамически. подсмотреть в справке по комбику , которая поставляется вместе с минигуи и использовать методы METHODS: · AddItem( cItemText ) Add a new item to a ComboBox control · DeleteItem( nItemIndex ) Deletes an item from a ComboBox control · DeleteAllItems Deletes all items from a ComboBox control PS в примерах есть DinamicComdo

Vlad04: Вообщем я так и сделал. Думал, может есть короче

Haz: Vlad04 пишет: Думал, может есть короче короче есть только для комбика по DBF , там работает метод Refresh() При комбо по массиву Refresh вывалит с ошибкой так что только примерно так [pre2] DoMethod( 'Form_1', 'Combo_1', 'DeleteAlItems') Aeval( aArray, { |e| DoMethod( 'Form_1', 'Combo_1', 'AddItem', e ) } ) [/pre2]


gfilatov2002: Haz пишет: При комбо по массиву Refresh вывалит с ошибкой Добавил возможность обновлять ComboBox при изменении рабочего массива, ассоциированного с ним. Контрольный пример см.ниже [pre2]/* * MiniGUI ComboBox Demo */ #include "minigui.ch" Function Main private aitems := { '1 | Uno' , '2 | Dos' , '3 | tres' } DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; TITLE 'ComboBox Demo' ; MAIN @ 10,10 COMBOBOX Control_1 ; WIDTH 100 ; ITEMS aitems ; VALUE 1 ; FONT 'Courier' SIZE 12 DEFINE BUTTON Control_2 ROW 10 COL 150 WIDTH 140 CAPTION 'Update Combo' VALUE 1 ACTION UpdateCombo('Control_1','Form_1') END BUTTON END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil Function UpdateCombo(Control,Parent) aadd(aitems, '4 | kvadro') if len(aitems) > 4 asize(aitems, 4) endif //_HMG_aControlMiscData1 [GetControlIndex(Control,Parent)][4] := aitems DoMethod(Parent,Control,'Refresh') Return Nil[/pre2]

Haz: gfilatov2002 пишет: Добавил возможность обновлять ComboBox Не совсем понятно как новый рабочий массив передается в комбо если он не private. Напрашивается новый метод типа SetArray( aArray ) и потом Refresh() по сути следующие две строки это и делают [pre2] DoMethod( 'Form_1', 'Combo_1', 'DeleteAlItems') Aeval( aArray, { |e| DoMethod( 'Form_1', 'Combo_1', 'AddItem', e ) } ) [/pre2]

gfilatov2002: Haz пишет: Напрашивается новый метод типа SetArray( aArray ) БЛАГОДАРЮ ЗА ПОДСКАЗКУ Добавил новый метод SetArray( aArray ) для элементов управления COMBOBOX, GRID и LISTBOX Тестовый пример ниже [pre2]/* * MiniGUI ComboBox Demo */ #include "minigui.ch" memvar aitems Function Main private aItems := { '1 | Uno' , '2 | Dos' , '3 | tres' } DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 200 ; TITLE 'ComboBox Demo' ; MAIN @ 10,10 COMBOBOX Control_1 ; WIDTH 130 ; ITEMS {""} ; VALUE 1 ; LOWERCASE ; FONT 'Courier New' SIZE 12 DEFINE BUTTON Control_2 ROW 10 COL 150 WIDTH 140 CAPTION 'Update Combo' VALUE 1 ACTION UpdateCombo( 'Control_1', 'Form_1' ) END BUTTON DEFINE BUTTON Control_3 ROW 40 COL 150 WIDTH 140 CAPTION 'Update Combo 2' VALUE 1 ACTION UpdateCombo2( 'Control_1', 'Form_1' ) END BUTTON END WINDOW Form_1.Control_1.SetArray( aItems ) CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil // Private array Function UpdateCombo( Control, Parent ) aadd(aitems, '4 | quattro') aadd(aitems, '5 | cinque') aadd(aitems, '6 | senco') aadd(aitems, '7 | ses') if len(aitems) > 7 asize(aitems, 7) endif DoMethod( Parent, Control, 'Refresh' ) Return Nil // Local array Function UpdateCombo2( Control, Parent ) local aNewValues := { '1 | Uno' , '2 | Dos' , '3 | tres', '4 | quattro', '5 | cinque', '6 | senco', '7 | ses' } DoMethod( Parent, Control, 'SetArray', aNewValues ) Return Nil[/pre2]

Vlad04: gfilatov2002 Добавил возможность обновлять ComboBox при изменении рабочего массива Добавил новый метод SetArray( aArray ) Появится после очередного обновления ?

gfilatov2002: Vlad04 пишет: Появится после очередного обновления ? Да, в апрельской сборке С 1 апреля поздравляю Вас, кстати, из столицы юмора

Andrey: gfilatov2002 пишет: DoMethod( Parent, Control, 'SetArray', aNewValues ) Классный метод. Сокращает написания кода. А как сделать два COMBOBOX, чтобы у второго значения массива изменялось по первому ? Т.е. типа справочника: COMBOBOX-ГОРОД и COMBOBOX-УЛИЦЫ.... Вот примерно так, но у меня не получилось.... /* * MiniGUI ComboBox Demo */ #include "minigui.ch" Function Main Local aCity := { '5 | Paris' , '6 | Berlin' , '7 | Vena' } Local nI, aDim := {}, aStreet := {}, nCity, nStreet AADD( aDim, { 1,"Street-10", 5 } ) // Paris AADD( aDim, { 2,"Street-11", 5 } ) // Paris AADD( aDim, { 7,"Street-1" , 6 } ) // Berlin AADD( aDim, { 8,"Street-2" , 6 } ) // Berlin AADD( aDim, { 9,"Street-3" , 6 } ) // Berlin AADD( aDim, {12,"Street-0" , 7 } ) // Vena AADD( aDim, {14,"Street-5" , 7 } ) // Vena FOR nI := 1 TO LEN(aStreet) AADD( aStreet, HB_NtoS(aDim[nI,1])+" | "+aDim[nI,2]+" | "+HB_NtoS(aDim[nI,3]) ) NEXT DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 400 ; HEIGHT 300 ; TITLE 'ComboBox Demo 2x' ; MAIN ; FONT 'Courier New' SIZE 16 @ 20,40 COMBOBOX Control_1 ; WIDTH 280 ; ITEMS aCity ; VALUE 1 ; LOWERCASE ; ON CHANGE { || nCity := Form_1.Control_1.Value ,; UpdateCombo2( 'Control_2', 'Form_1', nCity, aDim, @aStreet ) } @ 80,40 COMBOBOX Control_2 ; WIDTH 280 ; ITEMS aStreet ; VALUE 1 ; LOWERCASE ON CHANGE {|| nStreet := Form_1.Control_2.Value } DEFINE BUTTON Button_Exit ROW 200 COL 200 WIDTH 140 CAPTION 'Exit' VALUE 1 ACTION {|| MsgDebug("City=",nCity," Street=",nStreet), ThisWindow.Release } END BUTTON END WINDOW //Form_1.Control_1.SetArray( aStreet ) CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil // Local array Function UpdateCombo2( Control, Parent, nCity, aDim, aStreet ) Local nI aStreet := {} // обнуляем массив улиц For nI := 1 TO LEN(aDim) If aDim[nI,3] == nCity AADD( aStreet, HB_NtoS(aDim[nI,1])+" | "+aDim[nI,2]+" | "+HB_NtoS(aDim[nI,3]) ) Endif Next DoMethod( Parent, Control, 'SetArray', aStreet ) Return Nil P.S. Собирал новой версией 1604.

Haz: Andrey пишет: Вот примерно так, но у меня не получилось Потому что в функции UpdateCombo2() сравниваешь теплое с мягким ( If aDim[nI,3] == nCity ) и результирующий массив будет всегда пуст



полная версия страницы