76 (2013-11-30 22:48:06 отредактировано swerg)

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

В смысле взять в QUIK данные и на их основе нарисовать график, верно понял?
В Lazarus есть готовый TChart, правда его не добавили в VCLua. Можно попробовать на его основе, например.

В общем "раз-два" - не получится, покопаться придется.

77 (2014-01-06 17:01:04 отредактировано Arhn)

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

А как отследить левый и правый клик мышки? Есть такая возможность?

78

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

Возможность есть.
На каком элементе, чтобы пример готовый привести? и что хотите сделать по клику?

79 (2014-01-06 19:39:46 отредактировано Arhn)

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

swerg пишет:

Возможность есть.
На каком элементе, чтобы пример готовый привести? и что хотите сделать по клику?

А можно пример на таблице (StringGrid), делаем клик левой кнопкой мыши по строке, а в строке число увеличивается на +1, правый клик уменьшает на -1 как в EasyScalp?

80 (2014-01-07 23:16:09 отредактировано swerg)

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

Arhn,
вот пример, реализующий описанный сценарий.
Суть в самом конце, в обработчике OnGridMouseDown()

require "vcl"

mainForm = VCL.Form("mainForm")
mainForm._ = { position="podesktopcenter", height=250, width=330, Caption="Cell click test", OnClose = "OnFormClose" }

grid=VCL.StringGrid(mainForm,"grid")
grid._={
align="alClient",
RowCount=5,
AutoEdit=False,
FixedCols=0,
FixedRows=1,
Flat=True,
OnMouseDown="OnGridMouseDown"
}

grid:SetColParams({
{
Width=100,
Alignment="taRightJustify",
Color=0xFFFFFF,
Title={
Color=0xEEEEEE,
Caption="col1",
Alignment="taCenter"
}
},
{
Width=100,
Alignment="taRightJustify",
Color=0xFFFFFF,
Title={
Color=0xEEEEEE,
Caption="col3",
Alignment="taCenter"
}
},
{
Width=100,
Alignment="taRightJustify",
Color=0xFFFFFF,
Title={
Color=0xEEEEEE,
Caption="col3",
Alignment="taCenter"
}
}
}) 

for i = 0, 2 do
  for j = 1, 4 do
    grid:SetCell(i, j, "1")
  end
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 OnFormClose(Sender, CloseAction)
  is_run = false
  mainForm:Release()
end

function OnGridMouseDown(Sender, Button, Shift, x, y)
  local delta
  if     Button == "mbLeft" then
    delta = 1
  elseif Button == "mbRight" then
    delta = -1
  end
  local c,r = grid:MouseToCell(x, y)
  grid:SetCell(c, r, tostring(grid:GetCell(c,r) + delta))
end

81

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

swerg.
Спасибо Вам огромное. Все отлично получилось. И ещё один из плюсов - мой код уменьшился.
А где можно взять инфу с описанием функций и т.д.? В КВИК-овском chm описаний нет.

82 (2014-01-08 23:43:12 отредактировано swerg)

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

Разумеется, в квиковской справке ничего этого нет, ведь это сторонняя библиотека для Lua, с QUIK она никак не связана.

Как известно, сделана VCLua в среде Lazarus (это этакая кросс-платформенная реализация языка Pascal на основе компилятора Freepascal плюс библиотека визуальных компонент, сделанная по мотивам штатной библиотеки VCL из Delphi). [url=http://www.lazarus.freepascal.org/]Lazarus этот запросто можно установить[/url] на Linux или Window машину.

Дальше идея в библиотеке VCLua простая: в нее перетянуты несколько компонент, доступных в этой самой Lazarus/Delphi.
Из Lua через эту библиотеку доступны все Published-свойства таких компонент (т.е. классов; Published - это такой тип видимости для мембер-свойств класса в Pascal), плюс доступны некоторые другие свойства, которые были специально добавлены разработчиками VCLua. При этом, т.к. исходники доступны - каждый легко может добавить любую отсебятину по вкусу.

Собственно потому, что свойства компонент, доступных в VCLua, совпадают с таковыми в Delphi/Lazarus - автор и не видел смысла делать хелп, так я думаю )
(не смотря на то, что у меня есть стойкое впечатление, что я хелп, хоть и весьма бестолковый, по VCLua видел, но что-то совершенно не попадается он мне сейчас; глюки?)

