Интерфейс в Lua

Страницы: 1
RSS
Интерфейс в Lua, Диалог из Lua
 
Подскажите, пожалуйста, как можно организовать диалог из  программы Lua, например организовать запрос с выводом в окно на экран и ожидать ответа  из соответствующего поля в этом же окне и в зависимости от ответа продолжить выполнение программы, вообще в Lua возможно организовать чтение вводимых данных с консоли ?
 
Для реализации диалогов и окон мы пробовали использовать библиотеку iplua. Только интерфейс при этом тормозит из-за особенностей многопоточности в QLua в нашей конкретной реализации.

Ещё можно использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши. Костыльный вариант, но иногда подходит.

Возможно, кто-нибудь ещё что посоветует.
 
Можно QVCLua попробовать, https://quik2dde.ru/viewforum.php?id=13

А если вас устроит писать не только на луа, можно написать свою dll с интерфейсом. В этом случае можно уже практически любые визуальные библиотеки использовать.
 
Цитата
_sk_ написал:

Ещё можно использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши. Костыльный вариант, но иногда подходит.

Если можно хотя бы приблизительный пример, что именно подразумевается под "использовать обычные таблицы терминала совместно с событиями нажатия на кнопки мыши "  какие именно "обычные таблицы" и можно ли использовать клавишу ввод , а не мышь ?
 
Примеры можно увидеть в "Руководстве пользователя 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
 
Обработчики событий пользовательских таблиц работают не в потоке main. В общем случае так делать не стоит.
 
Цитата
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
 
iup входит в стандартную LuaForWindows 5.1.4.0
 
Цитата
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.

https://forum.quik.ru/messages/forum10/message19255/topic2166/#message19255
https://forum.quik.ru/messages/forum10/message25804/topic2954/#message25804
 
Цитата
vgi написал:
Цитата
Юрий С написал:
 
Цитата
vgi  написал:
iup  входит в стандартную LuaForWindows 5.1.4.0
Подскажите, плиз, где скачать LuaForWindows 5.1.4.0 и как установить его в квике, насколько я понял луа в квике встроенный , у меня установлен  квик версии 7.18.1.20, но он на iup ругается не видит модули ?

Скачиваете, устанавливаете. В скрипте не забудьте добавить путь к LuaForWindows в package.path.
Захочется добавить в окошки что-то поинтереснее - документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.

https://forum.quik.ru/messages/forum10/message19255/topic2166/#message19255
https://forum.quik.ru/messages/forum10/message25804/topic2954/#message25804
Скачал, установил:

-- 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'

Помогите пжлст, в чем дело ?
 
Устанавливайте package.cpath а не package.path
 
Цитата
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'
 
Попробуйте так:
Скрытый текст
 
Цитата
vgi написал:
Попробуйте так:

Спасибо, заработало, но правда пока непонятно как кнопки работают и работают ли они, ну буду разбираться, Спасибо.
 
Цитата
vgi написал:
Цитата
документация очень хорошая, исчерпывающая, будет лежать в каталоге установленной LuaForWindows.

Документация действительно есть, но она к сожалению на английском, не подскажите, где то можно скачать документацию к iup  на русском языке или ее не существует в природе ?
 
На русском языке документации iup нет. Пусть это Вас не смущает, вставши на путь программирования.

Если что-то будет не понятно про iup, можете открыть новую тему с пометкой iUP , попробуем разобраться.
 
Цитата
vgi написал:
На русском языке документации iup нет. Пусть это Вас не смущает, вставши на путь программирования.

Если что-то будет не понятно про iup, можете открыть новую тему с пометкой  iUP  , попробуем разобраться.
Обнадежили, спасибо.  
 
К сожалению столкнулся сразу же со следующей проблемой :
при незначительных изменениях в исходном тексте программы:
Цитата
vgi написал:
Попробуйте так:
сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку:
Unknown error. Possible unhandled exeption
Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же :
Unknown error. Possible unhandled exeption
И только после перезагрузки Квика , скрипты запускаться стали.
Почему так происходит ?
 
Цитата
Юрий С написал:
К сожалению столкнулся сразу же со следующей проблемой :
при незначительных изменениях в исходном тексте программы:
сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку:
Unknown error. Possible unhandled exeption
Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же :
Unknown error. Possible unhandled exeption
И только после перезагрузки Квика , скрипты запускаться стали.
Почему так происходит ?

Понять, почему так получается, не удалось, впрочем, сильно не разбирался. Лечится только перезапуском Квика.
Спрашивать у АРКИ об этой проблеме бесполезно, т.к. она возникает из-за сторонней библиотеки.
Стоит сделать так: отладить скрипт, максимально исключив возможное появление подобной ошибки.
Далее работает вполне стабильно, немного утомляя из-за однопоточности и sleep после iup.LoopStep() .
 
Цитата
vgi написал:
Цитата
Юрий С написал:
К сожалению столкнулся сразу же со следующей проблемой :
при незначительных изменениях в исходном тексте программы:
сделал ошибку, исправил, заново скрипт не запустился, выдал ошибку:
Unknown error. Possible unhandled exeption
Вернулся к исходному тексту вашей программы. скрипт запускаться так же не желает ошибка та же :
Unknown error. Possible unhandled exeption
И только после перезагрузки Квика , скрипты запускаться стали.
Почему так происходит ?

Понять, почему так получается, не удалось, впрочем, сильно не разбирался. Лечится только перезапуском Квика.
Спрашивать у АРКИ об этой проблеме бесполезно, т.к. она возникает из-за сторонней библиотеки.
Стоит сделать так: отладить скрипт, максимально исключив возможное появление подобной ошибки.
Далее работает вполне стабильно, немного утомляя из-за однопоточности и  sleep  после  iup.LoopStep()  .
Понятно, Спасибо.
Страницы: 1
Читают тему (гостей: 1)
Наверх