PDA

Просмотр полной версии : ComboBox как "input"-поле: как корректно удалить из списка значение


Seroy
16.11.2009, 07:05
всем бодрого времени.

уже который день бьюсь над задачкой:

есть компонент ComboBox. Он editable, т.е. доступный для редактирования пользователем, в него вводятся значения (добавляются - нажатием кнопки Add), сортируются по алфавиту и удаляются - при пом. кнопки "Remove".

Код конечно не прелесть (особенно в части валидации ввода: :confused:), но все вроде работает, кроме одного... Никак не могу добиться, чтобы удалялось именно выбранное в списке значение, а не последнее в списке.

привожу код и прикрепляю файлы (может, кто увидит, в чем огрех):


my_cb.move(10, 10);
clear_button.move(120, 10);
add_button.move(10, 45);
my_cb.editable="true";// сам компонент
imy_cb=0; // переменная - индекс значений списка
icb_val='----'; // переменная - значения списка
// Create dataprovider.
var myDP_array:Array = new Array();
myDP_array.push({data:imy_cb, label:icb_val});
//myDP_array.push({data:2, label:"Second Item"});

my_cb.dataProvider = myDP_array;

// Define event listener object.
/*var clearListener:Object = new Object();
clearListener.click = function(evt1_obj:Object){
for(j=0; j<q1m; j++){
var leo:String=j+"\n"+_root.my_cb.text;
if(leo==_global.yak){
_root.imy_cb=j;
_root.my_cb.removeItemAt(_root.imy_cb);
_root.imy_cb--;
trace("fe");
}
}
trace(imy_cb);
trace(j);
trace(leo);
trace(yak);
_root.my_cb.sortItems(upperCaseFunc);
}*/


// Define event listener object. Функция удаления значения из списка
var clearListener:Object = new Object();
clearListener.click = function(evt1_obj:Object){
if(icb_val<>'----'){
my_cb.removeItemAt(imy_cb);
imy_cb-=1;
my_cb.sortItems(upperCaseFunc);
}
trace(imy_cb);
}

// Add Listener.
clear_button.addEventListener("click", clearListener);

// сортировка массива
my_cb.sortItems(upperCaseFunc);
function upperCaseFunc(a, b){
return a.label.toUpperCase() > b.label.toUpperCase();
}

function add_button_clicked() {

_global.piu=1;
// допустимый первый символ ввода
if((my_cb.text!= '')&&(icb_val<> undefined)&&((my_cb.text.charAt(0)== 'А')||(my_cb.text.charAt(0)== 'а')||(my_cb.text.charAt(0)== 'Б')||(my_cb.text.charAt(0)== 'б')||(my_cb.text.charAt(0)== 'В')||(my_cb.text.charAt(0)== 'в')||(my_cb.text.charAt(0)== 'Г')||(my_cb.text.charAt(0)== 'г')||(my_cb.text.charAt(0)== 'Д')||(my_cb.text.charAt(0)== 'д')||(my_cb.text.charAt(0)== 'Е')||(my_cb.text.charAt(0)== 'е')||(my_cb.text.charAt(0)== 'Ё')||(my_cb.text.charAt(0)== 'ё')||(my_cb.text.charAt(0)== 'Ж')||(my_cb.text.charAt(0)== 'ж')||(my_cb.text.charAt(0)== 'З')||(my_cb.text.charAt(0)== 'з')||(my_cb.text.charAt(0)== 'И')||(my_cb.text.charAt(0)== 'и')||(my_cb.text.charAt(0)== 'Й')||(my_cb.text.charAt(0)== 'й')||(my_cb.text.charAt(0)== 'К')||(my_cb.text.charAt(0)== 'к')||(my_cb.text.charAt(0)== 'Л')||(my_cb.text.charAt(0)== 'л')||(my_cb.text.charAt(0)== 'М')||(my_cb.text.charAt(0)== 'м')||(my_cb.text.charAt(0)== 'Н')||(my_cb.text.charAt(0)== 'н')||(my_cb.text.charAt(0)== 'О')||(my_cb.text.charAt(0)== 'о')||(my_cb.text.charAt(0)== 'П')||(my_cb.text.charAt(0)== 'п')||(my_cb.text.charAt(0)== 'Р')||(my_cb.text.charAt(0)== 'р')||(my_cb.text.charAt(0)== 'С')||(my_cb.text.charAt(0)== 'с')||(my_cb.text.charAt(0)== 'Т')||(my_cb.text.charAt(0)== 'т')||(my_cb.text.charAt(0)== 'У')||(my_cb.text.charAt(0)== 'у')||(my_cb.text.charAt(0)== 'Ф')||(my_cb.text.charAt(0)== 'ф')||(my_cb.text.charAt(0)== 'Х')||(my_cb.text.charAt(0)== 'х')||(my_cb.text.charAt(0)== 'Ц')||(my_cb.text.charAt(0)== 'ц')||(my_cb.text.charAt(0)== 'Ч')||(my_cb.text.charAt(0)== 'ч')||(my_cb.text.charAt(0)== 'Ш')||(my_cb.text.charAt(0)== 'ш')||(my_cb.text.charAt(0)== 'Щ')||(my_cb.text.charAt(0)== 'щ')||(my_cb.text.charAt(0)== 'Ы')||(my_cb.text.charAt(0)== 'ы')||(my_cb.text.charAt(0)== 'Э')||(my_cb.text.charAt(0)== 'э')||(my_cb.text.charAt(0)== 'Ю')||(my_cb.text.charAt(0)== 'ю')||(my_cb.text.charAt(0)== 'Я')||(my_cb.text.charAt(0)== 'я'))){
imy_cb+=1;
my_cb.addItem({data:imy_cb, label:icb_val});
// сортировка массива
my_cb.sortItems(upperCaseFunc);
}


//trace(my_cb.text);
}