Но ближе к вопросу. На примере StringGrid покажу алгоритм как я ищу те или иные методы, доступные из Lua в библиотеке VCLua.

1. Что касается Published свойств и событий - то у меня просто установлена Lazarus, мне проще посмотреть там (бросив на форму компонент StringGrid и посмотрев какие есть свойства и события). Все Published-свойства и события как раз доступны и отображаются визуально. Кто пользовался Delphi - понимает о чем я.
Хорошая справка по всем свойствам/методам/событиям есть в Delphi, для Lazarus я что-то не нашел (хотя, вроде, видел). На сайте embarcadero (производителя Delphi) мне что-то тоже не попалось online-хелпа. Найдется ссылка - добавлю сюда.
В общем я просто смотрю прямо в Lazarus.
Например, нам нужно найти событие клика мыши. Смотрим список событий - понятно, что это OnClick. Там же смотрим его параметры и добавляем их в наш Lua-код для соответствующего назначенного на событие обработчика.

2. Второй источник инфы - это исходники VClua.
Какие методы, кроме тех, что в Lazarus/Delphi объявлены как Published, доступны для грида в VCLua?
В исходниках VCLua открываем файл LuaStringGrid.pas и в нем смотрим содержание функции ToTable(). Таковая есть во всех модулях. В ней вот в таком виде перечислены все свойства-методы, доступные в StringGrid в коде Lua из через библиотеки VClua помимо тех, которые имеют тип Published:

procedure ToTable(L:Plua_State; Index:Integer; Sender:TObject);
begin
  SetDefaultMethods(L, Index, Sender);
  SetAnchorMethods(L,Index,Sender);

  LuaSetTableFunction(L, Index, 'GetCell', @CellsGet);
  LuaSetTableFunction(L, Index, 'SetCell', @CellsSet);
  LuaSetTableFunction(L, Index, 'SetCellColor', @SetCellColor);
  LuaSetTableFunction(L, Index, 'ColToTable', @ColsGet);
// .........
  LuaSetTableFunction(L, Index, 'MouseToCell', @GetMouseToCell);

// ......... здесь еще несколько вызовов для добавления разных "методов", опускаю для упрощения ......

// ......... а это стандартная концовка функции ToTable(), таким образом добавляются все те методы, которые объявлены как published, т.к. информация о них они доступна через RTTI ......

  LuaSetMetaFunction(L, index, '__index', LuaGetProperty);
  LuaSetMetaFunction(L, index, '__newindex', LuaSetProperty);

end;

Дуступные из Lua-названия методов те, что написаны в апострофах.
Там как раз видим ту самую MouseToCell, которая нужна нам, чтобы перевести текущие координаты мыши в момент клика в номер столбца/строки грида. Параметры опять же можно посмотреть по справке Delphi/Lazarus, плюс заглянуть в исходник функции GetMouseToCell чтобы увидеть какие и сколько параметров она принимает (первый параметр для любого метода - всегда сам компонент, т.е. здесь Grid, чтобы обеспечить синтаксис вида grid:Method! не забываем про это) и какие параметры, сколько и как именно возвращает. Соответственно видим, что принимается 3 параметра (грид, x, y) и возвращается 2:

function GetMouseToCell(L: Plua_State): Integer; cdecl;
var
  lStringGrid:TLuaStringGrid;
  X,Y,c,r :Integer;
begin
  CheckArg(L, 3, 'GetMouseToCell');
  lStringGrid := TLuaStringGrid(GetLuaObject(L, 1));
  X := trunc(lua_tonumber(L,2));
  Y := trunc(lua_tonumber(L,3));
  lStringGrid.MouseToCell(X, Y, c, r);
  lua_pushnumber(L,c);
  lua_pushnumber(L,r);
  Result := 2;
end;

83

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

Что за ...? Где ошибка? Подскажите, что не так...
Хотел сделать стакан чтобы вывести все цены от минимальной до максимальной с шагом цены (первый столбик), но у меня вот, что выходит:

