local run = true
local id
function OnStop()
run = nil
local t = id
id = nil
if t then DestroyTable(t) end
end
function main()
id = AllocTable()
AddColumn(id, 1, "Row", true, QTABLE_INT_TYPE, 10)
AddColumn(id, 2, "Selected", true, QTABLE_INT_TYPE, 15)
CreateWindow(id)
for i = 1, 4 do
SetCell(id, InsertRow(id, i), 1, tostring(i), i)
end
SetTableNotificationCallback(id, function(t, event, row)
if event == QTABLE_VKEY then
message("SetSelectedRow: " .. tostring(SetSelectedRow(id, 2)))
elseif event == QTABLE_SELCHANGED then
SetCell(id, row, 2, tostring(row))
end
end)
while run do sleep(1000) end
end
Применить к таблице фильтр, как на скриншоте: "Row больше 1" При нажатии на любую клавишу, нужно выделить строку с фактическим порядковым номером 2. Но выделяется строка с номером 3, о чём сообщает событие QTABLE_SELCHANGED.
1. Как выделять строки по фактическому порядковому номеру, с учётом того, что скрипт понятия не имеет о применённых фильтрах и сортировках? 2. Да в руководстве указано: "Функция работает с видимым представлением таблицы, в котором учитываются пользовательские фильтры и сортировка." Но нафига оно онужно? Можете привести хоть один реальный пример, когда нужно выделить строку в таблице, в которой "учитываются пользовательские фильтры и сортировка", принимая во внимание, что скрипт понятия не имеет о применённых фильтрах и сортировках?
Надо делать так, как надо. А как не надо - делать не надо.
касательно некорректности функции SetSelectedRow. Дело в том, что после применения фильтров или сортировки к столбцам изменяются порядковые номера строк в таблице. Вы можете видеть изменённые номера в первом столбце Вашей таблицы. В качестве номеров строк в функции SetSelectedRow() как раз эти номера и используются. Поэтому, если даже судить по Вашему скриншоту, выделяя 2 строку, выделяется строка, где в столбце Row указано значение "3", потому что по порядковому номеру данная строка идёт второй.
Касательно ответа на 1 вопрос. На данный момент такой возможности нет, можем зарегистрировать пожелание на добавление признака, показывающего, что строка отфильтрована в таблице созданной через CreateWindow(), Регистрируем?
Касательно ответа на 2 вопрос. Привести пример, где в Lua-таблице с пользовательскими фильтрами выделяется строка функцией SetSelectedRow(), довольно сложно. Поэтому, как уже говорилось в ответе на первый вопрос, можем зарегистрировать пожелание на добавление признака, который будет показывать, что строка отфильтрована.
Daniil Pozdnyakov написал: Касательно ответа на 2 вопрос. Привести пример, где в Lua-таблице с пользовательскими фильтрами выделяется строка функцией SetSelectedRow(), довольно сложно.
Это был скорее риторический вопрос. Потому что после применения фильтров и/или сортировки к таблице SetSelectedRow() становится бесполезной.
Цитата
Daniil Pozdnyakov написал: можем зарегистрировать пожелание на добавление признака, показывающего, что строка отфильтрована в таблице созданной через CreateWindow()
Мне нужно выделять строки по их номинальному порядковому номеру. Что я буду делать с этим признаком?
Надо делать так, как надо. А как не надо - делать не надо.
Daniil Pozdnyakov написал: Касательно ответа на 2 вопрос. Привести пример, где в Lua-таблице с пользовательскими фильтрами выделяется строка функцией SetSelectedRow(), довольно сложно.
Это был скорее риторический вопрос. Потому что после применения фильтров и/или сортировки к таблице SetSelectedRow() становится бесполезной.
Цитата
Daniil Pozdnyakov написал: можем зарегистрировать пожелание на добавление признака, показывающего, что строка отфильтрована в таблице созданной через CreateWindow()
Мне нужно выделять строки по их номинальному порядковому номеру. Что я буду делать с этим признаком?
Сделайте в таблице собственное скрытое (шириной 0) поле и записывайте в него ключ - ваш исходный номер строки. Выделяйте строки после поиска по этому ключу
s_mike@rambler.ru написал: Выделяйте строки после поиска по этому ключу
И что вы найдёте? Номинальный номер строки? Я её и так знаю. А толку?
вы идете по строкам сверху вниз и ищете в каждой строке в скрытом столбце нужный вам ключ. как нашли - выделяйте эту строку по номеру строки перебора, не по ключу.
Заодно и будет признак "строка отфильтрована", когда ваш ключ не совпадает с номером строки перебора. Не надо ждать столетия, пока рассмотрят и реализуют.
s_mike@rambler.ru написал: вы идете по строкам сверху вниз и ищете в каждой строке в скрытом столбце нужный вам ключ. как нашли - выделяйте эту строку по номеру строки перебора, не по ключу.
GetCell, если вы её имели ввиду, работает с ячейками по номинальному номеру строки (и это правильно, тут к ней претензий нет. Одна только SetSelectedRow оказалась с дефектом в этом плане). В вашем случае номер строки перебора всегда будет равен ключу.
Надо делать так, как надо. А как не надо - делать не надо.
Daniil Pozdnyakov написал: Касательно ответа на 2 вопрос. Привести пример, где в Lua-таблице с пользовательскими фильтрами выделяется строка функцией SetSelectedRow(), довольно сложно.
Это был скорее риторический вопрос. Потому что после применения фильтров и/или сортировки к таблице SetSelectedRow() становится бесполезной.
Цитата
Daniil Pozdnyakov написал: можем зарегистрировать пожелание на добавление признака, показывающего, что строка отфильтрована в таблице созданной через CreateWindow()
Мне нужно выделять строки по их номинальному порядковому номеру. Что я буду делать с этим признаком?
Могли бы Вы описать, как по-вашему должна быть реализована работа функций с номинальными порядковыми номерами ? Как Вы видите реализацию данного функционала ?
Daniil Pozdnyakov написал: описать, как по-вашему должна быть реализована работа функций с номинальными порядковыми номерами
NUMBER row SetSelectedRow(NUMBER table_id, NUMBER row)
row >= 1 and row <= количества строк в таблице -- выделяет строку с номером row (здесь и далее под номером строки подразумевается номинальный порядковый номер) если строка с номером row отсортирована и не отображается в таблице, то выделение снимается, SetSelectedRow возвращает -1 row = 0 -- снимает выделение, SetSelectedRow возвращает 0 row = -1 -- выделяется последняя видимая строка в таблице (обратите внимание, что сейчас это не работает должным образом, если к таблице применены фильтры)
Если кто-то считает, что SetSelectedRow должен по-прежнему работать с видимым представлением таблицы, в котором учитываются пользовательские фильтры и сортировка, пусть напишет в этой теме, как это можно использовать.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель, Я этот вопрос решил раз и навсегда введением невидимого столбца (и даже писал здесь пару раз, как именно). Фрагмент из описания моего скрипта: Нулевой (невидимый) столбец хранит идентификаторы тикеров в основной Lua-таблице, что позволяет получить доступ к данным выбранного тикера при любом порядке следования строк в таблице QUIK. Обратный доступ также возможен: скрипт "знает", присутствует ли данный тикер в таблице QUIK и, если да, какой идентификатор его строки.
Старатель, Какая ещё "информация"? Вам и я, и s_mike буквально на пальцах разжевали, что нужно делать. Если Вы даже поле этого не способны выделить нужную Вам строку, то какой Вы, в жопу, программист, не говоря уже про "роботорговец"? Перечитайте Ваш же лозунг: "Надо делать так, как надо. А как не надо - делать не надо". Так вот: реализовывать Ваши дурацкие пожелания НЕ НАДО!
Владимир, я давно понял, что вы ни черта не понимаете в тех темах, куда суёте свой длинный нос. А объяснять что либо старому дураку бесполезно. Но я готов заключить с вами сделку: В первом сообщении данной темы есть скрипт. Если вы его отредактируете таким образом, чтобы в не зависимости от применённых к таблице фильтров или сортировки, при нажатии на любую клавишу выделялась строка с фактическим порядковым номером 2 (если строка она не скрыта фильтром), то я публично признаю, что вы - лучший, чем я программист. Если же вы этого сделать не сможете, то вы перестанете засирать этот форум и навсегда его покинете. Но я абсолютно уверен, что вы
Цитата
Владимир написал: не способны выделить нужную строку
, а потому сольётесь под любым предлогом.
Надо делать так, как надо. А как не надо - делать не надо.
Старатель, Лапуль, я даже смотреть не собираюсь код вечно скулящего, да ещё и распальцованного неуча - достаточно прочесть заголовок темы: неуч не способен выделить нужную ему строку таблицы. Мой скрипт (и я минимум дважды описывал здесь эту технологию) массово выделяет строки уже в полусекундном прерывании, а в полуторасекундном заполняет их значениями и раскрашивает в разные цвета. И ни разу не промахивается, вне зависимости от того, как там отсортированы строки и какие установлены фильтры. Лапуль, мне абсолютно насрать, что Вы там признаете или не признаете - я давно состоявшийся человек в профессиональном плане, а Вас я вообще программистом не считаю.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Старатель, Лапуль, я ещё раз повторяю: алгоритмически задача формулируется так: переместить курсор на нужный элемент множества. Редкий программист из прошлого тысячелетия потратит на подобную "проблему" более одной секунды - это только нынешнее криворукое стадо готово тратить на это дни, недели, месяцы, годы и засирает тут ветки пожеланиями в очередной раз изуродовать софт, дабы их идиотские задумки могли хоть как-то работать. У меня, лапуль, код уже много месяцев прекрасно работает. Мало того - зарабатывает.
Вот сегодняшний скрин, для общего развития: слева виден кусочек старой версии скрипта, его перекрывает таблица от нового, оба работают на одном и том же массиве данных, только старый реально торгует, а новый виртуально - устроил между ними соревнование. Новая версия читает старый формат входного файла (совместимость снизу), а записывает уже в новом, т.е. если скрипт запустить и сразу остановить, сработает как конвертер. Строки таблицы старой версии отсортированы по названию тикера, новой - по цене. В каждой версии под контролем порядка 1000 тикеров (это на тему Вашего же скулежа про загрузки CPU - ещё одна смехотворная "проблема"). Работают фильтры: а) выдавать все или те, которые есть в портфеле и, независимо от первого б) показывать только тикеры, торгующиеся по выбранной валюте (рубли, доллары, евро). У каждого тикера доступны три вида контекстного меню: а) для ручной торговли б) для корректировки в диалоге количества доступной скрипту валюты (можно добавить или вывести любую сумму) и в) меню по таймфреймам. А Вы можете скулить дальше, "маэстро" - на что Вы ещё способны?