Обсудим диалог на Lua?

Страницы: 1
RSS
Обсудим диалог на Lua?
 
Если я ничего не напутал, возможности для организации диалога с пользователем (меню, чекбоксы, редактируемые поля и т.п.) практически отсутствуют. Между тем, скрипт в моём понимании есть не только (и даже не столько) торговый робот, сколько помощник юзера, обеспечивающий ему условия для комфортной торговли. Иными словами, он должен
а) снабжать пользователя необходимой актуальной информацией;
б) выполнять его команды;
в) самостоятельно совершать сделки в определённых юзером рамках;
г) быть в курсе действий пользователя, если тот торгует самостоятельно (режим "кентавра").

Возможности редактирования полей (например, указание цены покупки/продажи) или там чекбоксов я не нашёл, от слова "совсем". Короче, весь диалог, видимо, приходится строить только на "таблицах Lua". В использовании клавиатуры для диалога (например, стрелки, клавиши Enter, Escape) я пока не вижу особой необходимости, а вот мышку задействовать хотелось бы.

Сначала я создал собственную таблицу, похожую на таблицу текущих торгов, но содержащую интересующие меня сведения (текущая цена, информация о моих сделках, подсчёт текущей прибыли/убытка по каждому тикеру и т.п.), стал подкрашивать разные поля для наглядности. Всё бы хорошо, но таблица получилась довольно громоздкой, и я стал выдавать её в трёх режимах:
а) все тикеры, которые у меня есть или которые я хотел бы приобрести при случае;
б) все тикеры, по которым у меня есть покупки;
в) все тикеры, которые, по мнению скрипта, заслуживают моего внимания в данный момент (самый компактный вид).

Переключение режимов я организовал по двойному клику по левому столбцу (который с номерами строк и который в некоторых случаях было бы очень неплохо убрать, но я не умею), повесив на таблицу свой обработчик с помощью SetTableNotificationCallback(T,E), примерно так:
Код
function E(T,m,p1,p2)   -- реакция на события от юзера в таблице
 if m == QTABLE_LBUTTONDBLCLK then 
  if p2==-1 then    -- клик по левому столбцу
   if p1==0 then w();message("Файл результатов записан!");
   else iB=B[iB];end;   -- сменился тип выдачи, сообщаем юзеру
  end;      -- конец условия "клик по левому столбцу"
 end;      -- конец условия "двойной клик мыши"
end;      -- конец функции E()
А в мейне проинициализировал:
iB=1; -- тип выдачи: 1 - нужные, 2 - свои, 3 - все
B={2,3,1}; -- переключатель по типу выдачи (левый столбец)
В качестве кнопки "сохранить результаты" приспособил заголовок левого столбца (в который тоже не хило бы записать что-то типа "Save", но я не умею).

С помощью Lua "и какой-то матери" эта конструкция заработала вполне удовлетворительно, но это, так сказать, "групповуха", команды для ВСЕЙ таблицы. А вот при клике по ЯЧЕЙКЕ (с кодом тикера) хотелось бы иметь уже всплывающее меню, специфицирующее действия конкретно по этому тикеру, со своим обработчиком, примерно так:
"Купить" - приказ немедленно купить;
"Продать" - приказ немедленно продать;
"Auto" - разрешить скрипту самостоятельно совершать сделки с этим тикером;
"Вручную" - сделки по этому тикеру выполняет пользователь, и только он.

Проинициализировал такую таблицу прямо в мейн (как и таблицу визуализации результатов), а в обработчике повесил на клик по ячейке с кодом тикера соответствующий CreateWindow, и тут началась АМБУЛА.

Окно-то прорисовывается, но ПУСТОЕ. Подумал: я же в обработчике его вызываю! Стал там только устанавливать флаг необходимости прорисовки окна меню, а в цикле (в котором sleep) вставил:
if ft==1 then CreateWindow(t);ft=0;end;
Пофиг - окно снова рисуется, и снова пустое (заголовков и номеров строк тоже нет). Помню, там какая-то последовательность операторов была важна (уже забыл, какая) - может, в этом дело? Или прямо в цикле надо набивать таблицу значениями. Короче, мне это дело надоело, отложил до завтра, а здесь хотел бы послушать соображения на тему организации диалога. Например, неплохо было бы иметь аналогичную таблицу (вызываемую, видимо, по горячей клавише) с настройками работы скрипта прямо в процессе его исполнения.