http://i60.fastpic.ru/big/2014/0109/ae/d60474202bf2d61db950067c522f08ae.jpg

Иногда нормально показывает, а иногда такая хрень.

Код:

[+]Spoiler

require "vcl"

CLASS = "QJSIM"
SEC   = "SBER"


function OnQuote(class_code, sec_code)
local qt = getQuoteLevel2(CLASS, SEC)
local i
local stepPrice = 0 + getParamEx(CLASS, SEC,"SEC_PRICE_STEP").param_value -- Получаем шаг цены
    local minPrice = qt.bid[1].price+0                        -- Минимальная цена
    local maxPrice = qt.offer[qt.offer_count+0].price+0        -- Максимальная цена
    local spanPrice = maxPrice - minPrice                    -- Разница между максимальной и минимальной цены
    local countRow = math.modf (spanPrice/stepPrice)+1        -- Количество нужных строк для таблицы (лучше на одну строку больше иметь чем если будет не хватать)

    LabelInfo1.Caption = "Мин. цена = "..minPrice
    LabelInfo2.Caption = "Макс. цена = "..maxPrice
    LabelInfo3.Caption = "Разн. цен = "..spanPrice
    LabelInfo4.Caption = "Кол. строк = "..countRow

    grid.RowCount = countRow+1
    -----
    for i=0, countRow do
        if i >= grid.RowCount then
            break
        end
        grid:SetCell(0, countRow-i, minPrice)
        minPrice = minPrice + stepPrice   
    end
end

84

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

sisfc,
не, не могу сообразить по приведенному вами обрывку.
Давайте полный код, тогда можно будет разбираться.
Можно на почту swerg@swerg.ru

85

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

Подскажите, пожалуйста, я сделал в StringGrid одну колонку PickList-ом (выподающим списком), теперь не знаю как добавить туда свои данные (хотел добавить слова "Покупка" и "Продажа"). Кто знает как это сделать?
Спасибо.

86 (2014-01-27 20:53:36 отредактировано swerg)

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

Arhn,
извиняюсь за такой долгий "неответ"

По существу могу сказать, что в VCLua средств работы с PickList в столбцах StringGrid - нет.

Кстати, я тут повнимательнее посмотрел на код и хотелось бы поправиться по поводу какой-то своей предыдущей фразы про то, что все Published свойства компонент в VCLua безусловно добавляются и доступны из Lua.
Это не так. Доступны лишь те свойства, которые явно прописаны разработчиков в коде VCLua.

87

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

Здравствуйте. Помогите, пожалуйста, разобраться.  Пытаюсь в элементе VCL.Edit установить начальное значение (иначе при запуске в поле появляется надпись его названия). Но постоянно слетает терминал. Вот код.

-- Описание формы
mainForm = VCL.Form("mainForm")
mainForm.Caption = "Газпром"
mainForm._= { position="podesktopcenter", height=290, width=310, OnClose = "OnCloseForm"}

--Описание Меню
mainMenu = VCL.MainMenu(mainForm,"mainMenu")
mainMenu:LoadFromTable({
    {name="mmfile", caption="&File", 
        submenu={
            {caption="Exit", onclick="onMenuExitClick"}, 
        }
    }
})
-- Описание текстового бокса
HighTextBox = VCL.Edit(mainForm,"High")
HighTextBox._ = {width=80, height=80, Top=147, Left=100, Color = 0x00FF0000, AutoSize = true, OnChange = "onHighChange"}
HighTextBox.Font.Color = 0x000000FF
HighTextBox.Font.Size = 20


--Описание лейбла
label_1 = VCL.Label(mainForm,"Label")
label_1.Caption = "PROBA"
label_1.Top = 10
label_1.Left = 10
label_1.Font.Size = 20
a = 1

    mainForm:Show()    
    is_run = true   
    HighTextBox.Text = "123"
            
-- Функция MAIN
function main()    
    
    while is_run do
       sleep(50)  
    end    

end

-- Функция записи информации и сделке
function OnAllTrade(trade)
    if is_run == false then
        return
    end
    
    if (trade.seccode == "SiH4") then
      a = a + 1  
--      label_1.Caption = " Сделки " .. a .. "  Цена  " .. trade.price 
    end
