Автор | Сообщение |
|
| постоянный участник
|
Пост N: 6838
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.11.20 09:27. Заголовок: Виртуальные колонки в TsBrowse ...
Всем привет ! Сделал данный пример (огромное спасибо Сергею, без него бы не сделал), чтобы понять как можно в ТСБ делать виртуальные колонки. Вообще это заготовка для показа сравнения двух баз, в виртуальных колонках должны отражаться различия между записями в базе. Различия по полям также должны отражаться по цвету ячеек ТСБ. Но в качестве примера пока поставил симуляцию этого режима. Для показа различий по цветам каждого ТСБ делаю виртуальный массив цветов для каждой ячейки таблицы, чтобы потом заполнить. После применения меню "Test tbrowse" далее "Run test tbrowse-1/2" по условиям ставиться свой цвет ячейки в ТСБ и заполняется виртуальный массив цветов. Далее через шапку виртуальных колонок (1), (2), (3) и т.д. можно вызвать контекстное меню и установить фильтр по одной колонке или по всем колонкам. Вот такое краткое описание этого примера.
|
|
|
Ответов - 20
[только новые]
|
|
|
| постоянный участник
|
Пост N: 6839
Зарегистрирован: 12.09.06
|
|
Отправлено: 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, то контекстное меню показывается НЕПРАВИЛЬНО ! Вот картинка: Вот код редактирования шапок колонок: // 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 Почему так происходит ? Сергей посоветовал сделать ОДНУ функцию обработки шапки витртуальных и обычных колонок. А можно решить/исправить это для текущего кода ?
|
|
|
|
| постоянный участник
|
Пост N: 3496
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.11.20 16:44. Заголовок: Andrey пишет А можно..
Andrey пишет цитата: | А можно решить/исправить это для текущего кода ? |
| Попробуй 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 // номер ячейки в таблице ...
|
|
|
|
| постоянный участник
|
Пост N: 6840
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.11.20 22:08. Заголовок: SergKis пишет: nCol..
SergKis пишет: цитата: | nCol := Max(oBrw:nAtColActual( nColPix ), 1 ) |
| То что доктор прописал ! Заработало ! Осталось мне алгоритм закраски виртуального цвета исправить.
|
|
|
|
| постоянный участник
|
Пост N: 6841
Зарегистрирован: 12.09.06
|
|
Отправлено: 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 Но не знаю, правильно ли это будет ? Или всё таки сделать одну функцию на шапки колонок, как Сергей говорил ?
|
|
|
|
| постоянный участник
|
Пост N: 3497
Зарегистрирован: 17.02.12
|
|
Отправлено: 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 // номер ячейки в таблице
|
|
|
|
| постоянный участник
|
Пост N: 3498
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.11.20 17:20. Заголовок: Andrey пишет Или всё..
Andrey пишет цитата: | Или всё таки сделать одну функцию на шапки колонок |
| Разница в чем ? Если одна ф-я, то nCol := Max(oBrw:nAtColActual(nColPix), 1) IF nCol > 7 // меню Head ELSE // меню Virtual Head ENDIF или как сейчас
|
|
|
|
| постоянный участник
|
Пост N: 6842
Зарегистрирован: 12.09.06
|
|
Отправлено: 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 Для понимания кода это будет же лучше ? Переделывать ?
|
|
|
|
| постоянный участник
|
Пост N: 3499
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.11.20 17:51. Заголовок: Andrey пишет Пробова..
Andrey пишет цитата: | Пробовал, результат на картинке ! |
| Пример из Advanced\Tsb_VirtualColumn (с правкой выше) https://TransFiles.ru/urstz Работает как надо.
|
|
|
|
| постоянный участник
|
Пост N: 3500
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.11.20 18:49. Заголовок: Andrey пишет Если ку..
Andrey пишет цитата: | Если курсор загоним в конец таблицы и попробуем кликнуть на шапке виртуальных колонок, то выходит контекстное меню колонок таблицы, а не контекстное меню виртуальных колонок. |
| По мне логичнее было бы левым кликом по head давать данные реальные по колонке, а правым разделять виртуальные и обычные колонки, но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо
|
|
|
|
| постоянный участник
|
Пост N: 6843
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 06:19. Заголовок: SergKis пишет: Прим..
SergKis пишет: Что-то не так работает всё равно. Взял этот пример, запускаю. Кликаем мышкой на шапке виртуальных колонок. Контекстное меню правильное - срабатывает функция myVirtHeadClick() Вот картинка: Далее курсор на последнюю колонку, кликаем мышкой на шапке виртуальных колонок. Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick() Вот картинка: Эту проблему решает, то что я написал выше. Буду переписывать под вызов одной функции. SergKis пишет: цитата: | но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо |
| Да я думаю что дальше уже каждый сам под себя сделает. Главное показано как нужно сделать, а "допиливать" самому можно под себя.
|
|
|
|
| постоянный участник
|
Пост N: 6844
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 06:24. Заголовок: А почему в ТСБ не сд..
А почему в ТСБ не сделали :Cargo для каждой ячейки ? Можно было бы цвет записывать туда или что-то другое записывать. Удобней работать с ТСБ будет. Может НАШИ ЗНАТОКИ смогут это сделать или это лишнее ?
|
|
|
|
|
| постоянный участник
|
Пост N: 3501
Зарегистрирован: 17.02.12
|
|
Отправлено: 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() |
| Когда говорят о контекстном меню, я понимаю, клик правой кнопкой мыши, он работает в примере правильно, а клик левой кнопкой да же не смотрел. Если ты хочешь, что бы эти клики работали одинаково, то ты прав, надо подправить.
|
|
|
|
| постоянный участник
|
Пост N: 3502
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.11.20 07:31. Заголовок: PSА почему в ТСБ не ..
PS цитата: | А почему в ТСБ не сделали :Cargo для каждой ячейки ? |
| В режиме :lFastDrawCell в памяти hash сохраняется объект каждой отображенной ячейки (вместе с Cargo), можешь повторить для себя такой механизм при создании тсб до отображения, но это все будет зафиксировано в памяти, а цвета, как правило, привязываются к значениям данных в ячейке, а данные имеют свойство меняться в процессе работы. В режиме :lFastDrawCell в таком случае предусмотрено удаление данных объекта колонки из hash методом :FastDrawClear(...). Замены данных в объекте hash нет, но ты можешь это сделать сам, если оч. нужно.
|
|
|
|
| постоянный участник
|
Пост N: 6845
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 07:47. Заголовок: SergKis пишет: Carg..
SergKis пишет: цитата: | Cargo в колонках есть ДАВНО и использовать его тебе уже предлагалось так же давно ! |
| Так это в колонках, а я про ячейки пишу. Использую у себя Cargo в колонках и примеры помню где это есть. А почему в этом примере цвет фона ячеек стали писать в отдельный вирт.массив цвета, а не в Cargo ?
|
|
|
|
| постоянный участник
|
Пост N: 3503
Зарегистрирован: 17.02.12
|
|
Отправлено: 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())) тебе показался сложным
|
|
|
|
| постоянный участник
|
Пост N: 6846
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 08:16. Заголовок: SergKis пишет: oCol..
SergKis пишет: цитата: | oCol:Cargo:Set((oBrw:cAlias)->(RecNo()), <нужный цвет от значения поя колонки>) |
| Если запишем в Cargo цвет, то использовать его для других целей будет уже нельзя ? Ну там сделать потом типа oCol:bPrevEdit := { |nValue,oBrw| SetProperty(oBrw:cParentWnd, oBrw:cControlName, "Cargo", nValue), EditMy2() }
|
|
|
|
| постоянный участник
|
Пост N: 3504
Зарегистрирован: 17.02.12
|
|
Отправлено: 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] ... т
|
|
|
|
| постоянный участник
|
Пост N: 6847
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 14:25. Заголовок: SergKis пишет: и по..
SergKis пишет: цитата: | и потом доставать в блоках кода |
| Понял ! То что нужно !
|
|
|
|
| постоянный участник
|
Пост N: 3505
Зарегистрирован: 17.02.12
|
|
Отправлено: 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] ...
|
|
|
|
| постоянный участник
|
Пост N: 6848
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.20 17:20. Заголовок: SergKis пишет: Тогд..
SergKis пишет: цитата: | Тогда напишу точно, а то все равно будут грабли и спросишь |
| Спасибо ! Как раз для меня.
|
|
|
|