add_button.addEventListener("click", add_button_clicked);
// трассировка выделения значения из списка
var cbListener:Object = new Object();
cbListener.change = function(evt_obj:Object) {
var item_obj:Object = my_cb.selectedItem;
var ij:String;
for (ij in item_obj) {
//trace(item_obj[ij]);
_global.yak=item_obj[ij];
}
trace(imy_cb);
};
my_cb.addEventListener("change", cbListener);

this.onEnterFrame=function(){

icb_val= my_cb.text;
my_cb.restrict="a-zA-Z\\'\\,\\.\\А-Яа-я\u0020\u0401\u0451"; // допустимые символы в поле
q1m= my_cb.length; // кол-во значений в списке

}

alexcon314
16.11.2009, 09:24
1. непонятно зачем вам onEnterFrame.
2. километровой длины условие if() меня сильно огорчило.
3. исходник выложен в формате CS4, не смог его открыть, у меня восьмой флэш.
4. а теперь по существу. вы удаляете итем c номером imy_cb, так? эта переменная у вас встречается в коде еще: вначале, где вы присваиваете ей значение 0, в обработчике add_button_clicked(), где вы евеличиваете ее на единицу. у меня сложилось впечатление, что эта переменная у вас всегда равна номеру последнего добавленного итема. в обработчике change вам нужно было просто написать imy_cb=my_cb.selectedIndex и все. или вообще сделать так my_cb.removeItemAt(my_cb.selectedIndex);

Seroy
16.11.2009, 10:54
1. непонятно зачем вам onEnterFrame.
2. километровой длины условие if() меня сильно огорчило.
3. исходник выложен в формате CS4, не смог его открыть, у меня восьмой флэш.
4. а теперь по существу. вы удаляете итем c номером imy_cb, так? эта переменная у вас встречается в коде еще: вначале, где вы присваиваете ей значение 0, в обработчике add_button_clicked(), где вы евеличиваете ее на единицу. у меня сложилось впечатление, что эта переменная у вас всегда равна номеру последнего добавленного итема. в обработчике change вам нужно было просто написать imy_cb=my_cb.selectedIndex и все. или вообще сделать так my_cb.removeItemAt(my_cb.selectedIndex);

Млин) спасибище вам огромное. Уже не знал, чего делать. На буржуйском форуме (адобовском) выложил вопрос - и ни лешего не ответили. А тут - за 3 часа готов ответ.

1) по поводу onEnterFrame - действительно, в сущности не нужно. Спасибо :)
2) по поводу условия - я так и сяк бился - решил, что вроде бы в AS 2 нет регулярных выражений, а restrict - только для поля годится (не получилось с ним никак для одного символа). Был бы весьма признателен, если б вы подсказали, как тут можно разрулить потолковей. :rolleyes:

alexcon314
16.11.2009, 11:28
ограничить набор вводимых символов в поле комбобокса можно так:
my_cb.text_mc.restrict = "А-Я\\а-я";
ну, или что вам там нужно.
ЗЫ
На буржуйском форуме (адобовском) выложил вопрос - и ни лешего не ответили. А тут - за 3 часа готов ответ.
flasher.ru - лучший!:D

Seroy
16.11.2009, 11:55
ограничить набор вводимых символов в поле комбобокса можно так:
my_cb.text_mc.restrict = "А-Я\\а-я";
ну, или что вам там нужно.
ЗЫ

flasher.ru - лучший!:D

для поля-то есть - ЗЫ:
my_cb.restrict="a-zA-Z\\'\\,\\.\\А-Яа-я\u0020\u0401\u0451";

Нужно было в особинку - для первого символа поля (чтобы апостроф или дефис не ввели). Но вся равно - пасибо) :)