end

-- Функция обработки изменений в текстовом боксе
function onHighChange(Sender)
    label_1.Caption = HighTextBox.Text
end

--Функция закрытия меню
function onMenuExitClick()
    OnStop()
end

-- функция закрытия формы
function OnCloseForm()
    OnStop()
end

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

И еще один вопрос. При попытке заменить событие "OnChange" на "OnEnter" в элементе Edit терминал тоже слетает, как будто такого события нет, хотя в документации есть.

88

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

С первым разобрался. Поставил HighTextBox.Text = "123" внутрь функции main() и все заработало. Хотя где то читал, что из функции main() не рекомендуется обращаться к визуальным элементам.

89

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

Karim,

Со свойством Text у EditBox'а - и в самом деле какая-то засада. Установить Text до отображения формы из кода - не удается с разными ошибками.

Поместить в main()  - идея, конечно, не здоровская, т.к. могут быть "спец-эффекты".

По поводу события  "OnEnter" - для чего вы хотите его использовать? это событие получения EditBox'ом фокуса ввода, вам оно точно нужно?
"OnEnter" работает, работает, но только если оно привязано не к элементу, который сразу первым получает фокус ввода. Потому что в этом случае оно сразу срабатывает - и где-то здесь наступает проблема.
А вот если привязать это событие ко второму элементу ввода, т.е. к тому, которое не получает фокус ввода при создании - то всё отлично.

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

require "vcl"

mainForm = VCL.Form("mainForm")
mainForm.Caption = "Газпром"
mainForm._= { position="podesktopcenter", height=290, width=310, OnClose = "OnCloseForm"}

EditBox1 = VCL.Edit(mainForm,"EditBox1")
EditBox1._ = {width=180, Top=16, Left=16, OnChange = "onEditBox1"}  --, Text = "123"}  -- раскомментировать конец - падает

EditBox2 = VCL.Edit(mainForm,"EditBox2")
EditBox2._ = {width=180, Top=46, Left=16, OnEnter = "onEnterBox2"}

Label1 = VCL.Label(mainForm,"Label")
Label1._ = { Caption="Label1", Top=76, Left=16 }
Label1.Font.Size = 20

--EditBox1.Text = "22"  -- если раскомментировать - падает

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

function onEditBox1(Sender)
    Label1.Caption = EditBox1.Text
end

function onEnterBox2(Sender)
    Label1.Caption = "EditBox2.onEnter"
end

function OnCloseForm()
    OnStop()
end

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

Здесь onEnter привязано ко второму EditBox'у, и оно отлично срабатывает, когда тот получает фокус ввода.
А вот если привязать его же к первому (котооре получает фокус ввода сразу) - QUIK падает...

Надо разбираться, непорядок.

90

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

Спасибо за ответ.
Не знал, что 'onEnter' - получение фокуса ввода. Думал, что событие наступает при нажатии <Enter>. Мой касяк. Хотел сделать ввод как в Excel.
Придется разбираться с "OnKeyDown".

91

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

Все отлично работает. Сделал как и хотел. Обработчик события  "OnKeyDown":

function onKeyEnter(Sender, Key, Shift)
    if Key == 13 then
        label_1.Caption = HighTextBox.Text
    end
end

Спасибо, что помогли разобраться.

92

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

Решил проблему инициализации EditBox'а перед выводом формы, правда когда их два.

 LowTextBox:SetFocus()
    HighTextBox.Text = "35100"
    HighTextBox:SetFocus()
    LowTextBox.Text = "35000"

Когда EditBox  один, как убрать с него фокус не понятно.

93 (2014-02-10 23:58:36 отредактировано 888)

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

Подскажите пожалуйста. Я сделал в StringGrid  колонку cbsCheckboxColumn-ом (ButtonStyle="cbsCheckboxColumn"), теперь не знаю как в нем управлять CheckBox-ами (ставить их в положение true или false). Помогите пожалуйста. Спасибо.

94 (2014-02-11 19:50:24 отредактировано 888)

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

Я знаю, что если дать редактировать таблицу (grid.Options = grid.Options.."goEditing"), то можно это сделать от руки, но как это сделать программно ...?

