Форум » GUI » Виртуальные колонки в TsBrowse ... » Ответить

Виртуальные колонки в TsBrowse ...

Andrey: Всем привет ! Сделал данный пример (огромное спасибо Сергею, без него бы не сделал), чтобы понять как можно в ТСБ делать виртуальные колонки. Вообще это заготовка для показа сравнения двух баз, в виртуальных колонках должны отражаться различия между записями в базе. Различия по полям также должны отражаться по цвету ячеек ТСБ. Но в качестве примера пока поставил симуляцию этого режима. Для показа различий по цветам каждого ТСБ делаю виртуальный массив цветов для каждой ячейки таблицы, чтобы потом заполнить. После применения меню "Test tbrowse" далее "Run test tbrowse-1/2" по условиям ставиться свой цвет ячейки в ТСБ и заполняется виртуальный массив цветов. Далее через шапку виртуальных колонок (1), (2), (3) и т.д. можно вызвать контекстное меню и установить фильтр по одной колонке или по всем колонкам. Вот такое краткое описание этого примера.

Ответов - 20

Andrey: Нашёл глюки в этом примере, пока не знаю как исправить. 1) Делаем "Test tbrowse", далее "Run test tbrowse-1", далее кликаем мышкой шапку виртуальной колонки (5) и выбираем "Filter by virtual column ???", далее "Filter by virtual column (5)", т.е. установили фильтр по 5 колонке. Если далее двигаем курсор вниз (мышкой или стрелкой), то в 10 колонке меняется цвет на крассный, если вверх, то цвет приходин в норму (восстанавливается). Почему так происходит ? Ведь цвет берется из виртуального массива ТСБ. Я примерно предполагаю как можно переделать показ цвета (нужно править алгоритм показа), но хочется понять почему происходит сбой. 2) После запуска нажимаем на шапке колонки допустим "City" - контекстное меню показывается правильно. Вот картинка: Если мы сдвигаем курсор за видимую часть таблицы, допустим на колонку 15, то контекстное меню показывается НЕПРАВИЛЬНО ! Вот картинка: Вот код редактирования шапок колонок: [pre2] // edit шапки виртуальных колонок IF oCol:cName $ 'VIRT1,VIRT2,VIRT3,VIRT4,VIRT5,VIRT6,ORDKEYNO' oCol:bHLClicked := {|nrp,ncp,nat,obr| myVirtHeadClick(1,obr,nrp,ncp,nat) } oCol:bHRClicked := {|nrp,ncp,nat,obr| myVirtHeadClick(2,obr,nrp,ncp,nat) } IF oCol:cName # "ORDKEYNO" // edit виртуальных ячеек - в качестве примера oCol:bLClicked := {|nrp,ncp,nat,obr| myVirtCellClick(1,obr,nrp,ncp,nat) } oCol:bRClicked := {|nrp,ncp,nat,obr| myVirtCellClick(2,obr,nrp,ncp,nat) } ENDIF ELSE // edit шапки обычных колонок oCol:bHLClicked := {|nrp,ncp,nat,obr| myHeadClick(1,obr,nrp,ncp,nat) } oCol:bHRClicked := {|nrp,ncp,nat,obr| myHeadClick(2,obr,nrp,ncp,nat) } ENDIF[/pre2] Почему так происходит ? Сергей посоветовал сделать ОДНУ функцию обработки шапки витртуальных и обычных колонок. А можно решить/исправить это для текущего кода ?

SergKis: Andrey пишет А можно решить/исправить это для текущего кода ? Попробуй[pre2] STATIC FUNCTION myHeadClick( 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:nAtCol(nColPix, .T.), 1) // номер колонки курсора в таблице nCol := Max(oBrw:nAtColActual( nColPix ), 1 ) nCell := oBrw:nCell // номер ячейки в таблице ... [/pre2]

Andrey: SergKis пишет: nCol := Max(oBrw:nAtColActual( nColPix ), 1 ) То что доктор прописал ! Заработало ! Осталось мне алгоритм закраски виртуального цвета исправить.


Andrey: Опять нашёл баг в этом примере. Если курсор загоним в конец таблицы и попробуем кликнуть на шапке виртуальных колонок, то выходит контекстное меню колонок таблицы, а не контекстное меню виртуальных колонок. Вот картинка: И как это исправить ? Можно сделать примерно так: [pre2] 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 [/pre2] Но не знаю, правильно ли это будет ? Или всё таки сделать одну функцию на шапки колонок, как Сергей говорил ?

SergKis: Andrey А поправить как в myHeadClick(...)[pre2] 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 // номер ячейки в таблице [/pre2]

SergKis: Andrey пишет Или всё таки сделать одну функцию на шапки колонок Разница в чем ? Если одна ф-я, то nCol := Max(oBrw:nAtColActual(nColPix), 1) IF nCol > 7 // меню Head ELSE // меню Virtual Head ENDIF или как сейчас

