Jump to content

Как получить текст "guiGridListSetItemText" из XML.


Recommended Posts

Вот пытаюсь сделать информационную панель, информацию в которой можно менять через 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

ну надо проверять, работает ли вообще скрипт, грузится ли хмл-файл, сколько нодов получено функцией и т.д. и т.п.

на один дебагскрипт полагаться нельзя, самому надо дебажить иногда.

Link to comment

В рез-те проверке выяснилось что XML не грузиться, в чем может быть ошибка загрузки XML файла?

способ загрузки: local xml = xmlLoadFile("settings.xml") --получаем XML файл

способ проверки, загрузился ли файл: if xml then ... else outputChatBox ("XML не грузиться") end

Link to comment

это весь 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

А не подскажешь теперь, как в 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
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

Я вот добавил 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
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

Спасибо) Все заработало отлично)

Но теперь проблема с русским текстом:

image.png

Оригинальный текст вставленный в показанный выше label: Welcome to the deathmatch server, enjoy your stay. Этот сервер только только для руских. Соблюдайте основные правила сервера.

XML(settings.xml) файла кодировка: ANSI

Скрипт файл (Клиент) кодировка: ANSI

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...