95

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

Всё. Всем спасибо. Не надо. Решил. Оказывается там надо присваивать значения или 0 (что равно false), или 1 (что равно true)

96

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

888,
приветствую вас на форуме!

И большое вам спасибо за,то делитесь своими находками здесь. Буду признателен, если будете заглядывать почаще и делиться новостями )

97

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

Пожалуйста, научите работать с ToolBar-ом. Как в него добавлять кнопки, сепараторы и т.д.?
Спасибо.

98 (2014-03-06 22:22:31 отредактировано 888)

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

Arhn пишет:

Пожалуйста, научите работать с ToolBar-ом. Как в него добавлять кнопки, сепараторы и т.д.?
Спасибо.

Как работать с  ToolBar-ом не знаю, но у меня что-то получилось так:

[+]КОД

require "vcl"

mainForm = VCL.Form("mainForm")
mainForm._= { position="podesktopleft", height=50, width=488, Color=cl0000, OnClose = "OnFormClose" }


mainToolbar = VCL.ToolBar(mainForm,"mainToolbar")
mainToolbar._={ Color=0xffffff, ShowHint=true, Hint="ToolBar" }

tbsCheckToolButton = VCL.ToolButton(mainToolbar,"tbsCheckToolButton")
tbsCheckToolButton._={ Style="tbsCheck", ShowHint=true, Hint="Style=tbsCheck" }

tbsSeparatorToolButton = VCL.ToolButton(mainToolbar,"tbsSeparatorToolButton")
tbsSeparatorToolButton._={ Style="tbsSeparator", ShowHint=true, Hint="Style=tbsSeparator" }

tbsDropDownToolButton = VCL.ToolButton(mainToolbar,"tbsDropDownToolButton")
tbsDropDownToolButton._={ Style="tbsDropDown", ShowHint=true, Hint="Style=tbsSeparator" }

tbsDividerDownToolButton = VCL.ToolButton(mainToolbar,"tbsDividerDownToolButton")
tbsDividerDownToolButton._={ Style="tbsDivider", ShowHint=true, Hint="Style=tbsDivider" }

tbsButtonToolButton = VCL.ToolButton(mainToolbar,"tbsButtonToolButton")
tbsButtonToolButton._={ Style="tbsButton", ShowHint=true, Hint="Style=tbsButton" }

tbsDividerDownToolButton1 = VCL.ToolButton(mainToolbar,"tbsDividerDownToolButton1")
tbsDividerDownToolButton1._={ Style="tbsDivider", ShowHint=true, Hint="Style=tbsDivider" }

buttonToolButton = VCL.Button(mainToolbar,"buttonToolButton")
buttonToolButton._={ Caption="Button", ShowHint=true, Hint="Button" }

tbsDividerDownToolButton2 = VCL.ToolButton(mainToolbar,"tbsDividerDownToolButton2")
tbsDividerDownToolButton2._={ Style="tbsDivider", ShowHint=true, Hint="Style=tbsDivider" }

ToggleBoxToolButton = VCL.ToggleBox(mainToolbar,"ToggleBoxToolButton")
ToggleBoxToolButton._={ Caption="ToggleBox", ShowHint=true, Hint="ToggleBox" }

tbsSeparatorToolButton1 = VCL.ToolButton(mainToolbar,"tbsSeparatorToolButton1")
tbsSeparatorToolButton1._={ Style="tbsSeparator", ShowHint=true, Hint="Style=tbsSeparator" }

comboBoxToolButton = VCL.ComboBox(mainToolbar,"comboBoxToolButton")
comboBoxToolButton._={ Text="ComboBox", ShowHint=true, Hint="ComboBox" }


is_run = true

mainForm:Show()

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

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

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

99 (2014-03-09 22:31:12 отредактировано Arhn)

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

Ребята, ещё один вопрос. Как удалить конкретную строку в таблице, например в таблице из пяти строк удалить третью строку (не данные строки, а именно строку)?

100 (2014-03-10 10:49:56 отредактировано Arhn)

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

Все. Разобрался.
grid:DeleteColRow(isColumn, 3)

Но теперь другой вопрос как убрать синее выделение в таблице?