Обсудим, господа?
 
рекомендую для общего понимания.
https://www.ibm.com/developerworks/ru/library/l-embed-lua/

Вы можете сделать все, что придумаете с помощью API C для LUA,
так как создание интерфейсов требует хорошего уровня программирования.

Увы, обычно уровень  хотелок у буратин обратен их уровню умения их реализовать.

 
 
nikolz, Меня не интересуют API C для LUA, меня интересует тот вопрос, который вынесен в заголовок.
 
Цитата
nikolz написал:
рекомендую для общего понимания.
https://www.ibm.com/developerworks/ru/library/l-embed-lua/

IBM, про Lua, по-русски, 2009 год  :shock:
Вы существенно расширили границы моего познания этого мира.
 
Цитата
ВладимирА в мейне проинициализировал:
....
Проинициализировал такую таблицу прямо в мейн (как и таблицу визуализации результатов),

Гнилое это дело в main()  (т.е. отдельном потоке) работать с визуальными элементами. Добром не заканчивается (это из общих соображений).
Хотя квиковцы с вызовом методв создания визуальных элементов из main() как бы справились, но не верю я, что там все надежно сделано.
Это так, общие мысли по поводу процитированного.

Цитата
Владимир написал:
Обсудим, господа?

Вопрос должен оформляться просто:
- полный код, который каждый может скопировать и запустить/проверить/поэкспериментировать, иллюстрирующий проблему (но желательно код наименьшего объема при этом)
- описание что ожидается
- описание как на самом деле
- вопрос "как сделать ожидаемое?"

Тогда, быть может, кто-то разберётся и ответит.

А все эти амбулы-шмамбулы - это вы для книжек своих поберегите, может их кто и прочитает. Но в вопросы такого плана никто вникать не будет.

Для полноценного интерфейса проще взять внешнюю библиотеку. Например такую. Не всё там просто и гладко, но хотя бы возможностей в самом деле много.
 
swerg, А при чём тут "визуальные элементы"? На этом форуме ещё несколько лет назад говорилось, что подготовка таблицы и прорисовка таблицы - это РАЗНЫЕ вещи, и давались предложения к разработчикам (проигнорированные) разделить эти вещи. Какое отношение к "визуальным элементам" имеет AllocTable? Или AddColumn? Или даже SetTableNotificationCallback, равно как и SetColor? Вот CreateWindow - имеет. Ну, SetCell, пожалуй, имеет (да и то спорный вопрос). Я свою таблицу визуализации готовлю именно в main! А строками её набиваю уже в "большом" прерывании (15-секундном), А ячейки значениями заполняю и раскрашиваю - уже в малом, полуторасекундном. При этом все три находятся именно в потоке main! Более того: ИМЕННО ТАК И НУЖНО делать - в данном случае "квиковцы" поступили совершенно правильно!

Да какой, в задницу, "полный код", если обсудить предлагается концепции, философию, алгоритмы? Кому он нужен, этот "полный код"? Я и хочу ОБСУДИТЬ, "что ожидается, как на самом деле и как сделать ожидаемое"! Я хочу поговорить С ПРОГРАММИСТАМИ! На кой мне эти "запускатели полного кода", которые "в вопросы такого плана вникать не будут"?

Господи, я же русским языком сказал: я хочу обсудить ДИАЛОГ НА LUA! Меня Не ИНТЕРЕСУЮТ все эти долбаные "полноценные интерфейса из внешних библиотек! ВААПЩЕ нее интересуют!
 
Владимир, а в чем, собственно, проблема?

И команды и переключатели, и поля ввода, горячие клавиши прекрасно делаются на qlua. Просто к таблице надо подойти как к объекту, наполнив его методами, обратными вызовами.
Я бы даже сказал, что надо написать свой DSL. Тогда, вызывая конструктор окна с настройками, получим уже готовый объект. В частности, у меня окно рисуется через таблицу настроек, все остальное уже заложено в объект. Надо добавить переключатель или что-то другое - одна строка таблице настроек.


