<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Lua: визуальные библиотеки]]></title>
		<link>https://quik2dde.ru/index.php</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;fid=13&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние темы раздела «QUIK -> DDE».]]></description>
		<lastBuildDate>Mon, 14 Nov 2022 11:53:49 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Ищу программиста для разработки роботов под QUIK]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=422&amp;action=new</link>
			<description><![CDATA[<p>Разработка индикаторов и роботов для QUIK<br />Пишите на почту galand2000@yandex.ru</p>]]></description>
			<author><![CDATA[null@example.com (Andrey)]]></author>
			<pubDate>Mon, 14 Nov 2022 11:53:49 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=422&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Gettemppath]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=291&amp;action=new</link>
			<description><![CDATA[<p>swerg,</p><p>в функции gettemppath библиотеки w32 буфер должен резервироваться как</p><br /><p>char tfn[MAX_PATH+1];</p>]]></description>
			<author><![CDATA[null@example.com (s_mike)]]></author>
			<pubDate>Sat, 13 Apr 2019 13:25:05 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=291&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Подскажите как сделать визуальные кнопки для робота на Qlua-(Quik)?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=253&amp;action=new</link>
			<description><![CDATA[<p>Не как негде не могу найти как организовать кнопки? Обычные 2 кнопки - при нажатие на которую просто бы что то выводиться на экран трейдеру. <br />Я нашел как это сделать элементами таблицы, но как сделать в поле просто 2 кнопке я никак не могу найти.<br />Например мне надо сделать вот так:<br /><span class="postimg"><img src="http://priscree.ru/img/85ef8771a1bce3.png" alt="http://priscree.ru/img/85ef8771a1bce3.png" /></span><br />Помогите может кто сталкивался как сделать такие кнопки. Можно пример Lua или хотя бы где про это почитать - может кто знает?</p>]]></description>
			<author><![CDATA[null@example.com (moscow.serg)]]></author>
			<pubDate>Tue, 19 Dec 2017 18:35:56 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=253&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[VCLua версии v0.6.2]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=249&amp;action=new</link>
			<description><![CDATA[<p>Зашел на [url=https://sourceforge.net/projects/vclua/]страницу VCLua[/url], а там Rleased vclua-v0.6.2<br />И что теперь делать? опять сначала? брать исходники, править для корректной поддержки русских букв и т.д.? или забить может?<br />Что там нового/полезного в самой библиотеке - не смотрел.<br />Точно полезное - запилили они редактор форм, визуальный. Это точно посмотреть надо будет. Это полезно.</p><p>А про взятие за основу новой версии - какие будут мнения?</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Tue, 09 May 2017 06:58:09 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=249&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[General Protection Fault QVCL]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=216&amp;action=new</link>
			<description><![CDATA[<p>Добрый день, народ.</p><p>Подскажите плз, использую библиотеку qvcl-0.5.0-rev.2.zip, скачанную с вашего сайта. После первого запуска приложение стартует нормально, а вот если его остановить и попробовать запустить еще раз то в 99% вылетает ошибка и квик умирает.<br />Может кто сталкивался как можно забороть?</p><p>шаблон у меня такой:</p><p>local vcl = require &quot;qvcl&quot;<br />function OnStop()<br />&nbsp; &nbsp;vcl = nil<br />&nbsp; &nbsp;myForm:Release()<br />end</p><p>квик 7.5.0.72</p><p>Спасибо.</p><p><span class="postimg"><img src="http://i64.tinypic.com/slnp5t.png" alt="http://i64.tinypic.com/slnp5t.png" /></span></p>]]></description>
			<author><![CDATA[null@example.com (2pikin)]]></author>
			<pubDate>Wed, 22 Feb 2017 09:01:48 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=216&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Примеры падения QVCLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=192&amp;action=new</link>
			<description><![CDATA[<p>В этой теме просьба выкладывать примеры скриптов (желательно максимально короткие), в которых используется QVCLua, и сценарии, при которых рушится терминал QUIK.</p><p>Буду в конце-концов придумывать что с этим делать.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Fri, 12 Feb 2016 11:29:39 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=192&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[QVCLua, элемент DataEdit и как его использовать]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=191&amp;action=new</link>
			<description><![CDATA[<p>Есть в библиотеке VCLua удобный элемент для ввода даты: <strong>DataEdit</strong>.<br />Вводить дату можно как вручную, так и выбором из календаря:</p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/191/dateedit-form.png" alt="https://quik2dde.ru/static-img/191/dateedit-form.png" /></span></p><br /><div class="spoilerbox" style="padding: 0px;"><div onclick="var e,d,c=this.parentNode,a=c.getElementsByTagName('div')[1],b=this.getElementsByTagName('span')[0];if(a.style.display!=''){while(c.parentNode&&(!d||!e||d==e)){e=d;d=(window.getComputedStyle?getComputedStyle(c, null):c.currentStyle)['backgroundColor'];if(d=='transparent'||d=='rgba(0, 0, 0, 0)')d=e;c=c.parentNode;}a.style.display='';a.style.backgroundColor=d;b.innerHTML='[-]';}else{a.style.display='none';b.innerHTML='[+]';}" style="cursor: pointer;"><span style="padding: 0 5px;">[+]</span>Тестовый код</div><div style="padding: 6px; margin: 0; display: none;"><div class="codebox"><pre><code>VCL=require &quot;qvcl&quot;

mainForm = VCL.Form(&quot;mainForm&quot;,
    { position=&quot;podesktopcenter&quot;, height=150, width=400, Caption=&quot;DateEdit test&quot;,
      OnClose = function(sender) is_run=false mainForm:Release() end
    }
)

dateEdit = VCL.DateEdit(mainForm,
    { Top=20, Left=30 }
)

mainForm:Show()

is_run = true    
function main()
  while is_run do
    sleep(50)
  end
end

function OnStop()
 is_run = false
 mainForm:Release()
end</code></pre></div></div></div>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Thu, 11 Feb 2016 06:12:06 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=191&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[QVCLua: Как заставить обновляться таблицу по новым свечам графика?]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=190&amp;action=new</link>
			<description><![CDATA[<p>Кто может подсказать такой вопрос: в нижеизложенном скрипте после запуска, заполняется таблица (все нормально), но текущие значения не изменяются и остаются неизменными, когда уже пошла следующая свеча, т.е таблица не обновляется, только перезаполняется после перезагрузки скрипта. Как сделать, чтобы текущие значения постоянно обновлялись? Вот скрипт:<br /></p><div class="codebox"><pre><code>gridIchimoku = VCL.StringGrid(mainForm,&quot;gridIchimoku&quot;)
gridIchimoku._ = { Top = 18, left = 270, Width=990, ColCount = 10, RowCount = 10, Height = 200, AutoEdit = False, FixedCols = 1, FixedRows = 1, Flat = True }
gridIchimoku:SetColParams({
  {Width= 160, Alignment=&quot;taleftJustify&quot;, Title={Caption=&quot;Индикатор&quot;, Alignment=&quot;taCenter&quot;}},
  {Width= 160, Alignment=&quot;taRightJustify&quot;, Title={Caption=&quot;Текущее значение&quot;, Alignment=&quot;taCenter&quot;}},
  {Width= 160, Alignment=&quot;taRightJustify&quot;, Title={Caption=&quot;Последнее начение&quot;, Alignment=&quot;taCenter&quot;}},
  {Width= 160, Alignment=&quot;taRightJustify&quot;, Title={Caption=&quot;Предпоследнее значение&quot;, Alignment=&quot;taCenter&quot;}},
})

local class_code, sec_code = CLASS_CODE, SEC_CODE
local tag = &quot;ICHMK&quot;
local count = getNumCandles (tag)
local T0, N0, L0 = getCandlesByIndex (tag, 0, count - 3, 3)  --получаем таблицу с последними значениями Tenkan-sen
local T1, N1, L1 = getCandlesByIndex (tag, 1, count - 3, 3)  --получаем таблицу с последними значениями Kijun-sen
local T2, N2, L2 = getCandlesByIndex (tag, 2, count - 3, 3)  --получаем таблицу с последними значениями Senkou Span 1
local T3, N3, L3 = getCandlesByIndex (tag, 3, count - 3, 3)  --получаем таблицу с последними значениями Senkou Span 2
local T4, N4, L4 = getCandlesByIndex (tag, 4, count - 3, 3)  --получаем таблицу с последними значениями Chinkou Span

gridIchimoku:SetCell(1, 1, L0)
gridIchimoku:SetCell(2, 1, T0[2].close)
gridIchimoku:SetCell(3, 1, T0[1].close)
gridIchimoku:SetCell(4, 1, T0[0].close)
gridIchimoku:SetCell(1, 2, L1)
gridIchimoku:SetCell(2, 2, T1[2].close)
gridIchimoku:SetCell(3, 2, T1[1].close)
gridIchimoku:SetCell(4, 2, T1[0].close)
gridIchimoku:SetCell(1, 3, L2)
gridIchimoku:SetCell(2, 3, T2[2].close)
gridIchimoku:SetCell(3, 3, T2[1].close)
gridIchimoku:SetCell(4, 3, T2[0].close)
gridIchimoku:SetCell(1, 4, L3)
gridIchimoku:SetCell(2, 4, T3[2].close)
gridIchimoku:SetCell(3, 4, T3[1].close)
gridIchimoku:SetCell(4, 4, T3[0].close)
gridIchimoku:SetCell(1, 5, L4)
gridIchimoku:SetCell(2, 5, T4[2].close)
gridIchimoku:SetCell(3, 5, T4[1].close)
gridIchimoku:SetCell(4, 5, T4[0].close)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (diksan)]]></author>
			<pubDate>Tue, 26 Jan 2016 21:38:29 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=190&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[QVCLua: При вызове формы из дочернего скрипта, пропадает русский язык]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=152&amp;action=new</link>
			<description><![CDATA[<p>Суть проблемы- есть основной скрипт с обращениями к &quot;дочерним скриптам&quot;<br />При клике на кнопку, должна появляться еще форма. <br />Если описание этой формы лежит в основном скрипте, то всё ок.<br />Если описание формы положить в отдельный скрипт (к которому обращается основной), вместо русских символов вылезают &quot;крокозябры&quot; неадекватные ))))</p><br /><p>Использую QVCLua</p><p>Вот эта строчка (на самом деле там много строк еще) если в основном скрипте, то всё ок, если в дочернем, то русский не работает:</p><p>myFormPor&nbsp; &nbsp; &nbsp; &nbsp; =&nbsp; VCL.Form({Name = &quot;myFormPor&quot;, Height = 900, Width = 800, Caption = &quot;Портфель клиента&quot;, Position = &quot;poScreenCenter&quot;&nbsp; } )</p>]]></description>
			<author><![CDATA[null@example.com (slkumax)]]></author>
			<pubDate>Thu, 30 Apr 2015 15:13:20 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=152&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Визуальный интерфейс QVCLua: обсуждения, замечания, предложения]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=112&amp;action=new</link>
			<description><![CDATA[<p>Здесь обсуждаем визуальную библиотеку QVCLua.<br />[url=https://quik2dde.ru/viewtopic.php?id=111]Сама библиотека и описание в отдельной теме[/url].</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Tue, 18 Nov 2014 18:48:03 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=112&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Визуальный интерфейс QVCLua для QUIK]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=111&amp;action=new</link>
			<description><![CDATA[<p>Выкладываю как есть, потому что никак не соберусь сделать нормальные примеры и описание, хотя готово уже давно.<br />Сделано на основе [url=https://quik2dde.ru/viewtopic.php?id=26]библиотеки VCLua[/url] версии 0.5.0.<br />Кто использует предыдущие версии - надо будет при переходе на новую версию несколько переработать имеющийся код, само по себе не заработает, т.к. автор vclua заметно переработал подходы.</p><p>[url=https://quik2dde.ru/viewtopic.php?id=112]Обсуждение - в отдельной теме[/url]. Здесь только выкладывание релизов и оформленные инструкции.</p><p>Описание будет позже, извините.</p><h5>Отличия от стандартной <strong>VCLua</strong>:</h5><ul><li><p>поддержка русского языка из QUIK</p></li><li><p>возможность задавать цвет ячейки компонента StringGrid</p></li><li><p>не требует дополнительного файла lua.5.1.dll, работает напрямую с qlua.dll (актуально только для QUIK 6.x, 7.x, в первоначальных вариантах торгового терминала этих версий указанная dll отсутствовала)</p></li></ul><h5>Скачать:</h5><ul><li><p>архив с готовым бинарным файлом библиотеки: [url=http://www.quik2dde.ru/static-img/qvcl/qvcl.zip]qvcl.zip [/url]</p></li></ul><p>(варианта сборки для QUIK 8.0...8.4 (x64 / Lua5.1) нет и не планируется)</p><h5>Исходники:</h5><ul><li><p>GinHub: [url=https://github.com/swerg/QVCLua-0.5.0]https://github.com/swerg/QVCLua-0.5.0[/url]</p></li></ul><h5>Установка:</h5><ol class="decimal"></ol><h5>Некоторые возможные ошибки при запуске</h5><ol class="decimal"><li><p><span style="color: #c42"><strong>multiple Lua VMs detected. Expected 5.3 instead of 5.4</strong> (для QUIK 8.11)</span> - скопирована библиотека qvcl.dll для варианта Lua 5.3, но скрипт Lua запущен в интерпретаторе Lua 5.4</p></li><li><p><span style="color: #c42"><strong>multiple Lua VMs detected. Expected 5.4 instead of 5.3</strong> (для QUIK 8.11)</span> - скопирована библиотека qvcl.dll для варианта Lua 5.4, но скрипт Lua запущен в интерпретаторе Lua 5.3</p></li></ol>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Tue, 18 Nov 2014 18:45:42 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=111&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[QVCLua: рисование графических элементов - круги, квадраты и т.д.]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=73&amp;action=new</link>
			<description><![CDATA[<p>Простой пример как нарисовать на форме графические элементы при помощи VCL.Shape:</p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/26/test-shape.gif" alt="https://quik2dde.ru/static-img/26/test-shape.gif" /></span></p><p>Для визуализации используется [url=https://quik2dde.ru/viewtopic.php?id=111]библиотека QVCLua, которую можно взять в отдельной теме[/url].</p><p>Про просьбе участника форума добавлена возможность задавать угол поворота для фигур.<br />Новые свойства и методы для <strong>Shape</strong>:<br /></p><ul><li><p><strong>Angle</strong> - задаёт угол поворота фигуры в градусах</p></li><li><p><strong>RotateMinSize</strong> - если равно <strong>false</strong>, то фигура изменяется в размере так, чтобы занять аксимально доступную область, заданную размерами, если равно <strong>true</strong> - то фигура имеет постоянный размер такой, чтобы при любом угле поворота гарантированно умещаться в заданные её размеры</p></li><li><p><strong>SendToBack()</strong> - переместить фигуру на задний план</p></li><li><p><strong>BringToFront()</strong> - переместить фигуру на передний план</p></li></ul><div class="codebox"><pre><code>VCL = require &quot;qvcl&quot;

function OnFormClose(Sender, CloseAction)
  is_run = false
  mainForm:Release()
end

function OnTrackChange(Sender)
  graphRect.Angle = trackBar.Position
  graphElipse.Angle = trackBar.Position
  graphTriangle.Angle = trackBar.Position
  graphDiamond.Angle = trackBar.Position
  labelAngle.Caption = &quot;Угол поворота: &quot; .. tostring(trackBar.Position)
end

function OnChBoxChange(Sender)
  graphRect.RotateMinSize = chBox.Checked
  graphElipse.RotateMinSize = chBox.Checked
  graphTriangle.RotateMinSize = chBox.Checked
  graphDiamond.RotateMinSize = chBox.Checked
end

function SetRectFrom(elemTo, elemFrom)
  elemTo.top = elemFrom.top
  elemTo.left = elemFrom.left
  elemTo.height = elemFrom.height
  elemTo.width = elemFrom.width
  elemTo:SendToBack();
end


mainForm = VCL.Form(&quot;mainForm&quot;)
mainForm._ = { position=&quot;podesktopcenter&quot;, height=330, width=370, Caption=&quot;Shape test&quot;, OnClose = OnFormClose }

-- квадрат
graphRect = VCL.Shape(mainForm)
graphRect._ =
  {
     top=10, left=15, height=100, width=150,  -- положение и размеры
     Shape=&quot;stRectangle&quot;,                     -- тип: прямоугольник
     Pen={ Color=0x3333DD, Style=&quot;psDot&quot; },   -- цвет рамки, тип линии &quot;пунктир&quot;
     Brush={ Color=0xDD99BB }                 -- цвет заливки
  }

-- элипс
graphElipse = VCL.Shape(mainForm)
graphElipse._ =
  {
     top=10, left=205, height=100, width=150,  -- положение и размеры
     Shape=&quot;stEllipse&quot;,                       -- тип: элипс
     Pen={ Color=0xDD9933 },                  -- цвет рамки, сплошная линия
     Brush={ Color=0x666666, Style=&quot;bsFDiagonal&quot; }  -- цвет заливки диагональными линиями
  }

-- треугольник
graphTriangle = VCL.Shape(mainForm)
graphTriangle._ =
  {
     top=135, left=15, height=100, width=150,
     Shape=&quot;stTriangle&quot;,                      -- тип: треугольник
     Pen={ Color=0x00CC00, Width=5 },         -- зеленая рамка толщиной 5 писелей
     Brush={ Style=&quot;bsClear&quot; }                -- без заливки
  }

-- ромб
graphDiamond = VCL.Shape(mainForm)
graphDiamond._ =
  {
     top=135, left=205, height=100, width=150,
     Shape=&quot;stDiamond&quot;,                        -- тип: ромб
     Pen={ Style=&quot;psClear&quot; },                  -- без рамки
     Brush={ Color=0x00EEEE, Style=&quot;bsSolid&quot; } -- сплошная заливка
  }

-- &quot;рамки&quot; вокруг элементов
frame1 = VCL.Shape(mainForm, {
     Shape=&quot;stRectangle&quot;, Pen={ Color=0xAAAAAA, Style=&quot;psDashDot&quot; }, Brush={ Style=&quot;bsClear&quot; }
 })
frame2 = VCL.Shape(mainForm, {
     Shape=&quot;stRectangle&quot;, Pen={ Color=0xAAAAAA, Style=&quot;psDashDot&quot; }, Brush={ Style=&quot;bsClear&quot; }
 })
frame3 = VCL.Shape(mainForm, {
     Shape=&quot;stRectangle&quot;, Pen={ Color=0xAAAAAA, Style=&quot;psDashDot&quot; }, Brush={ Style=&quot;bsClear&quot; }
 })
frame4 = VCL.Shape(mainForm, {
     Shape=&quot;stRectangle&quot;, Pen={ Color=0xAAAAAA, Style=&quot;psDashDot&quot; }, Brush={ Style=&quot;bsClear&quot; }
 })
SetRectFrom(frame1, graphRect)
SetRectFrom(frame2, graphElipse)
SetRectFrom(frame3, graphTriangle)
SetRectFrom(frame4, graphDiamond)

-- &quot;двигунок&quot; и отображение угла
labelAngle = VCL.Label(mainForm)
labelAngle._ =
 {
     top=250, left=15,
     Caption=&quot;0&quot;
 }

trackBar = VCL.TrackBar(mainForm)
trackBar._ =
 {
     top=270, left=0, width=369,
     TickStyle=&quot;tsNone&quot;,
     OnChange = OnTrackChange,
     Min=0, Max=360
 }

chBox = VCL.CheckBox(mainForm)
chBox._ =
 {
     top=300, left=10, width=230, Caption=&quot;Постоянный размер&quot;,
     OnChange = OnChBoxChange
 }


mainForm:Show()

OnTrackChange()  -- вывести начальный угол с поясняющим текстом

is_run = true    
function main()
  while is_run do
    sleep(50)
  end
end

function OnStop()
 is_run = false
 mainForm:Free()
end</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Thu, 03 Oct 2013 19:22:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=73&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Визуальный интерфейс VCLua в QUIK]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=26&amp;action=new</link>
			<description><![CDATA[<p>Для создания интерфейса с пользователем в программах на Lua среди других разработана библиотека <strong>VCLua</strong>.</p><p>С точки зрения внутреннего устройства определенная &quot;изюминка&quot; ее состоит в том, что написана она на языке Pacscal, в то время как подавляющее большинство других библиотек написаны на C/C++. Само по себе это довольно здорово, т.к. для компиляции ее можно использовать Delphi или Lazarus, для которых них создано&nbsp; просто огромное количество визуальных компонент, реализующих различные элементы экранного интерфейса, что при определенном навыке позволяет легко расширять эту библиотеку, добавляя в нее новые необходимые элементы. Впрочем, при использовании этой библиотеки из Lua уже и так доступно весьма большое количество элементов визуального интерфейса (полный перечень их можно найти в файле <strong>controls.txt</strong> в дистрибутиве).</p><p>Домашняя страничка проекта [url]http://vclua.99k.org/[/url]<br />Последняя выложенная версия значится <strong>VCLua v0.3.5</strong>.</p><p>Стоит отметить довольно бедную справку по данной библиотеке и крайне малое количество примеров.</p><h5>Установка</h5><p><strong>Вариант 1</strong>. Официальная сборка:<br />Для установки идем вот по этой ссылке [url]http://files.luaforge.net/releases/vclua/vclua/VCLua-0.3.5[/url] и скачиваем файл со скомпилированной (готовой к использованию) библиотекой и, желательно, файл с документацией (уж какая есть):<br /></p><ul><li><p>vclua-0.3.5-win32.zip</p></li><li><p>vclua-0.3.3-doc.zip</p></li></ul><p><strong>Вариант 2</strong>. Исправленная сборка с этого сайта:<br />Я буду постепенно исправлять и немного дополнять эту библиотеку.<br />Ссылка для скачивания и история изменений есть в [url=https://quik2dde.ru/viewtopic.php?pid=59#p59]следующем сообщении этой темы[/url]; в виде одного [url=https://quik2dde.ru/static-img/26/vcl.zip]архива vcl.zip[/url].</p><p><strong>Далее все общее для любого варианта</strong>.</p><p>Из папки, куда распаковался архив <strong>vclua-0.3.5-win32.zip</strong> или <strong>vcl.zip</strong>, копируем в каталог с терминалом QUIK единственный файл:<br /></p><ul><li><p><strong>vcl.dll</strong> (из папки bin для варианта 1)</p></li></ul><p>Если вы до этого не ставили никакие другие дополнительные Lua-библиотеки, то вам еще необходимо скопировать файл lua5.1.dll из дистрибутива Lua с сайта lua.org, копируем тоже в каталог с QUIK. Подробнее где что брать см. отдельную тему рядом на этом форуме.<br />В варианте 2 файл lua5.1.dll добавлен в скачиваемый архив.</p><p>Вот и все. На этом установка закончена, можно использовать <strong>VCLua</strong>.</p><h5>Использование</h5><p>Создадим файл <strong>vcl-test-01.lua</strong> в текстовом редакторе и скопируем в него такой текст:</p><div class="codebox"><pre><code>-- НЕ ИСПОЛЬЗУЙТЕ КОД ЭТОГО ПРИМЕРА В QUIK! Он приведен лишь как пример этапов изучения VCLua!
-- Читайте сообщение дальше, дальше есть правильный код
require &quot;vcl&quot;

mainForm = VCL.Form(&quot;mainForm&quot;)

mainForm.Caption = &quot;My first VCLua application&quot;
mainForm._= { position=&quot;podesktopcenter&quot;, height=400, width=600 }

mainForm.onclosequery = &quot;onCloseQueryEventHandler&quot; 

function onCloseQueryEventHandler(Sender)
    return true -- the form can be closed
end

mainMenu = VCL.MainMenu(mainForm,&quot;mainMenu&quot;)
mainMenu:LoadFromTable({
    {name=&quot;mmfile&quot;, caption=&quot;&amp;File&quot;, 
        submenu={
            {caption=&quot;Exit&quot;, onclick=&quot;onMenuExitClick&quot;, shortcut=&quot;Ctrl+F4&quot;}, 
        }
    }
})

function onMenuExitClick()
    mainForm:Close()
end

mainForm:ShowModal()

function main()
    message(&quot;main started&quot;, 1)
end</code></pre></div><p>Скрипт этот сделан на основе самого простого примера из поставки VCLua и даже еще несколько упрощен. Добавим файл vcl-test-01.lua в QUIK (Таблицы -&gt; Lua&nbsp; -&gt; Доступные скрипты) и запустим на выполнение. Появляется простейшее окно в меню, при этом как и с другими фреймворками визуализации для Lua в QUIK видим типичные проблемы: форма конечно создана и присутствует на экране, но скрипт отображается в состоянии &quot;не запущен&quot;, да и сообщение &quot;main started&quot; не отображается, что означает, что поток с main() не запущен, т.е. скрипт еще даже не прошел инициализацию. Никакие обработчики событий тоже не работают.</p><p>Оно и понятно, ведь мы, как обычно, стоим в строке модального отображения главной формы:</p><div class="codebox"><pre><code> mainForm:ShowModal() </code></pre></div><p>И только когда мы форму закрываем - появляется сообщение &quot;main started&quot;!</p><h5>Как делать правильно</h5><p>Самой приятной особенностью библиотеки VCLua оказалось то, что она абсолютно отлично поддерживает <strong>немодальное отображение форм</strong>, в том числе и главной формы! Собственно в этом смысле понятие &quot;главной формы&quot; сразу исчезает, т.к. любые формы (т.е. окна интерфейса) можно отображать в любое время, VCLua от наличия или отсутствия форм работать не перестает! Давайте немного изменим предыдущий пример; основное, что будет изменено – будет вызываться метод <strong>Show</strong> вместо метода <strong>ShowModal</strong>. Это позволит нам не останавливаться на инициализации скрипта, а выполнять обычную нормальную работу QLua дальше. Сохраним текст в файле <strong>vcl-test-02.lua</strong> ([url=https://quik2dde.ru/static-img/26/vcl-test-02.lua]скачать[/url]).<br /></p><div class="codebox"><pre><code> require &quot;vcl&quot;

mainForm = VCL.Form(&quot;mainForm&quot;)

mainForm.Caption = &quot;VCLua in QUIK&quot;
mainForm._= { position=&quot;podesktopcenter&quot;, height=150, width=300}

mainMenu = VCL.MainMenu(mainForm,&quot;mainMenu&quot;)
mainMenu:LoadFromTable({
    {name=&quot;mmfile&quot;, caption=&quot;&amp;File&quot;, 
        submenu={
            {caption=&quot;Exit&quot;, onclick=&quot;onMenuExitClick&quot;, shortcut=&quot;Ctrl+F4&quot;}, 
        }
    }
})

label = VCL.Label(mainForm,&quot;Label&quot;)
label.Top = 30
label.Left = 50
label.Caption = &quot;VCLua in QUIK&quot;
label.Font.Size = 20

function onMenuExitClick()
    OnStop()
end

mainForm:Show()

is_run = true    

function main()
    while is_run do
        sleep(50)
    end
end

function OnStop()
    is_run = false
    mainForm:Free()
end</code></pre></div><p>Запустив скрипт, увидим такую картинку:</p><p><span class="postimg"><img src="https://quik2dde.ru/static-img/26/vcl-test-02.png" alt="https://quik2dde.ru/static-img/26/vcl-test-02.png" /></span><br />Обратите внимание:<br /></p><ul><li><p>скрипт корректно находится в состоянии &quot;запущен&quot;</p></li><li><p>при нажатии на &quot;Остановить&quot; скрипт завершается и окно закрывается</p></li><li><p>при выборе из меню на окне пункта File -&gt; Exit окно закрывается и скрипт переходит в состояние &quot;остановлен&quot;</p></li></ul><p>Остановка скрипта &quot;по требованию&quot; осуществляется здесь:<br /></p><div class="codebox"><pre><code>function OnStop()
    is_run = false
    mainForm:Free()
end</code></pre></div><p>Т.е. в обработчике <strong>OnStop</strong> завершается цикл в <strong>main</strong>, для чего присваивается false переменной is_run, и уничтожается форма путем вызова метода Free().</p><p>Чтобы закрыть форму через ее меню - просто вызываем <strong>OnStop</strong> из обработчика пункта меню:<br /></p><div class="codebox"><pre><code>function onMenuExitClick()
    OnStop()
end</code></pre></div><p>Это же то, что и хотелось! Скрипт вполне корректно уживается внутри QUIK, реагируя на события, завершаясь по требованию и т.д.</p><h5>Чуть сложнее пример</h5><p>Попробуем добавить обработчик события и отображение информации из этого обработчика.<br />Например, в событии OnAllTrade будем суммировать объем всех сделок по двум инструментам: LKOH и SBER. Файл будет называться vcl-test-03.lua ([url=https://quik2dde.ru/static-img/26/vcl-test-03.lua]скачать[/url]).</p><div class="codebox"><pre><code>require &quot;vcl&quot;

mainForm = VCL.Form(&quot;mainForm&quot;)

mainForm.Caption = &quot;VCLua in QUIK&quot;
mainForm._= { position=&quot;podesktopcenter&quot;, height=150, width=300}

mainMenu = VCL.MainMenu(mainForm,&quot;mainMenu&quot;)
mainMenu:LoadFromTable({
    {name=&quot;mmfile&quot;, caption=&quot;&amp;File&quot;, 
        submenu={
            {caption=&quot;Exit&quot;, onclick=&quot;onMenuExitClick&quot;, shortcut=&quot;Ctrl+F4&quot;}, 
        }
    }
})

label = {}
label[&quot;SBER&quot;] = VCL.Label(mainForm,&quot;Label1&quot;)
label[&quot;LKOH&quot;] = VCL.Label(mainForm,&quot;Label2&quot;)

label[&quot;SBER&quot;].Top = 10
label[&quot;SBER&quot;].Left = 10
label[&quot;LKOH&quot;].Top = 30
label[&quot;LKOH&quot;].Left = 10

cnt = {}
cnt[&quot;LKOH&quot;] = 0
cnt[&quot;SBER&quot;] = 0

qty = {}
qty[&quot;LKOH&quot;] = 0
qty[&quot;SBER&quot;] = 0

val = {}
val[&quot;LKOH&quot;] = 0
val[&quot;SBER&quot;] = 0

function onMenuExitClick()
    OnStop()
end

mainForm:Show()

is_run = true    

function main()
    while is_run do
        sleep(50)
    end
end

function OnStop()
    is_run = false
    mainForm:Free()
end

function OnAllTrade(trade)
    if is_run == false then
        return
    end

    if (trade.seccode == &quot;LKOH&quot;) or (trade.seccode == &quot;SBER&quot;) then
        cnt[trade.seccode] = cnt[trade.seccode] + 1
        qty[trade.seccode] = qty[trade.seccode] + trade.qty
        val[trade.seccode] = val[trade.seccode] + trade.value
        label[trade.seccode].Caption = trade.seccode .. &quot; (&quot; .. cnt[trade.seccode] .. &quot;) &quot; .. qty[trade.seccode] .. &quot; = &quot; .. val[trade.seccode]
    end
end</code></pre></div><p><span class="postimg"><img src="https://quik2dde.ru/static-img/26/vcl-test-03.gif" alt="https://quik2dde.ru/static-img/26/vcl-test-03.gif" /></span></p><p>Да оно отлично работает! В нашем окне выводится количество сделок (в скобках), суммарное количество лотов в сделках и суммарный объем сделок. Разумеется, все это подсчитывается только с начала работы скрипта.</p><p>Небольшие пояснения по коду. Первые три строчки в OnAllTrade нужны для того, чтобы предотвратить падения терминала после остановки скрипта (как известно, в версии 6.4 есть ошибка: обработчики вызываются и после завершения скрипта, приводя к падению терминала)</p><div class="codebox"><pre><code>function OnAllTrade(trade)
    if is_run == false then
        return
    end</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Sat, 12 Jan 2013 15:46:06 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=26&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Визуальный интерфейс IUP LUA в QUIK]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=25&amp;action=new</link>
			<description><![CDATA[<p>Здесь рассмотрю подключение и использование еще одной библиоеки визуального интерфейса для LUA - это библиотека <strong>iup</strong> и &quot;прослойка&quot; к ней <strong>iupLUA</strong>.</p><p>Вначале установим библиотеку, чтобы ей можно было пользоваться.<br />Для этого идем сюда [url]http://sourceforge.net/projects/iup/files/3.7/Tools%20Executables/[/url] и качаем файл <strong>iup-3.7_Win32_bin.zip</strong>.</p><p>Кроме этого есть смысл зайти вот сюда [url]http://sourceforge.net/projects/iup/files/3.7/Docs%20and%20Sources/[/url] и скачать документацию в удобном для вас формате (т.е. файлы, содержащие в названии &quot;<strong>Docs</strong>&quot;).</p><h5>Установка</h5><p>Распаковываем архив <strong>iup-3.7_Win32_bin.zip</strong>.<br />Переходим в папку, куда распакован архив, там заходим в <strong>Lua5.1</strong> и копируем в папку с установленным терминалом QUIK три файла:<br /></p><ul><li><p>iup.dll</p></li><li><p>iuplua51.dll</p></li><li><p>lua5.1.dll</p></li></ul><p>Последний файл колпировать только в том случае если вы его еще не устанавливали с другой библиотекой.</p><p>Возможно, если у вас не установлен соотв. run-time, еще необходимо будет скопировать из папки <strong>Lua5.1 \ Microsoft.VC80.CRT</strong> все три файла с расширением <strong>dll</strong> тоже с папку в QUIK, но это можно сделать позже, только если возникнет необходимость.</p><h5>Простой скрипт с использованием iupLUA</h5><p>Создадим в текстовом редакторе новый файл, назовем его, например, <strong>iup-test-1.lua</strong>. Вначале подключим библиотеку <strong>iupLUA</strong>. Сделать это можно двумя способами:</p><div class="codebox"><pre><code>package.cpath = package.cpath .. &quot;;&quot; .. getWorkingFolder() .. &quot;\\?51.dll&quot;
require( &quot;iuplua&quot; )</code></pre></div><p>либо так:</p><div class="codebox"><pre><code>assert(package.loadlib(getWorkingFolder() .. &quot;\\iuplua51.dll&quot;, &quot;luaopen_iuplua&quot;))()</code></pre></div><p>После чего добавим простой текст создания диалогового окна:</p><div class="codebox"><pre><code>dlg = iup.dialog
{
  iup.vbox
  {
    iup.label {title=&quot;Test iupLUA in QUIK&quot;},
    iup.button{title=&quot;Button Very Long Text&quot;},
    iup.button{title=&quot;short&quot;, expand=&quot;HORIZONTAL&quot;},
    iup.button{title=&quot;Mid Button&quot;, expand=&quot;HORIZONTAL&quot;}
  }
  ;title=&quot;IupDialog&quot;, font=&quot;Helvetica, Bold 14&quot;
}
dlg:show()

iup.MainLoop()</code></pre></div><p>Очень радует то, что [url=https://quik2dde.ru/viewtopic.php?id=20]в отличии от <strong>wxLUA</strong>[/url] при повторном вызове скрипта, использующего рассматриваемую библиотеку <strong>iupLUA</strong>, не возникает каких-либо проблем. Значит уже имеет смысл смотреть/разбираться дальше.</p><p>Впрочем, как обычно не все так радужно. При использовании приведенного выше скрипта принципиальные проблемы остаются теми же, что и с другими подобными фреймворками: при запуске скрипт полностью останавливается в <strong>iup.MainLoop()</strong> и дальше не идет, пока не будет закрыто диалоговое окно. Ну так вот оно сделано, и в общем-то понятно почему. Разумеется, это нарушает нормальную работу терминала QUIK, не отображает статус запущенности скрипта - ну и т.д. Наверняка можно наткнуться на разные проблемы и в работе самого торгового терминала (как там с горячими клавишами при запущенном скрипте? удается ли запустить еще скрипты?).</p><p>Чтобы избавиться от указанных проблем с остановкой скрипта в методе <strong>iup.MainLoop()</strong>, можно весь этот текст перенести в <strong>main()</strong>, тогда в общем-то видимые проблемы исчезнут полностью вообще все, но лишь до тех пор, пока мы не начнем как-то изменять содержимое элементов интерфейса из обработчиков событий. А проблемы, разумеется, сразу возникнут, т.к. <strong>main()</strong> выполняется в отдельном потоке; соответственно только кодом, вызываемым из <strong>main()</strong> можно модифицировать какие-либо элементы на созданных диалогах. Что, конечно, достаточно грустно, потому что хотелось бы отображать какие-то данные в процессе работы скрипта, иначе зачем нужны все эти диалоги и окошки.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Wed, 09 Jan 2013 20:21:20 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=25&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Библиотеки визуальных элементов GUI в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?id=21&amp;action=new</link>
			<description><![CDATA[<p>Есть предложение поделиться наработками по поводу подключения и использования библиотек визуальных элементов в QLUA.</p><p>Начну с себя.<br />Как известно, разработчики приводят в документации пример таблички, говорят, что сделана на <strong>wxLua</strong>.<br />Я пробовал подключить ее и использовать, но пока это не особо увенчалось успехом.</p><p>Например, возьмем простейший пример из поставки wxLua под названием <strong>veryminimal.wx.lua</strong>. Замечу, что в нем содержится функция <strong>main()</strong>, которая в QLUA является обработчиком события с предопределенным названием, поэтому весь полезный код вынесем за пределы этой функции пока, вставим лишь пустую main() чтобы QLUA не ругался. В итоге выкинув все лишнее (комментарии вначале и заполнение package.cpath) получаем:</p><div class="codebox"><pre><code>require(&quot;wx&quot;)

message(&quot;Start&quot;, 1)

frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, &quot;wxLua Very Minimal Demo&quot;,
                    wx.wxDefaultPosition, wx.wxSize(450, 450),
                    wx.wxDEFAULT_FRAME_STYLE )

frame:Show(true)

wx.wxGetApp():MainLoop()

message(&quot;End&quot;, 1)

--------
function main()
end</code></pre></div><p>Если этот текст сохранить в файл и запустить, то получим открывшееся окно, созданное средствами wxLua! Вроде все здорово, и терминал Quik даже работает. Однако, если посмотреть внимательнее, по выясняется:<br />а) Сообщения &quot;End&quot; нет, выведено только &quot;Start&quot;<br />б) Напротив скрипта стоит признак &quot;остановлен&quot; (красный квадрат), хотя наше окно открыто и функционирует.<br />в) Ни один обработчик скрипта LUA не работает (если его дописать, например, onAllTrade).</p><p>Если окно закрыть - увидим сообщение &quot;End&quot;. Выходит, скрипт наш стоял на строке<br /></p><div class="codebox"><pre><code>wx.wxGetApp():MainLoop()</code></pre></div><p>и дальше не шел, что очень грустно.</p><p>Как же работал при этом терминал QUIK?? очевидно, внутри MainLoop() содержится цикл обработки сообщений, который вполне устраивает QUIK (во всяком случае я не нашел проблем).</p><p>Если убрать строку<br /></p><div class="codebox"><pre><code>wx.wxGetApp():MainLoop()</code></pre></div><p>и дополнить функцию main() стандартным ожиданием остановки скрипта - терминал QUIK и вовсе зависает или что-нибудь в этом роде. Т.е. стандартный QUIK&#039;овский обрабтчик сообщений почему-то для wxLua не подходит.</p><p>Хорошо, а что если всю эту фтуковину убрать в main(), где она вроде мешать не будет? просто скопировать в нее весь код да и все, раз уж выхода из него не происходит, пока окно не закроешь?</p><div class="codebox"><pre><code>require(&quot;wx&quot;)

function main()
  message(&quot;Start&quot;, 1)

  frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, &quot;wxLua Very Minimal Demo&quot;,
                      wx.wxDefaultPosition, wx.wxSize(450, 450),
                      wx.wxDEFAULT_FRAME_STYLE )

  frame:Show(true)

  wx.wxGetApp():MainLoop()

  message(&quot;End&quot;, 1)
end</code></pre></div><p>На первый взгляд все хорошо: окно появляется, скрипт во состоянии &quot;работает&quot;, терминал живет. Закрываем окно, скрипт останавливается. Вроде все замечательно, но при повторном запуске скрипта терминал QUIK весь падает с Internal error.</p><p>Что еще придумать - не знаю. Есть ли у кого-нибудь идеи?</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sun, 23 Dec 2012 21:00:27 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?id=21&amp;action=new</guid>
		</item>
	</channel>
</rss>
