не добавляются строки в таблицу

Страницы: 1
RSS
не добавляются строки в таблицу
 
Здравствуйте!
Пытаюсь создать таблицу для последующего вывода на экран.
Но почему-то в нее не добавляются строки.
Вдобавок не отображается заголовок окна.
И при вызове функции 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.
 
решил обойтись без quik_table_wrapper.lua ? :))))))
 
Цитата
sam063rus пишет:
решил обойтись без quik_table_wrapper.lua ? )))))
А что, без него никак нельзя?
 
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
 
Таблица создаётся, колонки и строки добавляются, заголовок меняется, из меню закрывается и останавливается.
Для того, чтобы скрипт останавливался при нажатии "крестика" в окне таблицы - надо уже прикручивать коллбек, что мне делать уже лень. Думаю сам разберёшься.
 
Цитата
Дмитрий пишет:
Но почему-то в нее не добавляются строки.
Вдобавок не отображается заголовок окна.
Сначала надо создать окно, а затем добавлять строки, заголовок. Т.е., порядок вызова должен быть такой:
Код
AllocTable()
AddColumn()
CreateWindow()
Далее остальные функции работы с таблицей
И не имеет значения, в каком потоке строится таблица: в основном или в main.
Цитата
Дмитрий пишет:
И при вызове функции DestroyTable() окно не закрывается
Функции работы с таблицами, в т.ч. DestroyTable() не работают после нажатия кнопки "Остановить", поэтому их вызов надо размещать в колбеке OnStop().
Надо делать так, как надо. А как не надо - делать не надо.
 
Дмитрий
Вот так все работает:
-------------------------------------------

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().
А об этом где-то разработчики писали или это тоже из разряда нигде не упоминающихся особенностей?
 
если бы разработчики писали, да ещё составили бы нормальный хелп то и форумаэтого не было б.
 
sam063rus, извинения принимаются.   :)  

Поймите меня правильно: судя по вопросам автор темы только начинает изучать графические возможности QLUA. Не стоит вводить в заблуждения пользователей своими убеждениями. Поэтому я и предложил обосновать фразу "надо забыть про работу в "майне". Полагал, что, возможно узнаю что-то новое для себя, а не спора ради. Но увы...   :(  
Касаемо вашего примера: по моим убеждениям (поправьте, если не прав) инициализацию, в т.ч. создание визуальных таблиц, не стоит выполнять в основном потоке без определённой на то необходимости. Т.к. создание таблиц занимает время; создание больших таблиц - много времени. При создании таблицы в основном потоке работа других скриптов может быть приостановлена на это время, особенно если их работа строится исключительно на колбеках.
К тому же, создать таблицу можно в main, а заполнять значениями по событиям в колбеках - нет проблем.   ;)  

Что касается враппера, то тут дело вкуса. Но его использование не освобождает пользователя от необходимости следить за порядком вызова функций. К тому же, ИМХО, при частой модификации / обращении к элементам таблицы, использование враппера может снизить производительность скрипта.

Цитата
Дмитрий пишет:
А об этом где-то разработчики писали или это тоже из разряда нигде не упоминающихся особенностей?
Разработчикам "эта особенность" давно известна, но, судя по тому, что они не считают нужным сообщать о ней где либо, то скорее это - т.н. "пасхалка". И периодически на форуме появляются сообщения от пользователей, радостно спешащих поделиться своей "находкой".   :D
Надо делать так, как надо. А как не надо - делать не надо.
 
это не пасхалка - просто сейчас интеграция lua в quik находится на зачаточном уровне - поэтому даже сами разработчики далеко не всё знают.

касаемо всего остального и многопоточной работы и Ваших выводов по этой теме, могу только сказать, что Вы похоже совсем не читали мной приведённый выше форум: quik2dde.ru
Там, как-раз многое детально изучено и выявлено того, чего до сих-пор нет в документации.
 
Цитата
sam063rus пишет:
касаемо всего остального и многопоточной работы и Ваших выводов по этой теме, могу только сказать, что Вы похоже совсем не читали мной приведённый выше форум: quik2dde.ru
Из каких таких моих слов вы делаете эти выводы? Нет, ну правда. Я ж не спорю. Я высказал своё мнение, основанное на моём опыте, в т.ч. и с визуальными таблицами QLUA. Поправьте меня, если ошибаюсь.
Да, есть проблемы с общими переменными, таблицами при работе в двух потоках. Но это не означает, что нужно отказаться от работы в main(), просто нужно учитывать эти особенности. Более того, "тяжёлые" вычисления желательно переносить в main().
Форум читал, но признаюсь честно, не всё. Но нигде не видел там призывов "работу с майн лучше свести к минимуму". В ваших словах тоже нет никакой конкретики, кроме отсылки на форум, типа: "там где-то что-то написано".
Надо делать так, как надо. А как не надо - делать не надо.
 
Подскажите еще, пожалуйста - можно ли в клетки этих экранных таблиц, созданных с помощью Lua, вводить какие-то данные?
Есть ли более простой способ сделать это, чем перехват нажатий клавиш внутри функции, заданной с помощью SetTableNotificationCallback() ?
 
Вроде, как нет. Но если всё же решитесь на этот подвиг, то вот ASCII таблица кодов символов Windows (Win-1251)
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Серж пишет:
Но если всё же решитесь на этот подвиг, то вот ASCII таблица кодов символов Windows (Win-1251)
Спасибо, но можно обойтись без этой таблицы - достаточно использовать функцию string.char(par2)
Страницы: 1
Читают тему
Наверх