Как к этому подойти - ну явно не надо писать простыню в main. Придется использовать очереди событий, сообщений и др. Также не советую использовать номера колонок, строк как идентификатор ячейки - это затрудняет модификацию окна. Часто просят переставить местами что-то. Это не должно приводить к переписыванию всего кода. Надо просто в одном месте поменять описание поля (колонки) таблицы.
 
Nikolay,Во! Это уже что-то похожее на обсуждение! Но отвечу попозже - сейчас биржа открывается, а у меня там несколько интересных позиций намечается...
 
Nikolay, сначала "в чем, собственно, проблема": мне хочется имет всплывающее меню, а оно у меня "всплывать" не хочет.  :smile:

Полностью согласен: таблица - это объект, а её прорисовка - один из его методов - что-то типа DrawTable, DrawRow, DrawCell.

Особо наполнять его обратными вызовами не хочется - меня тут на днях совершенно оглоушил Антон, рассказав, что обработчики здесь как священная корова, вызываются напрямую, и пока не закончат свою работу, Квик висит. Я пока вижу два обработчика: один на основную таблицу, другой на всплывающее меню. А "настройки окна" у меня действительно лежат в другой таблице (точнее, в дереве объектов), из которой я и набиваю таблицу визуализации - тоже согласен.

А почему бы и не "написать простыню в main"? Инициализация (у меня) - штука одноразовая (на сеанс) - ей самое место именно в main (OnInit я выбросил).

Да, очереди событий - штука просто идеальная для программирования диалога, но она требует "монитора" - утилиты, обслуживающей стек очередей этих самых событий. Я пока что опасаюсь делать это на Lua - тем более, что требования к диалогу здесь почти "никакие".

А вот не согласен! Я использую именно "номера колонок, строк как идентификатор ячейки"! У меня в основной таблице может быть до нескольких сотен строк и в данный момент там 22 столбца - номер использовать удобнее всего! Просто не надо забывать, что это на самом деле имя.

Да, это самое "одно место" я обычно называю паспорт (таблицы, строки или вообще объекта), часть которого у меня хранится прямо в таблице визуализации (метаданные в невидимых столбцах).
 
Владимир,Загугли уже VCLua. Ой, а Программист с 40-м стажем не умеет гуглем пользоваться, поэтому страдает  :lol:
Ой, а Программист с 40-м стажем не может осилить библиотеку.  :lol:  
 
Александр, Милок, если по теме сказать нечего, лучше помолчите, не нарывайтесь.  :wink:  
 
Владимир,Тебе уже сказали, чтобы реализовать твои хотелки надо использовать сторонние библиотеки, например VCLua или писать свой пипелац.
Но настоящие программисты идут своим путем  :lol:
Из коробки нет и вероятно не будет.
 
Александр, Лапуль, я не только 40 лет программистом - я ещё и почти 30 лет (я в Инете с 1992 года) гоняю всякую полуграмотную распальцованную шушеру.  :wink: В то время, кстати, никакого Гугла ещё и в помине не было, Альтависта была. И Яндекс уже был, и я был лично знаком с Ильёй Сегаловичем (была у нас одна совместная работёнка).

Я же сказал: меня НЕ ИНТЕРЕСУЮТ "сторонние библиотеки", меня интересует организация диалога на языке Lua! Сколько раз повторить, чтобы дошло, наконец?
 
Цитата
Владимир написал:
Александр, Лапуль, я не только 40 лет программистом - я ещё и почти 30 лет (я в Инете с 1992 года) гоняю всякую полуграмотную распальцованную шушеру.   В то время, кстати, никакого Гугла ещё и в помине не было, Альтависта была. И Яндекс уже был, и я был лично знаком с Ильёй Сегаловичем (была у нас одна совместная работёнка).

Я же сказал: меня НЕ ИНТЕРЕСУЮТ "сторонние библиотеки", меня интересует организация диалога на языке Lua! Сколько раз повторить, чтобы дошло, наконец?
Такие старые 40 летние пердуны программисты не могут понять, что без сторонних библиотек этого не делать. :lol: Это, братан фиаско! :lol:  
 
Александр, Лапуль, я ПИСАЛ подобные библиотеки! И добрая половина моих программ как раз диалоговые - в том числе, для проверки подключаемых к PC электронных модулей, в т.ч. с собственными микропроцессорами (загрузчик и пошаговый отладчик таких "внешних" программ тоже писал). Ну куда Вы прыгаете с голой жопой против танка, мальчишка сопливый?  :wink:  
 
