0
Answered
Как получить ссылку на кнопку в списке?
Создаю список методом IR.ITEM_LISTBOX, заполняю его кнопками - выключателями релюх на AMX. Мне нужно при создании списка проверить какие реле включены и включить кнопки в списке. Как это правильно сделать? Я пытался изменять свойство Value у создаваемых кнопок (по аналогии с Text и Image), но генерируется ошибка. А как создать и поставить ссылку на кнопку в глобальный слушатель, не могу понять. Помогите, пожалуйста. Вот мой код:
var testPopup = "Баня";
var Switches = ["Вход","Душ","Пещера Потолок","Купель Патио","Купель Щит и Люстра","Батареи и Потолок","Пещера Люстра"];
IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value)
{
IR.Log("Global Listener Activated: " + name + "\tValue: " + value);
//Как получить сюда ссылку на кнопку из списка и присвоить ее полю Value значение Value слушателя?
});
// оформляем подписку на изменения каналов драйвера
for (var i = 0; i < Switches.length; i++) {
IR.SubscribeTagChange("Drivers.amx."+Switches[i]);
};
IR.AddListener(IR.EVENT_START,0,function()
{
MakePanelID();
InitController();
NewPopup (testPopup);
IR.ShowPopup(testPopup)
// Создаем список и заполняем его
IR.GetItem(testPopup).CreateItem(IR.ITEM_LISTBOX,"Выключатели",0,0,750,1344);
test_list = IR.GetItem(testPopup).GetItem("Выключатели");
test_list.Template = "Шаблон Списка Выключателей";
for (var i = 0; i < Switches.length; i++) {
// или как здесь получить и указать значение GetFeedback из канала, соответствующего кнопке
test_list.CreateItem(i, 1,{Text: Switches[i]});
};
//При изменении выключателя, включаем или выключаем кнопку в AMX
IR.AddListener(IR.EVENT_LIST_ITEM_CHANGE, test_list, function(Item, Subitem, TypeEvent, object){
var tempnum = TypeEvent;
if(tempnum==12) {
amx.Set(Switches[Item],1);
amx.Set(Switches[Item],0);
Log(amx.GetFeedback(Switches[Item]));
object.Value = !amx.GetFeedback(Switches[Item]);
};
});
});
Customer support service by UserEcho
Здравствуйте!
Для того чтобы записать какое -либо значение в определенный элемент на листе необходимо использовать такой же синтаксис как и при создании элемента.
Т.е.
test_list.CreateItem(i, 1,{Text: Switches[i], Value: val});И если элемент уже создан, то указанный метод просто поменяет значение указанного параметра элемента.
Попробуйте использовать такой скрипт
var testPopup = "Баня"; var Switches = ["Вход","Душ","Пещера Потолок","Купель Патио","Купель Щит и Люстра","Батареи и Потолок","Пещера Люстра"]; IR.AddListener(IR.EVENT_START,0,function() { MakePanelID(); InitController(); NewPopup (testPopup); IR.ShowPopup(testPopup) // Создаем список и заполняем его IR.GetItem(testPopup).CreateItem(IR.ITEM_LISTBOX,"Выключатели",0,0,750,1344); test_list = IR.GetItem(testPopup).GetItem("Выключатели"); test_list.Template = "Шаблон Списка Выключателей"; for (var i = 0; i < Switches.length; i++) { // или как здесь получить и указать значение GetFeedback из канала, соответствующего кнопке var val = IR.GetDevice("amx").GetFeedback("Channel " + i); test_list.CreateItem(i, 1,{Text: Switches[i], Value: val}); }; IR.SetGlobalListener(IR.EVENT_GLOBAL_TAG_CHANGE, function(name, value) { IR.Log("Global Listener Activated: " + name + "\tValue: " + value); //Как получить сюда ссылку на кнопку из списка и присвоить ее полю Value значение Value слушателя? test_list.CreateItem(i, 1,{Text: Switches[i], Value: val}); }); // оформляем подписку на изменения каналов драйвера for (var i = 0; i < Switches.length; i++) { IR.SubscribeTagChange("Drivers.amx."+Switches[i]); }; //При изменении выключателя, включаем или выключаем кнопку в AMX IR.AddListener(IR.EVENT_LIST_ITEM_CHANGE, test_list, function(Item, Subitem, TypeEvent, object){ var tempnum = TypeEvent; if(tempnum==12) { amx.Set(Switches[Item],1); amx.Set(Switches[Item],0); Log(amx.GetFeedback(Switches[Item])); object.Value = !amx.GetFeedback(Switches[Item]); }; }); });В итоге заработал несколько видоизмененный скрипт. Переменная i в глобальном слушателе в Вашем варианте всегда равна длине массива. Я добавил к названиям кнопок номера и потом вычленял их. Решение работает, но несколько туповатое. Нет ли более изящного варианта? Вот итоговый скрипт:
Я использую "глобальный" массив типа
В глобальном слушателе идет проверка
Элементами массива являются ссылки на объекты с необходимыми функциями
инициализация вида
buttons[1]=new BtnElement({Txt: "Вход", Color: 1, Port: 1, Channel: 123); var BtnElement = function(o) { this.Name=o.Txt; this.Color=o.Color; this.Object=test_list.CreateItem( .. //Clone( .. events[o.Port][o.Channel]=this; //events[o.Port] === Array IR.AddListener(IR.EVENT_ITEM_PRESS, this.Object, this.Do, this); }; //BtnElement.constructor = function1 BtnElement.prototype.Event = function(value) { this.Object.Text = (value) ? "Yes" : "No"; ... }; BtnElement.prototype.Do = function() { this.Object.Text="Yepp!"; this.OtherObject.Color=this.Color; ... };В вашем примере для массива наверно можно использовать индексы Item, Subitem