Модуль пользовательских таблиц

Опубликовано в QLua

В версии 6.6 терминала QUIK появилась возможность создавать пользовательские таблицы из языка Lua. Само API совершенно неудобоваримое, однако в документацию был добавлен пример использования и исходный текст обертки, позволяющей осмысленно общаться с API.

Я попробовал эту обертку. Обнаружились некоторые неудобства и неточности. Причесал. 

 

module ("qtable", package.seeall)

 

--------------------------------------------------------------------------------------------------

-- Создать и инициализировать экземпляр таблицы.

-- Возвращает дескриптор экземпляра или nil при неудаче

function new(self)

               local t_id = AllocTable()

               if t_id ~= nil then

                              descriptor = {     t_id = t_id,                                                                                   -- номер

                                                       caption = "",                                                                                -- заголовок окна

                                                       curr_col = 0,                                                                                -- количество столбцов

                                                       columns = {}                                                                                -- таблица с описанием параметры столбцов

                                                                                                       }

                              setmetatable(descriptor, self)

                              self.__index = self

                              return descriptor

               end

end

 

--------------------------------------------------------------------------------------------------

-- Отобразить в терминале окно с созданной таблицей

-- Возвращает true при успешном создании окна, иначе false.

function show(self)

               local result = CreateWindow(self.t_id)

               setcaption(self,self.caption)

               return result == 1

end

 

--------------------------------------------------------------------------------------------------

-- Если окно с таблицей закрыто, возвращает «true»

function isclosed(self)

               return IsWindowClosed(self.t_id)

end

 

--------------------------------------------------------------------------------------------------

-- Удалить таблицу

-- Все данные для отображения при закрытии окна удаляются.

-- В случае успешного выполнения возвращает «true», иначе – «false».

function delete(self)

               return DestroyTable(self.t_id)

end

 

--------------------------------------------------------------------------------------------------

-- Возвращает строку, содержащую заголовок таблицы

function getcaption(self)

               if IsWindowClosed(self.t_id) then

                              return self.caption

               else

                              return GetWindowCaption(self.t_id)

               end

end

 

--------------------------------------------------------------------------------------------------

-- Задать заголовок таблицы

-- В случае успешного выполнения возвращает «true», иначе – «false».

function setcaption(self,caption)

               self.caption = tostring(caption or "")

               if not IsWindowClosed(self.t_id) then

                              return SetWindowCaption(self.t_id, self.caption)

               end

end

 

--------------------------------------------------------------------------------------------------

-- Добавить описание столбца

--                           <name>               - название столбца

--                           <c_type> - тип столбца (необязателен, по умолчанию QTABLE_STRING_TYPE)

--                           <width>               - ширина столбца (необязательна, по умолчанию 10)

--                           <format_function> – функция форматирования данных для отображения (необязательна)

-- Возвращает true, если колонка в таблицу добавлена, иначе – false.

function addcolumn(self, name, c_type, width, format_function)

               c_type = c_type or QTABLE_STRING_TYPE

               self.curr_col       = self.curr_col + 1

               local col_desc = {             c_type                           = c_type,

                                                     format_function              = format_function,

                                                     id                                  = self.curr_col

                                       }

               self.columns[name]        = col_desc

               return AddColumn(self.t_id, self.curr_col, name, true, c_type, width or 10) == 1

end

 

--------------------------------------------------------------------------------------------------

-- Очистить таблицу

function clear(self)

               return Clear(self.t_id)

end

 

--------------------------------------------------------------------------------------------------

-- Установить значение в ячейке. Пустое значение очищает ячейку

function setvalue(self, row, col_name, data)

               local column_desc = self.columns[col_name]

               if column_desc == nil then

                              return false,"Нет столбца " .. col_name

               end

 

               if column_desc.c_type == QTABLE_CACHED_STRING_TYPE or column_desc.c_type == QTABLE_STRING_TYPE then

                              return SetCell(self.t_id, row, column_desc.id, data or "")

               end

 

               local format_function = self.columns[col_name].format_function

               if type(format_function) == "function" then

                              return SetCell(self.t_id, row, column_desc.id, format_function(data), data or 0)

               else

                              return SetCell(self.t_id, row, column_desc.id, tostring(data), data or 0)

               end

end

 

--------------------------------------------------------------------------------------------------

-- Добавляет в конец таблицы пустую строчку и возвращает ее номер

-- Возвращает номер добавленной строки при успешном выполнении, иначе – «-1».

 

function addline(self)

               return InsertRow(self.t_id, -1)

end

 

--------------------------------------------------------------------------------------------------

-- Возвращает размер таблицы

function getsize(self)

               return GetTableSize(self.t_id)

end

 

--------------------------------------------------------------------------------------------------

-- Получить данные из ячейки по номеру строки и имени столбца

-- Возвращаемое значение

--                           image – строковое представление значения в ячейке,

--                           value – числовое значение ячейки.

-- При ошибке возвращается nil

function getvalue(self, row, name)

               local column_desc = self.columns[name]

               if column_desc ~= nil then

                              return GetCell(self.t_id, row, column_desc.id)

               end

end

 

--------------------------------------------------------------------------------------------------

-- Задать координаты окна.

--  Координаты левого верхнего угла x,y и размеры dx, dy.

function setposition(self, x, y, dx, dy)

               return SetWindowPos(self.t_id, x, y, dx, dy)

end

 

--------------------------------------------------------------------------------------------------

-- Функция возвращает координаты окна

function getposition(self)

               local top, left, bottom, right = GetWindowRect(self.t_id)

               return top, left, right - left, bottom - top

end

 

--------------------------------------------------------------------------------------------------

Комментарии   

# Аркадий 24.12.2018 17:42
Круто, а нельзя чтоб в строчку вставлял все значения полученные колбеком. ?)
# admin 24.12.2018 18:22
Простите...

О какой строчке идёт речь, о каком колбеке и о каких значениях?
# Аркадий 24.12.2018 19:48
Строчка таблицы, по сути хочется запомнить переменную , там номер заявки, индификац номер, еще что то, а где еще кроме таблицы. incertrow вставлял не пустую строчку, а заполненную, в несколько колонок
# Аркадий 24.12.2018 19:52
может так попробую, каждый вызов колбека записывался в табличку
# Аркадий 24.12.2018 20:01
разных колбеков, точнее нескольких по желанию. Сообщения же выводит, а это в таблицу выводить.
# Аркадий 24.12.2018 19:49
insertrow что там писать после него
# admin 24.12.2018 21:35
Сначала нужно подписаться на требуемые колбеки

Потом создать шаблон таблицы в соответствии с теми данными, которые возвращают необходимые колбеки.

После чего в потоке терминала по приходу колбеков нужно сгружать доставляемые ими данные в очередь на обработку.
Далее уже в потоке скрипта разбирать эту очередь и заполнять таблицу.

Вы хотите, чтобы я это написал вам одной строчкой ? Одной строчкой я не смогу.
# Аркадий 25.12.2018 19:43
Походу никто не сможет, невозможно, фантазия у меня бурная., Вот поэтому скрипты как романы, голову сносит, положил на стол.,
Нагородили, толи дело промышленное программировани е(
# admin 25.12.2018 20:41
Почему невозможно? Вполне возможно.

Только это не одна строчка текста и даже не две.

Задача тривиальная, ничего сложного и интересного в ней нет. Нужно просто садиться и писать ее в случае необходимости.
# Аркадий 26.12.2018 12:54
Вот и с необходимостью тоже пока не придумал. Но спинным мозгом почувствовалось , что то в этом есть нужное, ... инвестор озаботился...

Недостаточно прав для комментирования

Архив QLua