Мы обнаружили причину проблемы и исправим ее в ближайших версиях. В качестве временной меры можем рекомендовать при указании 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). Если эти проблемы повторятся, просим предоставить пример (в виде снимка экрана), явно их демонстрирующий, а также код скрипта, в процессе работы которого проявилась проблема. При желании, Вы можете исключить из скрипта (исключительно) бизнес-логику перед отправкой.
Я прекрасно понимаю, что нестабильно проявляющиеся ошибки отловить труднее всего. Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки. Что до второй - она явно виндовая, поскольку ячейки висят на экране вне зависимости от того, какое приложение активно. Скрин тут поможет разве что продемонстрировать, что я не врал про ошибку, а локализовать будет её нелегко. Код тут не поможет: собственно, я этот кусок кода и привёл - в цикле мейна анализируется флаг состояния меню, и единственное место, где убивается таблица меню (не считая аналогичного убийства по OnStop), и убивает её именно эта конструкция: if m>2 then DestroyTable(t);m=m-3;end; Но, видимо, подслушивает, собака - за последнюю неделю этот эффект больше не проявился.
Владимир написал: Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки.
Правильно понимаем, что речь идет об:
Цитата
Старатель написал: Скрин при пропадании текста я приводил (по той ссылке, о которой говорил выше), но и я научился лечить эту штуку, и Старатель обеспечил устойчивую повторяемость этой ошибки.
? В таком случае, причина данной проблемы уже обнаружена, мы исправим ее в ближайших версиях терминала.
Касательно второй ошибки, снимок экрана поможет как минимум понять, что ошибка действительно имеет место быть (так как, повторимся, мы с подобным поведением не сталкивались и воспроизвести его нам не удалось). В случае повторного возникновения ошибки, сделайте, пожалуйста, снимок экрана и пришлите нам.
Roman Azarov, Я не столь оптимистичен. Внешнее проявление ошибки действительно то же самое, но я не делал ничего из того, что делал Старатель, и ошибка у меня проявлялась (и проявляется) чрезвычайно редко.
Да, я уже обещал прислать скрин при возникновении второй ошибки и писал, что проявляться она перестала. Я, правда, увеличил размер sleep c 150 до 500 мс, но вряд ли это так удачно купировало ошибку.
Можете сделать проверку передаваемых параметров в 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), а ошибка проявляется раз в неделю?
Владимир, близок к идеальному на перфокартах. Но благо дело современные текстовые файлы вполне себе резиновые и можно без зазрений совести использовать большое количество вспомогательных символов для разметки и длинные имена переменных. Вы тут вручную пишете минимизированный код по сути дела, вполне естественно что он нечитабелен даже для вас самого и вам гораздо труднее уловить логические ошибки в коде.
Если не считать злоупотребление метками вкупе с пробелами по темам типов и области видимости переменных. Но дискутировать на эту тему у меня нет ни малейшего желания. Мне по барабану будете ли вы искать ошибку.
Надо делать так, как надо. А как не надо - делать не надо.
Артем, На перфокартах даже мне не довелось уже программировать. И что такое "современные текстовые файлы"? Мой боевой скрипт содержит на сегодняшний момент 18943 байта. Архивный (эталонный) с комментариями почти в каждой строчке - 38729 байт. В любой "текстовый файл" поместится - даже в самый древний. Читаемость - прекрасная, структуризация - прекрасная, подавляющее большинство функций отлажено и законсервировано ещё в прошлом году, да и последняя замеченная логическая ошибка в коде датирована примерно февралём. Мне давно уже НЕЧЕГО "ловить" - я реализовал абсолютно всё, что хотел. Так что У СЕБЯ ловите ошибки всеми перечисленными Вами способами. Да и то вряд ли поможет - давно известно: "Кто умеет - тот делает, кто не умеет - тот учит как надо делать".
Старатель, Не знаю, что такое "злоупотребление метками вкупе с пробелами", но код у меня сейчас состоит из 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. Нажать любую клавишу - вся таблица окрасится красным.
Надо делать так, как надо. А как не надо - делать не надо.
У меня сегодня ТРИ РАЗА ПОДРЯД пропадал текст в таблице! В смысле, не восстанавливался после трёх нажатий на Enter (у меня на него повешено DestroyTable + AllocTable) - только на четвёртый раз сподобился! И это вообще первый случай, когда эта "восстанавливающая" примочка не сработала! Куда катимся?..
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: Нажать любую клавишу - пропадает текст.
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.