1

Тема: Визуальный интерфейс IUP LUA в QUIK

Здесь рассмотрю подключение и использование еще одной библиоеки визуального интерфейса для LUA - это библиотека iup и "прослойка" к ней iupLUA.

Вначале установим библиотеку, чтобы ей можно было пользоваться.
Для этого идем сюда http://sourceforge.net/projects/iup/fil … ecutables/ и качаем файл iup-3.7_Win32_bin.zip.

Кроме этого есть смысл зайти вот сюда http://sourceforge.net/projects/iup/fil … 20Sources/ и скачать документацию в удобном для вас формате (т.е. файлы, содержащие в названии "Docs").

Установка

Распаковываем архив iup-3.7_Win32_bin.zip.
Переходим в папку, куда распакован архив, там заходим в Lua5.1 и копируем в папку с установленным терминалом QUIK три файла:

  • iup.dll

  • iuplua51.dll

  • lua5.1.dll

Последний файл колпировать только в том случае если вы его еще не устанавливали с другой библиотекой.

Возможно, если у вас не установлен соотв. run-time, еще необходимо будет скопировать из папки Lua5.1 \ Microsoft.VC80.CRT все три файла с расширением dll тоже с папку в QUIK, но это можно сделать позже, только если возникнет необходимость.

Простой скрипт с использованием iupLUA

Создадим в текстовом редакторе новый файл, назовем его, например, iup-test-1.lua. Вначале подключим библиотеку iupLUA. Сделать это можно двумя способами:

package.cpath = package.cpath .. ";" .. getWorkingFolder() .. "\\?51.dll"
require( "iuplua" )

либо так:

assert(package.loadlib(getWorkingFolder() .. "\\iuplua51.dll", "luaopen_iuplua"))()

После чего добавим простой текст создания диалогового окна:

dlg = iup.dialog
{
  iup.vbox
  {
    iup.label {title="Test iupLUA in QUIK"},
    iup.button{title="Button Very Long Text"},
    iup.button{title="short", expand="HORIZONTAL"},
    iup.button{title="Mid Button", expand="HORIZONTAL"}
  }
  ;title="IupDialog", font="Helvetica, Bold 14"
}
dlg:show()

iup.MainLoop()

Очень радует то, что в отличии от wxLUA при повторном вызове скрипта, использующего рассматриваемую библиотеку iupLUA, не возникает каких-либо проблем. Значит уже имеет смысл смотреть/разбираться дальше.

Впрочем, как обычно не все так радужно. При использовании приведенного выше скрипта принципиальные проблемы остаются теми же, что и с другими подобными фреймворками: при запуске скрипт полностью останавливается в iup.MainLoop() и дальше не идет, пока не будет закрыто диалоговое окно. Ну так вот оно сделано, и в общем-то понятно почему. Разумеется, это нарушает нормальную работу терминала QUIK, не отображает статус запущенности скрипта - ну и т.д. Наверняка можно наткнуться на разные проблемы и в работе самого торгового терминала (как там с горячими клавишами при запущенном скрипте? удается ли запустить еще скрипты?).

Чтобы избавиться от указанных проблем с остановкой скрипта в методе iup.MainLoop(), можно весь этот текст перенести в main(), тогда в общем-то видимые проблемы исчезнут полностью вообще все, но лишь до тех пор, пока мы не начнем как-то изменять содержимое элементов интерфейса из обработчиков событий. А проблемы, разумеется, сразу возникнут, т.к. main() выполняется в отдельном потоке; соответственно только кодом, вызываемым из main() можно модифицировать какие-либо элементы на созданных диалогах. Что, конечно, достаточно грустно, потому что хотелось бы отображать какие-то данные в процессе работы скрипта, иначе зачем нужны все эти диалоги и окошки.

2

Re: Визуальный интерфейс IUP LUA в QUIK

Но на этом ведь мысль не заканчивается!
Сама библиотека мне понравилась, в ней, кстати, есть графики, непременно посмотрите поставляемые примеры.

Так что в следующих выпусках я непременно расскажу как переделать эту библиотеку на удобное и корректное использование в рамках QUIK.
Сейчас библиотека iup полностью заточена на то, чтобы работать только самостоятельно, в частности - самостоятельно процессить цикл обработки сообщений. Но это нам не нужно, т.к. это уже производится в терминале QUIK. Значит надо оставить в ней лишь то, что связано с созданием/отображением диалоговых окон, а все прочее - удалить и/или отключить.

Идея такая: оставить в ней только то, что связано непосредственно с созданием окон, обработкой событий от элементов управления. Все остальное - отключить полностью. Тогда она станет более чем пригодна для работы в рамках QUIK и создания произвольного пользовательского интерфейса, управляемого из LUA скриптов!
Пока работы не закончил, есть еще шероховатости, но разве счастье, уверен, поджидает Следите за новыми выпусками передачи "Qчумелые ручки"!

(тему пока закрою, т.к. предполагаю выкладывать в ней еще материалы; есть вопросы - просто создайте для них новую тему, не стесняйтесь)

3

Re: Визуальный интерфейс IUP LUA в QUIK

< reserved >

4

Re: Визуальный интерфейс IUP LUA в QUIK

< reserved >

5

Re: Визуальный интерфейс IUP LUA в QUIK

< reserved >

6

Re: Визуальный интерфейс IUP LUA в QUIK

< reserved >

7

Re: Визуальный интерфейс IUP LUA в QUIK

Добрый день!
Почему-то при использовании данной библиотеки после остановки скрипта падает квик. До этого все нормально работает.
Система: win7 x64, использую iup3.7 32-битную

8

Re: Визуальный интерфейс IUP LUA в QUIK

Надо смотреть конкретный код, который вы используете.
Вообще лично у меня руки так и не дошли толком подключить правильно визуализацию из этой библиоеки, я использую VCLua  (только дочитайте какие файлы взять и как подключать/использовать)

9

Re: Визуальный интерфейс IUP LUA в QUIK

Да на самом деле не в скрипте даже дело. Достаточно просто подключить библиотеку из скрипта (но никак её вообще не использовать, просто loadlib) - после остановки крашится. Попробую VCL, спасибо.

10 (2014-06-20 13:07:18 отредактировано axel)

Re: Визуальный интерфейс IUP LUA в QUIK

Подскажите можно ли строить на библиотеке  iupLUA динамические графики? Нужно сделать график который меняется на месте, т.е. нет по оси X шкалы времени. Скачал с официального сайта iup примеры этой библиотеки, но не одного примера с динамическим изменением графика не нашел. Не совсем понимаю механизм обновления графика.
Может данный функционал позволяет делать сам qlua через индикаторы?  Или может с помощью другой библиотеки можно это сделать, или проще использовать другой язык создав dll и подключив к qlua?