Модуль пользовательских таблиц
В версии 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
--------------------------------------------------------------------------------------------------
