[BUG] Пропадает текст в таблицах

Страницы: 1
RSS
[BUG] Пропадает текст в таблицах
 
При задании цвета для всей таблицы, если один из цветов указан QTABLE_DEFAULT_COLOR, текст во всех ячейках пропадает.
Примеры:
Код
SetColor(id, QTABLE_NO_INDEX, QTABLE_NO_INDEX, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
SetColor(id, QTABLE_NO_INDEX, QTABLE_NO_INDEX, QTABLE_DEFAULT_COLOR, 0, 0, 0)
SetColor(id, QTABLE_NO_INDEX, QTABLE_NO_INDEX, 0xFFFFFF, 0, 0xFFFFFF, QTABLE_DEFAULT_COLOR)
Надо делать так, как надо. А как не надо - делать не надо.
 
О! Локализовал проблему!
Парень, реально ты крут  :!:
 
Здравствуйте!

Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Старатель, добрый день!

Мы обнаружили причину проблемы и исправим ее в ближайших версиях. В качестве временной меры можем рекомендовать при указании QTABLE_DEFAULT_COLOR в качестве цвета явно указывать ряд (для всей таблицы целиком придется делать это в цикле).
Приносим извинения за доставленные неудобства.  
 
Roman Azarov, Зарегистрируйте ещё одно пожелание. Пропадание текста (возникает в случайные моменты примерно раз в неделю), по крайней мере, лечится (полным переписыванием таблицы или перезапуском скрипта). Но есть ещё один глюк (проявляется примерно с той же частотой): при убийстве таблицы (DestroyTable) время от времени пропадают не все её ячейки, а остаётся почему-то только один столбец (я использую эту таблицу в качестве всплывающего меню, так что остаётся две ячейки: заголовок столбца и его значение (единственная строка в таблице, не считая заголовка). И эта хрень не убивается уже ничем, кроме перезапуска самого Квика.
 
Владимир, добрый день!

Не совсем понимаем, о каком пожелании идет речь. Уточните, пожалуйста.

Что касается описанных Вами проблем, приведите, пожалуйста, примеры, наглядно их демонстрирующие (снимки экрана / видео).
Также, предоставьте, пожалуйста, скрипт, которым создавалась таблица, и скрипт, в котором выполняется DestroyTable.
 
Roman Azarov, Что значит "о каком пожелании идет речь"? Убрать этот глюк, разумеется.

А что, описания недостаточно? Чем снимки экрана-то помогут? Вот ещё описание, чуть более раннее, от 20.03.2021 09:30:17:
Но есть ещё другой глюк, который раздражает: иногда при убийстве таблицы на экране остаётся лишь ОДНА из  её ячеек, которая торчит на экране как бельмо на глазу в любом запущенном приложении и исчезает только с выходом из Квика.
Насколько я заметил, остаются две ячейки: само значение и заголовок столбца.

Ну вы как дети малые: "Дайте код, дайте код". НА КОЙ вам "скрипт, которым создавалась таблица, и скрипт, в котором выполняется DestroyTable"? Ежу понятно, что код здесь ни при чём и близко! Ну, сидит в цикле мейна:
Код
 while f do          -- бесконечный цикл до остановки скрипта
  if m>2 then DestroyTable(t);m=m-3;end;
  if m==1 then u();end;      -- рисуем или убираем всплывающее меню
  if m==2 then          -- при открытом контекстном меню
 ...
И чего?

Вон, тыщу раз говорилось, что на одно событие прерывания приходят пачками, в любом коде. И как, помогло? И по теме этой ветки была аналогичная переписка (https://forum.quik.ru/messages/forum10/message53528/topic6319) - ещё до того, как Старатель добился устойчивого проявления этого глюка. Фрагменты:

- Владимир, чтобы помочь Вам в решении проблемы, то пришлите Ваш скрипт на котором возникает описанный эффект, а также архив рабочего места QUIK без ключей доступа.

- Так он возникает раз в сто лет! Код прорисовки таблицы не изменился ни в одной букве, код с очисткой и перебивкой таблицы остался также без изменений, единственное, что изменилось - это частота перебивки: она стала заметно выше и, следовательно, увеличилась вероятность столкнуться с транзакцией при прорисовке таблицы. Что именно здесь происходит - я не понимаю, но если в момент прорисовки отправляется транзакция, таблица обнуляется (не всегда, а очень редко).

- Попробуем поймать эффект у себя, либо посмотрев на скрипт, что то сможем сказать.

- Боевой скрипт я вам, разумеется, не дам - там серьёзные алгоритмы принятия решений, а не кака-то несчастная визуализация. А любой другой "огрызок" не даст никаких гарантий локализации ошибки, которая проявляется в одном случае из тысячи. Попробуёте поймать эффект у себя - я уже говорил, что при обрыве связей в таблице заявок строки пропадают, хотя интуитивно кажется, что здесь не эта, а другая ошибка в софте. И я абсолютно убеждён, "на чьей стороне ошибка" - НЕ МОЖЕТ мой код приводить к таким эффектам! НЕ МОЖЕТ! Кстати, я пользуюсь чистейшим Lua, и более ничем, и я НЕ МОГУ "обогнуть в своём коде" ни SetColor, ни SetCell - это разработчики представили для работы с таблицами, и больше здесь ничего нет. А сторонними библиотеками я не пользуюсь, и пользоваться не собираюсь.

- Из гипотез, то согласимся с комментарием пользователя swerg, что дело в ресурсах GDI.

- Нет, не могу согласиться: при чём здесь вообще GDI? Или, по крайней мере, какое мне дело до GDI? И почему раньше никаких проблем с "ресурсами GDI" не было? Графики у меня нет, и кроме двух таблиц, созданных с помощью AllocTable (одна эта, другая для контекстного меню) тоже ничего нет.

Ну, по закону подлости, воспроизвести этот глюк с ходу не удаётся. Если поймаю - пришлю скрин, специально ловить не буду.
 
Владимир, добрый день!

Код, как и примеры, в первую очередь нужен для анализа проблемы.
К сожалению, разбор ситуации, которая образовалась в процессе/итоге выполнения пользовательского скрипта, по одной картинке возможен далеко не всегда.

Нам не удалось воспроизвести ни одну из описанных Вами проблем (пропадание текста и неполное уничтожение таблицы функцией DestroyTable).
Если эти проблемы повторятся, просим предоставить пример (в виде снимка экрана), явно их демонстрирующий, а также код скрипта, в процессе работы которого проявилась проблема. При желании, Вы можете исключить из скрипта (исключительно) бизнес-логику перед отправкой.
 
Roman Azarov, Добрый день, Роман.

Я прекрасно понимаю, что нестабильно проявляющиеся ошибки отловить труднее всего. Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки. Что до второй - она явно виндовая, поскольку ячейки висят на экране вне зависимости от того, какое приложение активно. Скрин тут поможет разве что продемонстрировать, что я не врал про ошибку, а локализовать будет её нелегко. Код тут не поможет: собственно, я этот кусок кода и привёл - в цикле мейна анализируется флаг состояния меню, и единственное место, где убивается таблица меню (не считая аналогичного убийства по OnStop), и убивает её именно эта конструкция:
if m>2 then DestroyTable(t);m=m-3;end;
Но, видимо, подслушивает, собака - за последнюю неделю этот эффект больше не проявился. :smile:  
 
Владимир, здравствуйте!

Цитата
Владимир написал:
Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки.
Правильно понимаем, что речь идет об:
Цитата
Старатель написал:
Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки.
?
В таком случае, причина данной проблемы уже обнаружена, мы исправим ее в ближайших версиях терминала.

Касательно второй ошибки, снимок экрана поможет как минимум понять, что ошибка действительно имеет место быть (так как, повторимся, мы с подобным поведением не сталкивались и воспроизвести его нам не удалось).
В случае повторного возникновения ошибки, сделайте, пожалуйста, снимок экрана и пришлите нам.
 
Владимир,

Прошу прощения, цитата Старателя должна была выглядеть следующим образом:
Цитата
Старатель написал:
При задании цвета для всей таблицы, если один из цветов указан QTABLE_DEFAULT_COLOR, текст во всех ячейках пропадает.
Примеры:
Код
   SetColor (id, QTABLE_NO_INDEX, QTABLE_NO_INDEX, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
 SetColor (id, QTABLE_NO_INDEX, QTABLE_NO_INDEX, QTABLE_DEFAULT_COLOR,  0 ,  0 ,  0 )
 SetColor (id, QTABLE_NO_INDEX, QTABLE_NO_INDEX,  0xFFFFFF ,  0 ,  0xFFFFFF , QTABLE_DEFAULT_COLOR)  
Правильно понимаем, что Вы имеете в виду именно эту ошибку?
 
Roman Azarov, Я не столь оптимистичен. Внешнее проявление ошибки действительно то же самое, но я не делал ничего из того, что делал Старатель, и ошибка у меня проявлялась (и проявляется) чрезвычайно редко.

Да, я уже обещал прислать скрин при возникновении второй ошибки и писал, что проявляться она перестала. Я, правда, увеличил размер sleep c 150 до 500 мс, но вряд ли это так удачно купировало ошибку.
 
Владимир, возможно вы где-то вызываете
Код
SetColor(id, -1, -1, b_color, f_color, -1, -1)
При этом b_color и f_color могут быть любыми.

Можете сделать проверку передаваемых параметров в SetColor, например, так:
Код
local SetColor_ = SetColor
function SetColor(t_id, row, col, b_color, f_color, sel_b_color, sel_f_color)
  if row == -1 and col == -1 and (b_color == -1 or f_color == -1 or sel_b_color == -1 or sel_f_color == -1) then
    message(debug.traceback(), 3)
    return nil
  else
    return SetColor_(t_id, row, col, b_color, f_color, sel_b_color, sel_f_color)
  end
end
Надо делать так, как надо. А как не надо - делать не надо.
 
Или так, чтобы не пропустить ошибку:
Код
local SetColor_ = SetColor
function SetColor(t_id, row, col, b_color, f_color, sel_b_color, sel_f_color)
  if row == -1 and col == -1 and (b_color == -1 or f_color == -1 or sel_b_color == -1 or sel_f_color == -1) then
    message(debug.traceback(), 3)
  end
  return SetColor_(t_id, row, col, b_color, f_color, sel_b_color, sel_f_color)
end
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, Невозможно. У меня уже много месяцев 11 вызовов SetColor на весь код, и ни в одном из них второй аргумент не равен -1 (там всегда код строки, полученный от InsertRow). Да и третий аргумент ставится в -1 лишь в одном из этих вызовов (когда красится вся строка либо в красный, либо в зелёный при изменении курса). Последние два аргумента в -1 всегда, а четвёртый и пятый иногда устанавливаются в 0xFFFFFF, но это же не -1.

Да что толку от этого проверочного кода, если обновление таблицы у меня происходит раз в секунду (а клеток в ней обычно более 1000), а ошибка проявляется раз в неделю?
 
Владимир, учитывая ваш стиль программирования, это наиболее вероятная причина.
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, Чем Вам не нравится мой стиль? по мне так близок к идеальному. :smile:  
 
Владимир, близок к идеальному на перфокартах. Но благо дело современные текстовые файлы вполне себе резиновые и можно без зазрений совести использовать большое количество вспомогательных символов для разметки и длинные имена переменных. Вы тут вручную пишете минимизированный код по сути дела, вполне естественно что он нечитабелен даже для вас самого и вам гораздо труднее уловить логические ошибки в коде.
 
Цитата
Владимир написал:
близок к идеальному
Если не считать злоупотребление метками вкупе с пробелами по темам типов и области видимости переменных.
Но дискутировать на эту тему у меня нет ни малейшего желания. Мне по барабану будете ли вы искать ошибку.
Надо делать так, как надо. А как не надо - делать не надо.
 
Артем, На перфокартах даже мне не довелось уже программировать. И что такое "современные текстовые файлы"? Мой боевой скрипт содержит на сегодняшний момент 18943 байта. Архивный (эталонный) с комментариями почти в каждой строчке - 38729 байт. В любой "текстовый файл" поместится - даже в самый древний. Читаемость - прекрасная, структуризация - прекрасная, подавляющее большинство функций отлажено и законсервировано ещё в прошлом году, да и последняя замеченная логическая ошибка в коде датирована примерно февралём. Мне давно уже НЕЧЕГО "ловить" - я реализовал абсолютно всё, что хотел. Так что У СЕБЯ ловите ошибки всеми перечисленными Вами способами. Да и то вряд ли поможет - давно известно: "Кто умеет - тот делает, кто не умеет - тот учит как надо делать". :smile:

Старатель, Не знаю, что такое "злоупотребление метками вкупе с пробелами", но код у меня сейчас состоит из 16 функций, ровно столько же в нём меток, а пробелов там 927. На "типы и области видимости переменных" мне давно плевать.

Искать ошибку я, естественно, не буду, ибо научился её лечить ещё до того, как Вы её локализовали, о чём и писал: "Даванул на Enter - и все дела"!
 
Код
local run, id = true
function OnStop()
  run = nil
  DestroyTable(id)
  return 100
end

function main()
  id = AllocTable()
  AddColumn(id, 1, "", true, QTABLE_STRING_TYPE, 20)
  CreateWindow(id)
  SetTableNotificationCallback(id, function (id, event)
    if event == QTABLE_CLOSE then
      run = false
    elseif event == QTABLE_VKEY then
      for row = 1, 2 do
         SetColor(id, row, QTABLE_NO_INDEX, 0x0000FF, QTABLE_DEFAULT_COLOR, 0x0000FF, QTABLE_DEFAULT_COLOR)
      end
    end
  end)
  for row = 1, 2 do
    InsertRow(id, row)
    SetCell(id, row, 1, tostring(row))
  end
  while run do sleep(500) end
end

Запустить скрипт. Нажать любую клавишу - фон окрашивается красным.
BUG 1: Применить фильтр, чтобы осталась только строка 1, - фон пропадает.
BUG 2: Нажать любую клавишу - пропадает текст.
Надо делать так, как надо. А как не надо - делать не надо.
 
Ещё один баг.
Код
local run, id = true
function OnStop()
  run = nil
  DestroyTable(id)
end

function main()
  id = AllocTable()
  AddColumn(id, 1, "", true, QTABLE_STRING_TYPE, 20)
  CreateWindow(id)
  SetTableNotificationCallback(id, function (id, event)
    if event == QTABLE_CLOSE then
      run = false
    elseif event == QTABLE_VKEY then
      SetColor(id, 2, QTABLE_NO_INDEX, 0x0000FF, 0, 0x0000FF, 0)
    end
  end)
  for row = 1, 2 do
    InsertRow(id, row)
    SetCell(id, row, 1, tostring(row))
  end
  while run do sleep(500) end
end

Применить фильтр, чтобы осталась только строка 1. Нажать любую клавишу - вся таблица окрасится красным.
Надо делать так, как надо. А как не надо - делать не надо.
 
Ahtung!
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, Что случилось?  :smile:

У меня сегодня ТРИ РАЗА ПОДРЯД пропадал текст в таблице! В смысле, не восстанавливался после трёх нажатий на Enter (у меня на него повешено DestroyTable + AllocTable) - только на четвёртый раз сподобился! И это вообще первый случай, когда эта "восстанавливающая" примочка не сработала! Куда катимся?.. :cry:  
 
Цитата
Старатель написал:
Код
   local  run, id  =   true 
 function   OnStop ()
  run  =   nil 
   DestroyTable (id)
   return   100 
 end 

 function   main ()
  id  =   AllocTable ()
   AddColumn (id,  1 ,  "" ,  true , QTABLE_STRING_TYPE,  20 )
   CreateWindow (id)
   SetTableNotificationCallback (id,  function  (id, event)
     if  event  =  =  QTABLE_CLOSE  then 
      run  =   false 
     elseif  event  =  =  QTABLE_VKEY  then 
       for  row  =   1 ,  2   do 
          SetColor (id, row, QTABLE_NO_INDEX,  0x0000FF , QTABLE_DEFAULT_COLOR,  0x0000FF , QTABLE_DEFAULT_COLOR)
       end 
     end 
   end )
   for  row  =   1 ,  2   do 
     InsertRow (id, row)
     SetCell (id, row,  1 , tostring(row))
   end 
   while  run  do   sleep ( 500 )  end 
 end   

Запустить скрипт. Нажать любую клавишу - фон окрашивается красным.
BUG 1:  Применить фильтр, чтобы осталась только строка 1, - фон пропадает.
BUG 2:  Нажать любую клавишу - пропадает текст.
Здравствуйте!

Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Цитата
Старатель написал:
Ahtung!
Мы исправим описанные в данном инциденте ошибки в одной из очередных версий ПО. Приносим извинения за доставленные неудобства.
Страницы: 1
Читают тему
Наверх