Отправлено: 08.11.20 09:27. Заголовок: Виртуальные колонки в TsBrowse ...
Всем привет !
Сделал данный пример (огромное спасибо Сергею, без него бы не сделал), чтобы понять как можно в ТСБ делать виртуальные колонки.
Вообще это заготовка для показа сравнения двух баз, в виртуальных колонках должны отражаться различия между записями в базе. Различия по полям также должны отражаться по цвету ячеек ТСБ. Но в качестве примера пока поставил симуляцию этого режима.
Для показа различий по цветам каждого ТСБ делаю виртуальный массив цветов для каждой ячейки таблицы, чтобы потом заполнить.
После применения меню "Test tbrowse" далее "Run test tbrowse-1/2" по условиям ставиться свой цвет ячейки в ТСБ и заполняется виртуальный массив цветов.
Далее через шапку виртуальных колонок (1), (2), (3) и т.д. можно вызвать контекстное меню и установить фильтр по одной колонке или по всем колонкам.
Отправлено: 08.11.20 09:29. Заголовок: Нашёл глюки в этом п..
Нашёл глюки в этом примере, пока не знаю как исправить.
1) Делаем "Test tbrowse", далее "Run test tbrowse-1", далее кликаем мышкой шапку виртуальной колонки (5) и выбираем "Filter by virtual column ???", далее "Filter by virtual column (5)", т.е. установили фильтр по 5 колонке. Если далее двигаем курсор вниз (мышкой или стрелкой), то в 10 колонке меняется цвет на крассный, если вверх, то цвет приходин в норму (восстанавливается). Почему так происходит ? Ведь цвет берется из виртуального массива ТСБ. Я примерно предполагаю как можно переделать показ цвета (нужно править алгоритм показа), но хочется понять почему происходит сбой.
2) После запуска нажимаем на шапке колонки допустим "City" - контекстное меню показывается правильно. Вот картинка:
Если мы сдвигаем курсор за видимую часть таблицы, допустим на колонку 15, то контекстное меню показывается НЕПРАВИЛЬНО ! Вот картинка:
Отправлено: 15.11.20 16:43. Заголовок: Опять нашёл баг в эт..
Опять нашёл баг в этом примере. Если курсор загоним в конец таблицы и попробуем кликнуть на шапке виртуальных колонок, то выходит контекстное меню колонок таблицы, а не контекстное меню виртуальных колонок.
Вот картинка:
И как это исправить ?
Можно сделать примерно так:
FUNCTION myHeadClick( nClick, oBrw, nRowPix, nColPix, nAt ) ......... nCol := Max(oBrw:nAtColActual( nColPix ), 1 ) // номер активной колонки курсора в таблице ......... IF nCol - 7 <= 0 // 7 кол-во виртуальных колонок // вызов функции вирт.колонок myVirtHeadClick( nClick, oBrw, nRowPix, nColPix, nAt ) RETURN NIL ENDIF
Но не знаю, правильно ли это будет ? Или всё таки сделать одну функцию на шапки колонок, как Сергей говорил ?
Отправлено: 15.11.20 17:12. Заголовок: Andrey А поправить ..
Andrey А поправить как в myHeadClick(...)
STATIC FUNCTION myVirtHeadClick( nClick, oBrw, nRowPix, nColPix, nAt ) LOCAL nRow, nCell, cNam, cForm, cName, nCol, nIsHS, nLine, oCol LOCAL nY, nX, cMsg1, cMsg2, cMsg3, cMsg4, hFont1, hFont2, hFont3
cForm := oBrw:cParentWnd nRow := oBrw:GetTxtRow(nRowPix) // номер строки курсора в таблице nCol := Max(oBrw:nAtColActual(nColPix), 1) // номер колонки курсора в таблице nCell := oBrw:nCell // номер ячейки в таблице
Отправлено: 15.11.20 17:44. Заголовок: SergKis пишет: А по..
SergKis пишет:
цитата:
А поправить как в myHeadClick(...)
Пробовал, результат на картинке ! Смотри мой последний пример, который я тебе отправил.
SergKis пишет:
цитата:
Разница в чем ? Если одна ф-я, то
По написанию кода. Всегда стараюсь делать вызов функции с одним завершением. А здесь получается в коде функция вызывается в двух разных местах и переназначения какие то непонятные.
Делаю одну функцию FUNCTION myAllHeadClick( nClick, oBrw, nRowPix, nColPix, nAt ) а там уже
nCol := Max(oBrw:nAtColActual(nColPix), 1) IF nCol > 7 // меню Head myHeadClick(oBrw) ELSE // меню Virtual Head myVirtHeadClick(oBrw) ENDIF
Для понимания кода это будет же лучше ? Переделывать ?
Отправлено: 15.11.20 18:49. Заголовок: Andrey пишет Если ку..
Andrey пишет
цитата:
Если курсор загоним в конец таблицы и попробуем кликнуть на шапке виртуальных колонок, то выходит контекстное меню колонок таблицы, а не контекстное меню виртуальных колонок.
По мне логичнее было бы левым кликом по head давать данные реальные по колонке, а правым разделять виртуальные и обычные колонки, но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо
Что-то не так работает всё равно. Взял этот пример, запускаю. Кликаем мышкой на шапке виртуальных колонок. Контекстное меню правильное - срабатывает функция myVirtHeadClick() Вот картинка:
Далее курсор на последнюю колонку, кликаем мышкой на шапке виртуальных колонок. Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick() Вот картинка:
Эту проблему решает, то что я написал выше. Буду переписывать под вызов одной функции.
SergKis пишет:
цитата:
но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо
Да я думаю что дальше уже каждый сам под себя сделает. Главное показано как нужно сделать, а "допиливать" самому можно под себя.
Отправлено: 16.11.20 06:24. Заголовок: А почему в ТСБ не сд..
А почему в ТСБ не сделали :Cargo для каждой ячейки ? Можно было бы цвет записывать туда или что-то другое записывать. Удобней работать с ТСБ будет. Может НАШИ ЗНАТОКИ смогут это сделать или это лишнее ?
Отправлено: 16.11.20 07:15. Заголовок: Andrey пишет Может Н..
Andrey пишет
цитата:
Может НАШИ ЗНАТОКИ смогут это сделать или это лишнее ?
Cargo в колонках есть ДАВНО и использовать его тебе уже предлагалось так же давно !
Исходники для чего нужны ? CLASS TSColumn ... DATA bArraySortDes // Block to be evaluated on header dblclicked and // descending order flag is true DATA Cargo // programmer data DATA cAlias // An optional alias for every column
цитата:
Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick()
Когда говорят о контекстном меню, я понимаю, клик правой кнопкой мыши, он работает в примере правильно, а клик левой кнопкой да же не смотрел. Если ты хочешь, что бы эти клики работали одинаково, то ты прав, надо подправить.
Отправлено: 16.11.20 07:31. Заголовок: PSА почему в ТСБ не ..
PS
цитата:
А почему в ТСБ не сделали :Cargo для каждой ячейки ?
В режиме :lFastDrawCell в памяти hash сохраняется объект каждой отображенной ячейки (вместе с Cargo), можешь повторить для себя такой механизм при создании тсб до отображения, но это все будет зафиксировано в памяти, а цвета, как правило, привязываются к значениям данных в ячейке, а данные имеют свойство меняться в процессе работы. В режиме :lFastDrawCell в таком случае предусмотрено удаление данных объекта колонки из hash методом :FastDrawClear(...). Замены данных в объекте hash нет, но ты можешь это сделать сам, если оч. нужно.
Отправлено: 16.11.20 08:01. Заголовок: Andrey пишет А почем..
Andrey пишет
цитата:
А почему в этом примере цвет фона ячеек стали писать в отдельный вирт.массив цвета, а не в Cargo ?
Большой разницы нет, куда писать в oBrw:Cargo массив для колонок с данными для recno цветов или в oCol:Cargo, но тебе на тот момент был понятнее механизм реализованный, а сохранять в колонку схему oCol:Cargo := oKeyData() oCol:Cargo:Set((oBrw:cAlias)->(RecNo()), <нужный цвет от значения поя колонки>) и потом доставать в блоке кода nBColor := oCol:Cargo:Get((oBrw:cAlias)->(RecNo())) тебе показался сложным
Отправлено: 16.11.20 09:32. Заголовок: Andrey пишет Если за..
Andrey пишет
цитата:
Если запишем в Cargo цвет, то использовать его для других целей будет уже нельзя ?
Ты формулируй четко, что хочешь от цветов их в тсб 20 штук. В примере шел разговор о nBackColor, еси еще о какиках то вариантах, то так например oCol:Cargo := oKeyData() oCol:Cargo:Set((oBrw:cAlias)->(RecNo()), {<нужный цвет nBack>, <nFont>, nEdit}) и потом доставать в блоках кода aColor := oCol:Cargo:Get((oBrw:cAlias)->(RecNo())) nBColor := aColor[1] ... т
Отправлено: 16.11.20 14:42. Заголовок: Andrey пишет Понял !..
Andrey пишет
цитата:
Понял ! То что нужно !
Тогда напишу точно, а то все равно будут грабли и спросишь Local aClrDef := {CLR_WHITE, CLR_BLACK, CLR_BLUE} Local nRec := (oBrw:cAlias)->(RecNo()) ... nBColor := oCol:Cargo:Get(nRec, aClrDef)[1] nFColor := oCol:Cargo:Get(nRec, aClrDef)[2] nEColor := oCol:Cargo:Get(nRec, aClrDef)[3] ...
Все даты в формате GMT
3 час. Хитов сегодня: 907
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет