Подскажите, пожалуйста, как можно организовать диалог из программы Lua, например организовать запрос с выводом в окно на экран и ожидать ответа из соответствующего поля в этом же окне и в зависимости от ответа продолжить выполнение программы, вообще в Lua возможно организовать чтение вводимых данных с консоли ?
Для реализации диалогов и окон мы пробовали использовать библиотеку iplua. Только интерфейс при этом тормозит из-за особенностей многопоточности в QLua в нашей конкретной реализации.
Ещё можно использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши. Костыльный вариант, но иногда подходит.
А если вас устроит писать не только на луа, можно написать свою dll с интерфейсом. В этом случае можно уже практически любые визуальные библиотеки использовать.
Ещё можно использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши. Костыльный вариант, но иногда подходит.
Если можно хотя бы приблизительный пример, что именно подразумевается под "использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши " какие именно "обычные таблицы" и можно ли использовать клавишу ввод , а не мышь ?
Примеры можно увидеть в "Руководстве пользователя QLua". Там в приложении 3 приводятся примеры обработки событий для таблиц. Дальше всё зависит только от вашей фантазии.
Конкретно мы у себя сделали интерактивное изменение размера капитала, выделяемого торговой системе. Двойной щелчок левой кнопкой мыши на ячейке таблицы уменьшает капитал на 10%, а то же самое правой кнопкой мыши -- увеличивает на 10%.
Код
--
-- Таблица для управления долей капитала, которую разрешается использовать торговой системе.
--
local AmountPercentTable = {}
--- Конструктор.
-- @param self объект
-- @param accountSecurityPositions объект, хранящий данные о позициях
-- @param step шаг изменения величины, задающей процент использования капитала
local function new(self, accountSecurityPositions, step)
local tableId = AllocTable()
local table = {
tableId = tableId,
accountSecurityPositions = accountSecurityPositions,
step = step,
}
setmetatable(table, self)
self.__index = self
AddColumn(tableId, 1, "Счёт", true, QTABLE_CACHED_STRING_TYPE, 15)
AddColumn(tableId, 2, "Объём", true, QTABLE_DOUBLE_TYPE, 15)
AddColumn(tableId, 3, "Процент", true, QTABLE_DOUBLE_TYPE, 10)
SetTableNotificationCallback(tableId, function(tId, msg, rowId, colId)
if tableId ~= tId then
return
end
if msg == QTABLE_LBUTTONDBLCLK and colId == 3 then
local account = GetCell(tableId, rowId, 1).image
local percent = table.accountSecurityPositions[account].percent
percent = percent - step
if percent < 0 then
percent = 0
end
table.accountSecurityPositions[account].percent = percent
SetCell(tableId, rowId, colId, tostring(percent), percent)
end
if msg == QTABLE_RBUTTONDBLCLK and colId == 3 then
local account = GetCell(tableId, rowId, 1).image
local percent = table.accountSecurityPositions[account].percent
percent = percent + step
if percent > 100 then
percent = 100
end
table.accountSecurityPositions[account].percent = percent
SetCell(tableId, rowId, colId, tostring(percent), percent)
end
end)
return table
end
AmountPercentTable.new = new
--- Закрыть окно монитора позиций и удалить все его данные.
-- @param self объект
local function delete(self)
DestroyTable(self.tableId)
self.tableId = nil
self.accountSecurityPositions = nil
self.step = nil
end
AmountPercentTable.delete = delete
local function show(self, caption, windowPosition)
local tId = self.tableId
if IsWindowClosed(tId) then
CreateWindow(tId)
if type(windowPosition) == "table" then
local x, y, dx, dy = windowPosition.x, windowPosition.y, windowPosition.dx, windowPosition.dy
if x and y and dx and dy then
SetWindowPos(tId, x, y, dx, dy)
end
end
end
SetWindowCaption(tId, caption)
local rows = {}
local rowCount = 0
for account, securityPositions in pairs(self.accountSecurityPositions) do
rowCount = rowCount + 1
rows[rowCount] = {
account = account,
amount = securityPositions.amount,
percent = securityPositions.percent,
}
end
table.sort(rows, function(row1, row2) return row1.account < row2.account end)
local tableRows = GetTableSize(tId) or 0
local shouldAddRows = false
if tableRows ~= rowCount then
for i = tableRows, 1, -1 do
DeleteRow(tId, i)
end
shouldAddRows = true
end
for i = 1, rowCount do
if shouldAddRows then
InsertRow(tId, -1)
end
local row = rows[i]
SetCell(tId, i, 1, row.account)
SetCell(tId, i, 2, tostring(row.amount), row.amount)
SetCell(tId, i, 3, tostring(row.percent), row.percent)
end
end
AmountPercentTable.show = show
return AmountPercentTable
s_mike@rambler.ru написал: Обработчики событий пользовательских таблиц работают не в потоке main. В общем случае так делать не стоит.
Спасибо, попробую разобраться. Т.е. если я правильно понял средствами QLua невозможно вывести окно, как например в Java, в котором будут например две кнопки "Да" и "Нет" и проанализировать какая из них нажата ?
Юрий С написал: Т.е. если я правильно понял средствами QLua невозможно вывести окно, как например в Java, в котором будут например две кнопки "Да" и "Нет" и проанализировать какая из них нажата ?
Да можно, конечно. Вот же
Цитата
_sk_ написал: Для реализации диалогов и окон мы пробовали использовать библиотеку iplua. Только интерфейс при этом тормозит из-за особенностей многопоточности в QLua в нашей конкретной реализации.
Только библиотека называется iup.
Код
require("iuplua")
require("iupluacontrols")
local iup = iup
local function initializeDialog()
local btn_addSec = iup.button { title = "Add security" }
function btn_addSec:action()
iup.Message(config.name, self.title..":action()")
end
local vbox = iup.vbox{
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
iup.button{ rastersize = "700x100", title = "1", },
btn_addSec
;margin="5x5", gap="2", scrollbar = "VERTICAL",
}
local dlg = iup.dialog{ vbox; title = config.name,
--size = "HALFxQUARTER",
rastersize = "800x300",
}
function dlg:close_cb()
local a = iup.Alarm( dlg.title, "Завершить работу?", "Да", "Нет" )
if a == 1 then
interrupted = true
return iup.CLOSE
else
return iup.IGNORE
end
end
return dlg
end
function main()
local dlg = initializeDialog()
dlg:show()
while not interrupted do
iup.LoopStep()
sleep(50)
end
dlg:hide()
dlg:destroy()
end
vgi написал: iup входит в стандартную LuaForWindows 5.1.4.0
Подскажите, плиз, где скачать LuaForWindows 5.1.4.0 и как установить его в квике, насколько я понял луа в квике встроенный , у меня установлен квик версии 7.18.1.20, но он на iup ругается не видит модули ?
vgi написал: iup входит в стандартную LuaForWindows 5.1.4.0
Подскажите, плиз, где скачать LuaForWindows 5.1.4.0 и как установить его в квике, насколько я понял луа в квике встроенный , у меня установлен квик версии 7.18.1.20, но он на iup ругается не видит модули ?
Скачиваете, устанавливаете. В скрипте не забудьте добавить путь к LuaForWindows в package.path. Захочется добавить в окошки что-то поинтереснее - документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.
vgi написал: iup входит в стандартную LuaForWindows 5.1.4.0
Подскажите, плиз, где скачать LuaForWindows 5.1.4.0 и как установить его в квике, насколько я понял луа в квике встроенный , у меня установлен квик версии 7.18.1.20, но он на iup ругается не видит модули ?
Скачиваете, устанавливаете. В скрипте не забудьте добавить путь к LuaForWindows в package.path. Захочется добавить в окошки что-то поинтереснее - документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.
-- Begin programm -------------------------------------------------------------------------------------- package.path = package.path .. ";C:/Program Files/Lua/5.1/lua/?.lua" package.preload["iuplua"] -------------------------------------------------------------------------------------- require("iuplua") require("iupluacontrols") local iup = iup
local function initializeDialog() .............................. выдает ошибку: Syntax error while compiling D:\Program_Lua\Events_iup_1.lua: D:\Program_Lua\Events_iup_1.lua:6: '=' expected near 'require'
s_mike@rambler.ru написал: Устанавливайте package.cpath а не package.path
К сожалению, то же самое : -- Begin programm -------------------------------------------------------------------------------------- package.cpath = package.cpath .. ";C:/Program Files/Lua/5.1/lua/?.lua" package.preload["iuplua"] -------------------------------------------------------------------------------------- require("iuplua") require("iupluacontrols") local iup = iup
local function initializeDialog()
выдает ту же ошибку:
Syntax error while compiling D:\Program_Lua\Events_iup_1.lua: D:\Program_Lua\Events_iup_1.lua:6: '=' expected near 'require'
документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.
Документация действительно есть, но она к сожалению на английском, не подскажите, где то можно скачать документацию к iup на русском языке или ее не существует в природе ?
сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку: Unknown error. Possible unhandled exeption Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же : Unknown error. Possible unhandled exeption И только после перезагрузки Квика , скрипты запускаться стали. Почему так происходит ?
Юрий С написал: К сожалению столкнулся сразу же со следующей проблемой : при незначительных изменениях в исходном тексте программы: сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку: Unknown error. Possible unhandled exeption Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же : Unknown error. Possible unhandled exeption И только после перезагрузки Квика , скрипты запускаться стали. Почему так происходит ?
Понять, почему так получается, не удалось, впрочем, сильно не разбирался. Лечится только перезапуском Квика. Спрашивать у АРКИ об этой проблеме бесполезно, т.к. она возникает из-за сторонней библиотеки. Стоит сделать так: отладить скрипт, максимально исключив возможное появление подобной ошибки. Далее работает вполне стабильно, немного утомляя из-за однопоточности и sleep после iup.LoopStep() .
Юрий С написал: К сожалению столкнулся сразу же со следующей проблемой : при незначительных изменениях в исходном тексте программы: сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку: Unknown error. Possible unhandled exeption Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же : Unknown error. Possible unhandled exeption И только после перезагрузки Квика , скрипты запускаться стали. Почему так происходит ?
Понять, почему так получается, не удалось, впрочем, сильно не разбирался. Лечится только перезапуском Квика. Спрашивать у АРКИ об этой проблеме бесполезно, т.к. она возникает из-за сторонней библиотеки. Стоит сделать так: отладить скрипт, максимально исключив возможное появление подобной ошибки. Далее работает вполне стабильно, немного утомляя из-за однопоточности и sleep после iup.LoopStep() .