Здравствуйте! Пытаюсь создать таблицу для последующего вывода на экран. Но почему-то в нее не добавляются строки. Вдобавок не отображается заголовок окна. И при вызове функции DestroyTable() окно не закрывается (хотя должно, как я понял из документации). Что я делаю неправильно? Вот код:
Код
stopped = false
function OnStop(stop_flag)
stopped = true
end
function main()
t_id = AllocTable()
res = AddColumn(t_id,1,"col1",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res), 1)
res = AddColumn(t_id,2,"col2",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res), 1)
row1 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row1), 1)
row2 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row2), 1)
SetWindowCaption(t_id, "Моя таблица")
CreateWindow(t_id)
while not stopped do
sleep(1000)
end
DestroyTable(t_id)
end
Из сообщений в терминале видно, что InsertRow в обоих случаях возвращает 0.
1. надо забыть про работу в "майне", как дурной тон. 2. что будет если таблиц будет несколько? именно для этого и придумали классы. 3. при создании объекта "таблица", (без использования враппера), имеет очень большое значение порядок вызова методов, т.е. по сути, порядок создания объекта должен соблюдаться. это нигде не описано у разработчиков да и мой вариант врядли можно назвать абсолютно правильным но, как-то вот так (слегка переделанный твой вариант):
Код
is_run = true
function OnInit()
t_id = AllocTable()
res = AddColumn(t_id,1,"col1",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res))
res = AddColumn(t_id,2,"col2",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res))
CreateWindow(t_id)
row1 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row1))
row2 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row2))
SetWindowCaption(t_id, "thats my table")
end
function main()
while is_run do
sleep(100)
end
end
function OnStop()
DestroyTable(t_id)
is_run = false
return 1000
end
Таблица создаётся, колонки и строки добавляются, заголовок меняется, из меню закрывается и останавливается. Для того, чтобы скрипт останавливался при нажатии "крестика" в окне таблицы - надо уже прикручивать коллбек, что мне делать уже лень. Думаю сам разберёшься.
Дмитрий Вот так все работает: -------------------------------------------
local stopped, t_id ------------------------------------------------ function main() t_id = AllocTable() res = AddColumn(t_id,1,"col1",true,QTABLE_STRING_TYPE,30) message("AddColumn - " .. tostring(res), 1) res = AddColumn(t_id,2,"col2",true,QTABLE_STRING_TYPE,30) CreateWindow(t_id) SetWindowCaption(t_id, "Моя таблица" ;) local row = InsertRow(t_id, -1); SetCell(t_id, row, 1, "тест" ;) row = InsertRow(t_id, -1) ; SetCell(t_id, row, 2, "привет" ) while not stopped do sleep(1000) end end ------------------------------------------------- function OnStop(s) stopped = true if t_id~= nil then DestroyTable(t_id) end end
---------------------------------------------------- У Вас основная ошибка в том, что Вы пытаетесь работать с таблицей, т е добавлять строки и изменять название до ее создания - CreateWindow(t_id)
sam063rus пишет: 1. надо забыть про работу в "майне", как дурной тон.
Обоснуйте.
Цитата
sam063rus пишет: 2. что будет если таблиц будет несколько?
Идентификатор таблицы вам на что?
Цитата
sam063rus пишет: 3. при создании объекта "таблица", (без использования враппера), имеет очень большое значение порядок вызова методов
Можно подумать, с использованием враппера порядок вызова не имеет значения. Единственное, заголовок можно задать до вызова функции :Show(). Но только потому, что в самой функции :Show() заголовок задаётся повторно после CreateWindow():
Код
function QTable:Show()
-- отобразить в терминале окно с созданной таблицей
CreateWindow(self.t_id)
if self.caption ~="" then
-- задать заголовок для окна
SetWindowCaption(self.t_id, self.caption)
end
self.created = true
end
Надо делать так, как надо. А как не надо - делать не надо.
Серж пишет: sam063rus пишет: 2. что будет если таблиц будет несколько? Идентификатор таблицы вам на что?
тут разговор про то, что размер кода, равно как и число переменных значительно увеличаться, что приведёт к полной неразберихе в коде.
Цитата
Серж пишет: Можно подумать, с использованием враппера порядок вызова не имеет значения
имеется ввиду, что враппер уже описан и в нём УЖЕ учтён правильный порядок, который разработчики так и не удосужились привести в документации. Нетрудно заметить, что подход "в лоб" у автора не сработал. Поэтому я лишний раз и обратил внимание на правильность порядка работы с контролом.
Цитата
Серж пишет: sam063rus пишет: 1. надо забыть про работу в "майне", как дурной тон. Обоснуйте.
работа в "main" - это работа в другом потоке.
--------------------------------------------------------------------------------------------------------------- я так понял, что Вам бы лишь, что-нибудь написать. Или у Вас просто настроение не задалось?
Серж пишет: И не имеет значения, в каком потоке строится таблица: в основном или в main.
если писать весь скрипт в одном "майне" и целиком в основной части скрипта то "Да" - не имеет. Но так можно писать и на тупайле. смысл тогда использовать LUA? А вот когда часть кода "и там и там" тут начинается геморрой из=за которого некоторые, казалось бы очевидные вещи начинают работать не так, как должно быть.
поэтому работу с майн лучше свести к минимуму. Подчеркну: не полностью отказаться, а свести к минимуму, оставив в нём лишь работу с разделяемыми переменными.
sam063rus, Во-первых, вы мне не тыкайте. Мы с вами не пасли коров в одном колхозе. Во-вторых, судя по вашей активности на форуме, потроллить пришли сюда вы.
Я вопросы задаю не интереса ради, а уточнить чтобы, может, я что-то упустил при разработке. Но, похоже, ничего конкретного вы мне сказать не можете.
Цитата
sam063rus пишет: тут разговор про то, что размер кода, равно как и число переменных значительно увеличаться, что приведёт к полной неразберихе в коде.
При использовании враппера уменьшится количество необходимых переменных для хранения идентификаторов таблиц? Насчёт неразбирихи - это от автора творения зависит. :)
Цитата
sam063rus пишет: имеется ввиду, что враппер уже описан и в нём УЖЕ учтён правильный порядок
Ничего подобного: попробуйте добавить строку до создания окна.
Насчёт работы в main, то тут зависит от конкретной поставленной задачи. Не бывает одного универсального решения для всех задач.
Надо делать так, как надо. А как не надо - делать не надо.
вот честно говоря, уже неохота, что-то писать. Вы просто убиваете тему своим выяснением отношений. 1. Насчёт работы с "майном" - всё уже детально обсуждено и описано на quik2dde.ru
2. При использовании враппера - выигрыш в том, что это всё изолировано и не приводит к засорению программы, повышает читаемость. Справедливости ради, замечу, что я - сторонник того, чтоб враппер располагался в qlua.dll, а не в коде LUA-скрипта. Но в данной теме это не обсуждается, поэтому я её не развиваю.
3. подобного Не подобного. Я чувствую, что Вампросто захотелось поспорить. Ещё раз повторю: враппер делался разработчиками. Если у Вас есть вопросы по врапперу - задавайте им. Со своей стороны, я уже отметил в предыдущих постах, что КРАЙНЕ ВАЖНО СОБЛЮДАТЬ ПОРЯДОК РАБОТЫ С КОНТРОЛОМ. привёл рабочий пример. Что Вам ещё тут нужно доказывать/обсуждать/выяснять? Какой смысл от всех этих последних 10-ти постов??? Или Вы так любите, чтоб последнее слово было за Вами? Чтож, тогда умолкаю, я везде был не прав, несу полную чушь и полный бред, прошу меня понять и простить. Вам так легче? Вы это хотели услышать?
Серж и sam063rus, спасибо за помощь! Про порядок вызова функций в документации, к сожалению, ничего не сказано. Использование враппера, судя по его тексту, скорей всего привело бы к той же самой ошибке при добавлении строк, если бы я добавлял их функцией QTable:AddLine() до вызова QTable:Show(). Во всяком случае в примере его использования из справки сначала идет Show, а уже потом AddLine. Наверное, при работе с большим числом таблиц удобней было бы использовать quik_table_wrapper.lua, но мне было нужно создать одну простейшую таблицу для эмуляции работы экранной кнопки типа старт/стоп и одной настройки в виде check box. С экранными таблицами раньше не работал, поэтому решил пока не заморачиваться изучением текста quik_table_wrapper.lua.
Николай Камынин, и Вам спасибо! :) Не ожидал, что столько ответов получу на свой вопрос.
Цитата
Серж пишет: Функции работы с таблицами, в т.ч. DestroyTable() не работают после нажатия кнопки "Остановить", поэтому их вызов надо размещать в колбеке OnStop().
А об этом где-то разработчики писали или это тоже из разряда нигде не упоминающихся особенностей?
Поймите меня правильно: судя по вопросам автор темы только начинает изучать графические возможности QLUA. Не стоит вводить в заблуждения пользователей своими убеждениями. Поэтому я и предложил обосновать фразу "надо забыть про работу в "майне". Полагал, что, возможно узнаю что-то новое для себя, а не спора ради. Но увы... :( Касаемо вашего примера: по моим убеждениям (поправьте, если не прав) инициализацию, в т.ч. создание визуальных таблиц, не стоит выполнять в основном потоке без определённой на то необходимости. Т.к. создание таблиц занимает время; создание больших таблиц - много времени. При создании таблицы в основном потоке работа других скриптов может быть приостановлена на это время, особенно если их работа строится исключительно на колбеках. К тому же, создать таблицу можно в main, а заполнять значениями по событиям в колбеках - нет проблем. ;)
Что касается враппера, то тут дело вкуса. Но его использование не освобождает пользователя от необходимости следить за порядком вызова функций. К тому же, ИМХО, при частой модификации / обращении к элементам таблицы, использование враппера может снизить производительность скрипта.
Цитата
Дмитрий пишет: А об этом где-то разработчики писали или это тоже из разряда нигде не упоминающихся особенностей?
Разработчикам "эта особенность" давно известна, но, судя по тому, что они не считают нужным сообщать о ней где либо, то скорее это - т.н. "пасхалка". И периодически на форуме появляются сообщения от пользователей, радостно спешащих поделиться своей "находкой". :D
Надо делать так, как надо. А как не надо - делать не надо.
это не пасхалка - просто сейчас интеграция lua в quik находится на зачаточном уровне - поэтому даже сами разработчики далеко не всё знают.
касаемо всего остального и многопоточной работы и Ваших выводов по этой теме, могу только сказать, что Вы похоже совсем не читали мной приведённый выше форум: quik2dde.ru Там, как-раз многое детально изучено и выявлено того, чего до сих-пор нет в документации.
sam063rus пишет: касаемо всего остального и многопоточной работы и Ваших выводов по этой теме, могу только сказать, что Вы похоже совсем не читали мной приведённый выше форум: quik2dde.ru
Из каких таких моих слов вы делаете эти выводы? Нет, ну правда. Я ж не спорю. Я высказал своё мнение, основанное на моём опыте, в т.ч. и с визуальными таблицами QLUA. Поправьте меня, если ошибаюсь. Да, есть проблемы с общими переменными, таблицами при работе в двух потоках. Но это не означает, что нужно отказаться от работы в main(), просто нужно учитывать эти особенности. Более того, "тяжёлые" вычисления желательно переносить в main(). Форум читал, но признаюсь честно, не всё. Но нигде не видел там призывов "работу с майн лучше свести к минимуму". В ваших словах тоже нет никакой конкретики, кроме отсылки на форум, типа: "там где-то что-то написано".
Надо делать так, как надо. А как не надо - делать не надо.
Подскажите еще, пожалуйста - можно ли в клетки этих экранных таблиц, созданных с помощью Lua, вводить какие-то данные? Есть ли более простой способ сделать это, чем перехват нажатий клавиш внутри функции, заданной с помощью SetTableNotificationCallback() ?