Andrey: SergKis пишет: А поправить как в myHeadClick(...) Пробовал, результат на картинке ! Смотри мой последний пример, который я тебе отправил. SergKis пишет: Разница в чем ? Если одна ф-я, то По написанию кода. Всегда стараюсь делать вызов функции с одним завершением. А здесь получается в коде функция вызывается в двух разных местах и переназначения какие то непонятные. Делаю одну функцию FUNCTION myAllHeadClick( nClick, oBrw, nRowPix, nColPix, nAt ) а там уже [pre2]nCol := Max(oBrw:nAtColActual(nColPix), 1) IF nCol > 7 // меню Head myHeadClick(oBrw) ELSE // меню Virtual Head myVirtHeadClick(oBrw) ENDIF [/pre2] Для понимания кода это будет же лучше ? Переделывать ?

SergKis: Andrey пишет Пробовал, результат на картинке ! Пример из Advanced\Tsb_VirtualColumn (с правкой выше) https://TransFiles.ru/urstz Работает как надо.

SergKis: Andrey пишет Если курсор загоним в конец таблицы и попробуем кликнуть на шапке виртуальных колонок, то выходит контекстное меню колонок таблицы, а не контекстное меню виртуальных колонок. По мне логичнее было бы левым кликом по head давать данные реальные по колонке, а правым разделять виртуальные и обычные колонки, но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо

Andrey: SergKis пишет: Пример из Advanced\Tsb_VirtualColumn (с правкой выше) https://TransFiles.ru/urstz Работает как надо. Что-то не так работает всё равно. Взял этот пример, запускаю. Кликаем мышкой на шапке виртуальных колонок. Контекстное меню правильное - срабатывает функция myVirtHeadClick() Вот картинка: Далее курсор на последнюю колонку, кликаем мышкой на шапке виртуальных колонок. Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick() Вот картинка: Эту проблему решает, то что я написал выше. Буду переписывать под вызов одной функции. SergKis пишет: но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо Да я думаю что дальше уже каждый сам под себя сделает. Главное показано как нужно сделать, а "допиливать" самому можно под себя.

Andrey: А почему в ТСБ не сделали :Cargo для каждой ячейки ? Можно было бы цвет записывать туда или что-то другое записывать. Удобней работать с ТСБ будет. Может НАШИ ЗНАТОКИ смогут это сделать или это лишнее ?

SergKis: Andrey пишет Может НАШИ ЗНАТОКИ смогут это сделать или это лишнее ? Cargo в колонках есть ДАВНО и использовать его тебе уже предлагалось так же давно ! [pre2] Исходники для чего нужны ? 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 [/pre2] Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick() Когда говорят о контекстном меню, я понимаю, клик правой кнопкой мыши, он работает в примере правильно, а клик левой кнопкой да же не смотрел. Если ты хочешь, что бы эти клики работали одинаково, то ты прав, надо подправить.

SergKis: PSА почему в ТСБ не сделали :Cargo для каждой ячейки ? В режиме :lFastDrawCell в памяти hash сохраняется объект каждой отображенной ячейки (вместе с Cargo), можешь повторить для себя такой механизм при создании тсб до отображения, но это все будет зафиксировано в памяти, а цвета, как правило, привязываются к значениям данных в ячейке, а данные имеют свойство меняться в процессе работы. В режиме :lFastDrawCell в таком случае предусмотрено удаление данных объекта колонки из hash методом :FastDrawClear(...). Замены данных в объекте hash нет, но ты можешь это сделать сам, если оч. нужно.

Andrey: SergKis пишет: Cargo в колонках есть ДАВНО и использовать его тебе уже предлагалось так же давно ! Так это в колонках, а я про ячейки пишу. Использую у себя Cargo в колонках и примеры помню где это есть. А почему в этом примере цвет фона ячеек стали писать в отдельный вирт.массив цвета, а не в Cargo ?

SergKis: Andrey пишет А почему в этом примере цвет фона ячеек стали писать в отдельный вирт.массив цвета, а не в Cargo ? Большой разницы нет, куда писать в oBrw:Cargo массив для колонок с данными для recno цветов или в oCol:Cargo, но тебе на тот момент был понятнее механизм реализованный, а сохранять в колонку схему oCol:Cargo := oKeyData() oCol:Cargo:Set((oBrw:cAlias)->(RecNo()), <нужный цвет от значения поя колонки>) и потом доставать в блоке кода nBColor := oCol:Cargo:Get((oBrw:cAlias)->(RecNo())) тебе показался сложным

Andrey: SergKis пишет: oCol:Cargo:Set((oBrw:cAlias)->(RecNo()), <нужный цвет от значения поя колонки>) Если запишем в Cargo цвет, то использовать его для других целей будет уже нельзя ? Ну там сделать потом типа [pre2] oCol:bPrevEdit := { |nValue,oBrw| SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Cargo", nValue), EditMy2() }[/pre2]

SergKis: 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] ... т

Andrey: SergKis пишет: и потом доставать в блоках кода Понял ! То что нужно !

SergKis: 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] ...

Andrey: SergKis пишет: Тогда напишу точно, а то все равно будут грабли и спросишь Спасибо ! Как раз для меня.



полная версия страницы