Цитата
Владимир написал:
Александр, Лапуль, я ПИСАЛ подобные библиотеки! И добрая половина моих программ как раз диалоговые - в том числе, для проверки подключаемых к PC электронных модулей, в т.ч. с собственными микропроцессорами (загрузчик и пошаговый отладчик таких "внешних" программ тоже писал). Ну куда Вы прыгаете с голой жопой против танка, мальчишка сопливый?    
Ну если писал подобные библиотеки, то мог бы догадаться, что сидишь в процессе квика, делаешь хук  WndProc и творишь все, что душе хочешь. Но ведь не шмогла, правильно? :lol:  
 
Александр, Лапуль, я УЖЕ сделал какой-никакой диалог на Lua. И сделаю лучше - именно это я и хотел бы обсудить здесь, КАК это лучше сделать. Отойдите в сторонку, плиз, не путайтесь под ногами.
 
Цитата
Владимир написал:
Александр, Лапуль, я УЖЕ сделал какой-никакой диалог на Lua. И сделаю лучше - именно это я и хотел бы обсудить здесь, КАК это лучше сделать. Отойдите в сторонку, плиз, не путайтесь под ногами.
Слова win api и msdn за 40 лет не смог осилить? Используй lua api и win api, на си делаешь лучше. На OnInit создаешь любые окна, диалоги, менюшки, гриды и т. д.
Собственно это и есть решение.
 
Александр, Лапуль, я писал диалоговые программы, когда ещё никакого Win ваще не было, как и слова такого "api". OnInit мне НАФИГ НЕ НУЖЕН - есть main, и этого более, чем достаточно. И мне нужен диалог НА ЭТОМ языке, а не на какой-то подключаемой херне, написанной дядей Васей. Это не "решение", лапуль - это называется "говно".  :wink: Это при том, что С как раз мой любимейший язык на протяжении десятилетий, а Lua - очевидное говно. Но ЗДЕСЬ надо писать именно на Lua - язык ПОЛНОСТЬЮ обеспечивает необходимую функциональность - по крайней мере, для робота, которому все эти таблицы и весь этот диалог нафиг не нужны - это всего лишь дополнительный сервис для юзера, который торгует вместе с роботом.
 
Цитата
Владимир написал:
Александр, Лапуль, я писал диалоговые программы, когда ещё никакого Win ваще не было, как и слова такого "api". OnInit мне НАФИГ НЕ НУЖЕН - есть main, и этого более, чем достаточно. И мне нужен диалог НА ЭТОМ языке, а не на какой-то подключаемой херне, написанной дядей Васей. Это не "решение", лапуль - это называется "говно".   Это при том, что С как раз мой любимейший язык на протяжении десятилетий, а Lua - очевидное говно. Но ЗДЕСЬ надо писать именно на Lua - язык ПОЛНОСТЬЮ обеспечивает необходимую функциональность - по крайней мере, для робота, которому все эти таблицы и весь этот диалог нафиг не нужны - это всего лишь дополнительный сервис для юзера, который торгует вместе с роботом.
Старче, не важно, что ты писал, важно, что пишешь. Я уже не о херне, написанной дядей Васей. Я тебе говорю о lua api, которая является частью lua и ПОЛНОСТЬЮ обеспечивает необходимую функциональность и доступность таблиц и функций QLua. Что ты пишешь на Си + lua api, что на луа - так это равнозначно и можно использовать. Можешь на Си вызывать все функции доступные в квике через Lua. В общем все, что доступно в Lua, доступно в lua api и даже больше. OnInit тебе нужен (если соберешься писать) для того, чтобы создавать свои собственные окна и не иметь проблем с потоками. Хотя можешь замутить обработку окна в потоке. Но я вангую, что не сможешь. :lol:  
 
Здесь я с Владимиром согласен, не очень понятно зачем вносить лишние сущности в виде сторонних библиотек, если почти все что надо от скрипта можно сделать на qlua.
Да, нельзя показать картинки, не очень удобно выводить многострочный текст и т.д., но бантики не имеют отношения к тому что надо от интерфейса скрипта.

Писали же как-то программы раньше. Даже некое подобие 3-х мерного изображения выводили до Open GL. И ничего, научная работа велась.


