On-line: Andrey, гостей 2. Всего: 3 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 6838
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.11.20 09:27. Заголовок: Виртуальные колонки в TsBrowse ...


Всем привет !

Сделал данный пример (огромное спасибо Сергею, без него бы не сделал),
чтобы понять как можно в ТСБ делать виртуальные колонки.

Вообще это заготовка для показа сравнения двух баз, в виртуальных колонках
должны отражаться различия между записями в базе.
Различия по полям также должны отражаться по цвету ячеек ТСБ.
Но в качестве примера пока поставил симуляцию этого режима.

Для показа различий по цветам каждого ТСБ делаю виртуальный массив цветов
для каждой ячейки таблицы, чтобы потом заполнить.

После применения меню "Test tbrowse" далее "Run test tbrowse-1/2" по условиям
ставиться свой цвет ячейки в ТСБ и заполняется виртуальный массив цветов.

Далее через шапку виртуальных колонок (1), (2), (3) и т.д. можно вызвать
контекстное меню и установить фильтр по одной колонке или по всем колонкам.

Вот такое краткое описание этого примера.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 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

Почему так происходит ?

Сергей посоветовал сделать ОДНУ функцию обработки шапки витртуальных и обычных колонок.

А можно решить/исправить это для текущего кода ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 // номер ячейки в таблице
...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6840
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.11.20 22:08. Заголовок: SergKis пишет: nCol..


SergKis пишет:

 цитата:
nCol := Max(oBrw:nAtColActual( nColPix ), 1 )


То что доктор прописал ! Заработало !

Осталось мне алгоритм закраски виртуального цвета исправить.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Но не знаю, правильно ли это будет ?
Или всё таки сделать одну функцию на шапки колонок, как Сергей говорил ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 // номер ячейки в таблице


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
или как сейчас

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Для понимания кода это будет же лучше ?
Переделывать ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3499
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.11.20 17:51. Заголовок: Andrey пишет Пробова..


Andrey пишет
 цитата:
Пробовал, результат на картинке !


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3500
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.11.20 18:49. Заголовок: Andrey пишет Если ку..


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


По мне логичнее было бы левым кликом по head давать данные реальные по колонке, а правым разделять виртуальные и обычные колонки, но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6843
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.11.20 06:19. Заголовок: SergKis пишет: Прим..


SergKis пишет:

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


Что-то не так работает всё равно.
Взял этот пример, запускаю.
Кликаем мышкой на шапке виртуальных колонок.
Контекстное меню правильное - срабатывает функция myVirtHeadClick()
Вот картинка:


Далее курсор на последнюю колонку, кликаем мышкой на шапке виртуальных колонок.
Контекстное меню НЕ ПРАВИЛЬНОЕ - срабатывает функция myHeadClick()
Вот картинка:


Эту проблему решает, то что я написал выше.
Буду переписывать под вызов одной функции.

SergKis пишет:

 цитата:
но для примера и то что есть приемлемо, довести до ума может каждый, кому интересно и как надо


Да я думаю что дальше уже каждый сам под себя сделает.
Главное показано как нужно сделать, а "допиливать" самому можно под себя.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6844
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.11.20 06:24. Заголовок: А почему в ТСБ не сд..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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()


Когда говорят о контекстном меню, я понимаю, клик правой кнопкой мыши, он работает в примере правильно, а клик левой кнопкой да же не смотрел. Если ты хочешь, что бы эти клики работали одинаково, то ты прав, надо подправить.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3502
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.11.20 07:31. Заголовок: PSА почему в ТСБ не ..


PS
 цитата:
А почему в ТСБ не сделали :Cargo для каждой ячейки ?


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6845
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.11.20 07:47. Заголовок: SergKis пишет: Carg..


SergKis пишет:

 цитата:
Cargo в колонках есть ДАВНО и использовать его тебе уже предлагалось так же давно !


Так это в колонках, а я про ячейки пишу.
Использую у себя Cargo в колонках и примеры помню где это есть.

А почему в этом примере цвет фона ячеек стали писать в отдельный вирт.массив цвета, а не в Cargo ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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()))
тебе показался сложным

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() }


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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]
...
т

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6847
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.11.20 14:25. Заголовок: SergKis пишет: и по..


SergKis пишет:

 цитата:
и потом доставать в блоках кода


Понял ! То что нужно !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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]
...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6848
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.11.20 17:20. Заголовок: SergKis пишет: Тогд..


SergKis пишет:

 цитата:
Тогда напишу точно, а то все равно будут грабли и спросишь


Спасибо !
Как раз для меня.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 538
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет