Flaker Posted March 24, 2012 Share Posted March 24, 2012 Вот пытаюсь сделать информационную панель, информацию в которой можно менять через XML. Суть: Создаю gridList с пунктами, при нажатии на пункт, изменяется Label, в котором текст из XML. Названия пунктов, тоже из XML. Полный код: addCommandHandler ( "fo", function ( thePlayer ) if not(isElement (wdwIndfo)) then GUIEditor_Window = {} GUIEditor_Label = {} GUIEditor_Grid = {} GUIEditor_Window[1] = guiCreateWindow(199,106,659,561,"TITLE",false) --Создается окно GUIEditor_Grid[1] = guiCreateGridList(10,27,256,520,false,GUIEditor_Window[1]) --Создается Гридлист guiGridListSetSelectionMode(GUIEditor_Grid[1],2) guiGridListAddColumn(GUIEditor_Grid[1],"",0.2) local xml = xmlLoadFile("settings.xml") --получаем XML файл if xml then for i,group in ipairs(xmlNodeGetChildren(xml)) do --Получаем из XML пункты local row = guiGridListAddRow(GUIEditor_Grid[1]) local name = xmlNodeGetAttribute(group,"name") --Имя ROW записанов в (XML) guiGridListSetItemText(GUIEditor_Grid[1],i,1,name,false, false) end xmlUnloadFile(xml) end GUIEditor_Label[1] = guiCreateLabel(295,45,329,469,"Info",false,GUIEditor_Window[1]) guiLabelSetHorizontalAlign(GUIEditor_Label[1],"left",true) else destroyElement (wdwIndfo) end end ) XML файл "Main"> Welcome to the deathmatch server, enjoy your stay. Непонимаю как вобще for i,group in ipairs(xmlNodeGetChildren(xml)) do работает. ROW вобще не появляется. p.s. дебагер ничего не выдает(( Подскажите как исправить? Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 guiGridListSetItemText(GUIEditor_Grid[1],row,1,name,false, false) Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 К сожалению не показывает текста всеравно( Дебагер по прежнему не выдает информации об ошибках Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 ну надо проверять, работает ли вообще скрипт, грузится ли хмл-файл, сколько нодов получено функцией и т.д. и т.п. на один дебагскрипт полагаться нельзя, самому надо дебажить иногда. Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 В рез-те проверке выяснилось что XML не грузиться, в чем может быть ошибка загрузки XML файла? способ загрузки: local xml = xmlLoadFile("settings.xml") --получаем XML файл способ проверки, загрузился ли файл: if xml then ... else outputChatBox ("XML не грузиться") end Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 в meta.xml он добавлен как клиентский? Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 Ой, про добавление не знал. (Первый раз пробую с XML работать) Добавлять так: ? Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 XML это не скрипт: -- все, что - грузится в клиент или Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 Вроде подключил. Теперь проявил себя Debuger: http://rghost.ru/37195742/image.png Я исправил это так: guiGridListSetItemText(GUIEditor_Grid[1],row,1,tostring(name),false, false) После этого, прогресс дошел до того, что в Гридлисте появился ROW: false (как видно на скрине) Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 это весь XML? если да, то: в XML должен быть корневой нод, который возвращается функцией xmlLoadFile() т.к. тут его нет, корневым считается , потому xmlNodeGetChildren() возвращает нод , у которого нет атрибута "name". отсюда false. формат вот такой должен быть: <settings> <group name="Main"> <text>Welcome to the deathmatch server, enjoy your stay.</text> </group> <group name="Other"> <text>Bla-bla-bla.</text> </group> </settings> Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 Огромное спасибо за объяснения, Aibo! Все получилось Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 А не подскажешь теперь, как в label вывести информацию из , причем для каждого item'а свою? function item_choose() if (isElement (wdwIndfo)) then if source == GUIEditor_Grid[1] then --Как сделать проверку какой item выбран? --В зависимости от того какой выпран item, такой должен быть текст [b]lblTEXT[/b] local lblTEXT = guiCreateLabel(295,45,329,469,"OOK",false,wdwIndfo) guiLabelSetHorizontalAlign(lblTEXT,"left",true) end end end end addEventHandler ("onClientGUIClick", getRootElement(), stylechoose) Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 addCommandHandler ( "fo", function ( thePlayer ) if not(isElement (wdwIndfo)) then GUIEditor_Window = {} GUIEditor_Label = {} GUIEditor_Grid = {} GUIEditor_Window[1] = guiCreateWindow(199,106,659,561,"TITLE",false) GUIEditor_Grid[1] = guiCreateGridList(10,27,256,520,false,GUIEditor_Window[1]) guiGridListSetSelectionMode(GUIEditor_Grid[1],2) guiGridListAddColumn(GUIEditor_Grid[1],"",0.2) GUIEditor_Label[1] = guiCreateLabel(295,45,329,469,"Info",false,GUIEditor_Window[1]) guiLabelSetHorizontalAlign(GUIEditor_Label[1],"left",true) local xml = xmlLoadFile("settings.xml") if xml then for i,group in ipairs(xmlNodeGetChildren(xml)) do local row = guiGridListAddRow(GUIEditor_Grid[1]) local name = xmlNodeGetAttribute(group,"name") guiGridListSetItemText(GUIEditor_Grid[1],row,1,name,false, false) local data = xmlNodeGetValue(xmlNodeGetChildren(group,0)) -- получаем данные из дочернего нода guiGridListSetItemData(GUIEditor_Grid[1],row,1, data) -- сохраняем в данных итема end xmlUnloadFile(xml) end else destroyElement (wdwIndfo) end end ) function item_choose() if isElement(wdwIndfo) then if source == GUIEditor_Grid[1] then local row, column = guiGridListGetSelectedItem ( GUIEditor_Grid[1] ) -- определяем выбранный элемент local data = guiGridListGetItemData ( GUIEditor_Grid[1], row, column ) -- получаем хранящиеся там данные guiSetText(GUIEditor_Label[1], data or 'No info') -- отправляем их в лейбл end end end addEventHandler ("onClientGUIClick", root, item_choose) как-то так. Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 Я вот добавил TITLE, но почему то его текст не отличается от text. Вот XML теперь: "Main"> Main information. Welcome to the deathmatch server, enjoy your stay. "Other"> Second information. Bla-bla-bla. Добавил в "for i,group in ipairs(xmlNodeGetChildren(xml)) do" : local title = xmlNodeGetValue(xmlNodeGetChildren(group,1)) -- получаем данные из дочернего нода guiGridListSetItemData(GUIEditor_Grid[1],row,1, title) -- сохраняем в данных итема 1)(xmlNodeGetChildren(group,0)) изменил на (xmlNodeGetChildren(group,1)) -- 2) Добавил при клике на gridList: local title = guiGridListGetItemData ( GUIEditor_Grid[1], row, column ) -- получаем хранящиеся там данные guiSetText(lblTitle, title or 'Information about server') -- отправляем их в лейбл Но и в TITLE и в TEXT одно и тоже отображается. Link to comment
Aibo Posted March 24, 2012 Share Posted March 24, 2012 это потому, что в guiGridListSetItemData можно хранить только 1 строку данных в 1 ячейке. Link to comment
Flaker Posted March 24, 2012 Author Share Posted March 24, 2012 Как тогда возможно получить TITLE из XML? Link to comment
Aibo Posted March 25, 2012 Share Posted March 25, 2012 можно 2 значения хранить в 1 строке, используя, например: 1. JSON 2. разделить строки + split() 3. loadstring() Link to comment
Flaker Posted March 25, 2012 Author Share Posted March 25, 2012 можно 2 значения хранить в 1 строке, используя, например: 1. JSON 2. разделить строки + split() 3. loadstring() А можно примерчик какой нибудь? Link to comment
Aibo Posted March 25, 2012 Share Posted March 25, 2012 local title = xmlNodeGetValue(xmlFindChild(group,'title', 0)) -- получаем данные из дочернего нода local text = xmlNodeGetValue(xmlFindChild(group,'text', 0)) -- получаем данные из дочернего нода guiGridListSetItemData(GUIEditor_Grid[1], row, 1, toJSON({title, text})) -- сохраняем в данных итема используя JSON-массив -- далее, в хендлере клика: local data = fromJSON(guiGridListGetItemData ( GUIEditor_Grid[1], row, column )) -- получаем/парсим JSON guiSetText(lblTitle, data[1] or 'No title') -- отправляем title в лейбл guiSetText(GUIEditor_Label[1], data[2] or 'No text') -- отправляем text в лейбл Link to comment
Flaker Posted March 25, 2012 Author Share Posted March 25, 2012 Спасибо) Все заработало отлично) Но теперь проблема с русским текстом: Оригинальный текст вставленный в показанный выше label: Welcome to the deathmatch server, enjoy your stay. Этот сервер только только для руских. Соблюдайте основные правила сервера. XML(settings.xml) файла кодировка: ANSI Скрипт файл (Клиент) кодировка: ANSI Link to comment
Scripting Moderators Sarrum Posted March 25, 2012 Scripting Moderators Share Posted March 25, 2012 (edited) Кодировка должна быть UTF-8, желательно без BOM. Edited March 30, 2012 by Guest Link to comment
Flaker Posted March 25, 2012 Author Share Posted March 25, 2012 Спасибо) Перекодировал, все работает) Link to comment
_Vincent_ Posted March 29, 2012 Share Posted March 29, 2012 Кодировка должна быть UTF-8, желательно без BOOM. Да не бум, а BOM Не хотел оффтопить, но уже второй раз ошибку вижу. Link to comment
Other Languages Moderators Disinterpreter Posted March 30, 2012 Other Languages Moderators Share Posted March 30, 2012 Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now