Если уж интерфейс такой сложный, что он должен определять поведение скрипта, то проще написать весь скрипт на плюсах (QScalp), зачем мучить LUA, да еще VCLua на турбо паскале, которое притянет за собой
свои зависимости и проблемы синхронизации. Не говоря уже про то, что она, мягко говоря, устарела.
 
Александр, Лапуль, головожопые - это наш профиль, и вытравливаю я их вполне профессионально - просто не хочется этим заниматься ЗДЕСЬ. Может, заткнётесь по-хорошему, а?

Nikolay, Кстати, всплывающее меню у меня заработало, и данные появились, и свой обработчик событий подключился. При клике по основной таблице ставлю флаг необходимости прорисовки меню, а в цикле по этому флагу вызываю функцию, которая набивает меню данными (Clear сделать забыл, так она при каждом новом вызове дополнительные строки лепит  :smile: ) и подключает к нему свой обработчик событий (не рискнул сделать это в main, там только AllocTable, да AddColumn). Короче, вся интересующая меня функциональность практически реализована.
 
Владимир, Меню можно сделать и на одних заголовках столбцов, вообще без строк - тоже работает. Тогда оно будет горизонтальным. а не вертикальным, и не будет этих дурацких номеров строк слева. Правда, в этом случае курсор подкрасить не удастся (хотя лично мне он особо и не нужен).
 
Цитата
Владимир написал:
Александр, Лапуль, головожопые - это наш профиль, и вытравливаю я их вполне профессионально - просто не хочется этим заниматься ЗДЕСЬ. Может, заткнётесь по-хорошему, а?
И что сделаешь-то? Ты же ничего не можешь, даже не можешь документацию по lua прочитать. :lol:  
 
Александр, Не заткнётесь... ну, повизжи лапуль, повизжи - по "методике вытравливания головожопых" говно должно отвизжаться.
 
Цитата
Владимир написал:
Александр, Не заткнётесь... ну, повизжи лапуль, повизжи - по "методике вытравливания головожопых" говно должно отвизжаться.
Старче, расслабилось? Иди почитай документация по луа, чтобы детских вопросов не задавать.
 
Цитата
Владимир написал:
Обсудим, господа?
Что тут обсуждать -луа в квике практически такой же луа как и остальные, тебе бы стоило бы захаживать на различные луа ресурсы в инете и там есть решения твоего вопроса, непосредственно по твоему вопросу решение - использование функций WinAPI, для этого уже есть модуль для луа - https://github.com/stevedonovan/winapi, качаешь компилишь из исходников dll`ку подключаешь в луа скрипт с помощью require 'winapi' и юзаешь её функции, там и диалогбоксы можно создавать и еще много чего
 
Анатолий, Ещё один знакомое слово увидел, а текст почитать не удосужился...  :sad:  
 
Диалога не получилось.
 
swerg, Да, к сожалению. Но у меня диалог фактически получился: основная таблица по тикерам с тремя режимами выдачи (возможно, лучше с четырьмя - ещё один режим "остановить/включить обновление таблицы, чтобы юзер мог спокойно изучить её текущее состояние), переключение между ними закольцовано по двойному клику по крайнему левому столбцу или по клавише "пробел". За всё остальное отвечает всплывающее меню (двойной клик по ячейке с именем тикера). Теоретически его вызов можно бы и задублировать на клавишу Enter, а выход из меню на Esc, но лично я клаву сюда решил подключать только по необходимости. В этом меню две кнопки "купить" и "продать" для немедленной отправки заявки (возможно, их стоит задублировать по клику на какие-нибудь ячейки строк основного меню), да настройка статуса тикера (фактически пара битовых флагов, объединённых в код статуса тикера) - разрешить/запретить роботу покупать/продавать самостоятельно по этому тикеру (по умолчанию всё запрещено). Вот, собственно, и весь диалог, и лично  не вижу причин для дальнейшего наращивания его функциональности. Юзер, разумеется, может самостоятельно совершать сделки (робот ловит это дело по OnTrade). С транзакциями я пока толком не разобрался, так что тупо запретил подачу заявок, пока не исполнена предыдущая. Возможно, так и оставлю в окончательной версии скрипта.
Страницы: 1
Читают тему
Наверх