Vasya Posted April 25, 2010 Share Posted April 25, 2010 Есть код, что-то типа такого: Code: function Init() infoLineChild = mainForm:GetChildChecked( "InfoLine", false ) for i = 1, maxLines do infoList [ i ] = mainForm:CreateWidgetByDesc( infoLineChild:GetWidgetDesc() ) end end ... function printList() for i = 1, maxLines do local widget = infoList [ i ] local id = idList [ i ] if id ~= nil then widget:Show( true ) widget:SetVal( "value", object.GetName( id )) -- [[ local fromPlacement = widget:GetPlacementPlain() local toPlacement = widget:GetPlacementPlain() fromPlacement.posX = textPosX fromPlacement.posY = textPosY toPlacement.posX = textPosX toPlacement.posY = textPosY + (i - 1) * 40 widget:SetPlacementPlain( toPlacement ) ] ] else widget:Show ( false ) end end end Если запускать так, как написано, то при выводе нескольких строк текста они, разумеется. накладываются друг на друга. Если раскомментировать SetPlacementPlain, то не показывается вообще ничего, ни одной строки. При этом всяческие placement.posX, posY, GetRealRect, IsVisible и т.д. говорят, что всё хорошо. Подскажите, пожалуйста, как же их правильно двигать? Quote Link to comment Share on other sites More sharing options...
SLA Posted April 26, 2010 Share Posted April 26, 2010 По-моему, всё должно работать, если раскомментировать SetPlacementPlain(). Кроме одной детали Ты создаёшь виджеты, и они являются дочерними элементами хз чего (возможно, mainForm, не знаю, не пробовал). А все виджеты позиционируются всегда относительно своего материнского виджета. Т.е. думаю, все твои виджеты реально существуют, НО где-то за пределами панели, на которой они должны были быть. Они, кстати, "обрезаются", если их координаты где-то за пределами размера материнского виджета. Поэтому, их и не видно. В общем, сразу после CreateWidgetByDesc(), нужно объявить каждому виджету, что у него есть мама: Code: МатеринскийВиджет:AddChild( infoList [ i ] ) Эта новость делает виджетов счастливыми Quote Link to comment Share on other sites More sharing options...
Vasya Posted April 26, 2010 Author Share Posted April 26, 2010 К сожалению, не сработало. Я смотрю в качестве примера на ShowDD - там, как я понял, делается примерно то что мне нужно. Там в xdb файле главной формы описан каждый тип строки по одному разу, а в коде создается список строк, на каждую позицию которого создаются по одному варианту текста. там AddChild нет, но всё равно всё работает. Quote Link to comment Share on other sites More sharing options...
SLA Posted April 26, 2010 Share Posted April 26, 2010 Загляни ещё в аддоны Minimap и DarkDPSMeter, они тоже динамично создают виджеты. Может что не так с изначальными значением fromPlacement после выполнения local toPlacement = widget:GetPlacementPlain() ? Это должна быть структура, заполненная несколькими переменными (там не только posX и posY). Или может, что-то не так с константами textPosX и textPosY ? Их нужно бы скинуть в лог-файл, и посмотреть, что там внутри. Возможно также, что проблема кроется не в LUA-скрипте, а в XDB-файлах. Кстати, в аддоне DarkDPSMeter используется библиотека классов, которую написал DarkMaster, может заинтересует, она обсуждается в теме AOClassLibrary.lua - бибилотека классов. (Ещё, в той теме есть функция LogInfoTable(), скидывающая структуру в лог-файл - пригодится для дебаггинга структуры fromPlacement). Quote Link to comment Share on other sites More sharing options...
Vasya Posted April 26, 2010 Author Share Posted April 26, 2010 Сейчас попробовал еще раз - из Init() всё заработало. Из второй функции - не работало. Она вызывалась из обработчика ивента. Странно как-то. Но всё равно, спасибо огромное за подсказки. Quote Link to comment Share on other sites More sharing options...
Recommended Posts