Автор | Сообщение |
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
SergKis
|
| постоянный участник
|
Пост N: 3405
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 12:29. Заголовок: Игорь Мне думается, ..
Игорь Мне думается, что дело не в скорости прорисовки строк тсб, а в скорости выполнения перемещений по базе и заполнения буферов записи rdd, т.е. много dbSkip() подводов вперед-назад. Если прочитать записи отображения 1 раз в буфер-массив и потом отображаить\рисовать их, то скорость работы тсб увеличится, даже при 4х кратной прорисовке окна тсб
| |
|
kkg
|
| |
Пост N: 22
Зарегистрирован: 29.11.19
|
|
Отправлено: 02.10.20 12:31. Заголовок: коллеги, лишние прор..
коллеги, лишние прорисовки видны: при движении курсора в видимой области влево вправо когда прорисовывается вся строка вместо 2 ячеек аналогично лишняя прорисовка зоны nFreeze при прокрутке страницы но мне кажется максимальный эффект можно получить если не прорисовывать весь грид, а скопировать видимую неизменяемую часть экрана а потом стандартно прорисовать только одну стоку или столбец которых не хватает.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3406
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 12:39. Заголовок: kkg Вы почти правы,..
kkg Вы почти правы, если отбросить 20 элементов обработки цветов в колонках. Если повторите мои исправления в тсб и пример, то увидите, что придраться к отработке событий прорисовки в логе почти не к чему. Основной тормоз это перемещения по файлу, осуществляемое при каждой прорисовке, сначала от текущей записи к первой потом от нее к последней, потом опять на текущую, с учетом событий got\lost focus как записи так и колонки
| |
|
kkg
|
| |
Пост N: 23
Зарегистрирован: 29.11.19
|
|
Отправлено: 02.10.20 12:55. Заголовок: SergKis я бы согла..
SergKis я бы согласился, но тормоза присутствуют и на массивах (кстати файлы тоже кешированны)
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3407
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 13:07. Заголовок: kkg пишет я бы согла..
kkg пишет цитата: | я бы согласился, но тормоза присутствуют и на массивах (кстати файлы тоже кешированны) |
| Работа блоков кода на колонках по преобразованию данных (цветов ...) не убирается, создайте массив строковый сразу - будет чуть лучше. А создайте массив сразу с объектами oTScell будет совсем хорошо.
| |
|
kkg
|
| |
Пост N: 24
Зарегистрирован: 29.11.19
|
|
Отправлено: 02.10.20 13:36. Заголовок: SergKis Вы не понял..
SergKis Вы не поняли, я и предложил не создавать каждый раз, а использовать цвет пикселей экрана (прямоугольник) который уже просчитан и на экране, просто эту область переместить на нужные координаты и дорисовать строку или колонку которой не хватает
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3408
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 13:51. Заголовок: kkg пишет просто эту..
kkg пишет цитата: | просто эту область переместить на нужные координаты и дорисовать строку или колонку которой не хватает |
| Я все понял. Сейчас тсб переотображая страницу покажет и изменившиеся значения в др. колонках при общем доступе с учетом цветов bmp и т.д. Ваш этого не учтет. В некоторых вариантах это необходимо, конечно. Но ... Вы предлагайте конкретно по тексту, берем тут, правим так или так. Игорь, как раз и смотрит, где можно что отсечь, к примеру с помощью доп. переменной. Меня лично скорость тсб устраивает, т.к. нет у меня MoreFields, практически все колонки помещаю на один экран (методика в примере Tsb_MoreFields\demo.prg) + выборки из базы (letodb) короткие только нужные колонки (для связи на letodb и доп. тек. индексов) и т.д.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1796
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.10.20 16:50. Заголовок: Всем кому это интересно
SergKis пишет: цитата: | Игорь, как раз и смотрит, где можно что отсечь, к примеру с помощью доп. переменной. |
| Для этих целей добавил в класс TSBrowse переменную lFastDraw цитата: | DATA lFastDraw AS LOGICAL INIT .F. |
| Пример использования в методе GoRight(): If ! ::lFastDraw lRefresh := ( ::lCanAppend .or. ::lIsArr ) EndIf
| |
|
Haz
|
| |
Пост N: 1621
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.10.20 20:28. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Пример использования в методе GoRight(): |
|
Григорий, тут эта строка лишняя на все 100. В goleft(), к примеру, нет подобного. К сожалению сегодня не удалось дальше поразбираться, но продолжу. О результатах буду писать здесь. Переменная нужна, она позволит оценить разницу в прорисовке не затрагивая стабильность работы.
| |
|
Haz
|
| |
Пост N: 1622
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.10.20 20:35. Заголовок: SergKis пишет: Мне ..
SergKis пишет: цитата: | Мне думается, что дело не в скорости прорисовки строк тсб, а в скорости выполнения перемещений по базе и заполнения |
|
безусловно, но тормоза в прорисовке тоже большие. У меня в тестовом проекте значения для показа в ячейке берутся из справочника по ID, после первого показа уже из hash. Скорость возрастает в разы! Словно режим турбо включили, но когда на экране более 5 связных бровсов , тот тут только прорисовка и даже видно как все происходит. Сначала один бровс, потом остальные. Вот и хочу понять где.
| |
|
Haz
|
| |
Пост N: 1623
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.10.20 20:42. Заголовок: SergKis пишет: Меня..
SergKis пишет: цитата: | Меня лично скорость тсб устраивает, т.к. нет у меня MoreFields, |
|
в понедельник постараюсь накидать пример из нескольких бровсов. Уверен проблема обозначиться яснее. Суть в подчиненности таблиц, в зависимости от стройки в первой имеем выборку во второй ... и так далее. Прорисовка на экране идет волной более чем заметной. Возможно это тормозит метод :reset(). Вобщем постараюсь... накидать если по работе без форс мажора будет
| |
|
|
Haz
|
| |
Пост N: 1624
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.10.20 20:49. Заголовок: kkg пишет: мне каже..
kkg пишет: цитата: | мне кажется максимальный эффект можно получить если не прорисовывать весь грид, а скопировать видимую неизменяемую часть экрана а потом стандартно прорисовать только одну стоку или столбец которых не хватает. |
| Нужно переделывать сдвиги в сторону на скролл окна, как при движении вверх или вниз. Текущий алгоритм унаследован со времен клиппер. Скорость прорисовки возрастет кратно, но не отобразит на скроллируемом куске изменения данных другими пользователями ( так и есть при вверх вниз) и думаю это нормально. Сергей реализовал класс cell, на основe которого можно сделать :refreshscreen() который будет перерисовывать изменившиеся ячейки видимой части бровсв.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3409
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 22:17. Заголовок: Haz пишет класс cell..
Haz пишет цитата: | класс cell, на основe которого можно сделать :refreshscreen() который будет перерисовывать изменившиеся ячейки видимой части бровсв. |
| Это будет давать эффект, если иметь массив таких TSBcell объектов для всех строк экрана\окна тсб, для одной, как сейчас ничего не решит. Т.е. рисуем запоминаем объекты TSBcell, потом используем при повторных прорисовках
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3410
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 22:37. Заголовок: Haz пишет но когда н..
Haz пишет цитата: | но когда на экране более 5 связных бровсов , тот тут только прорисовка и даже видно как все происходит. Сначала один бровс, потом остальные. Вот и хочу понять где. |
| Посмотрев лог примера выше, скажу так, если тсб на окне несколько, то на каждом срабатывает прорисовка от обычного режима +2, т.е. добавляются прорисовки GotFocus, LostFocus. Вот пример лога вход тсб + 2 раза pgdn и переключение на Far и обратно и выход Скрытый текст
xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 1 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 1 SELECTOR 0.00 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 2 ID 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 3 FIRST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 4 LAST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 5 STREET 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 6 CITY 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 7 STATE 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 8 ZIP 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 3421 :DISPLAY 654 .F. Col = 9 HIREDATE 0.02 xRow = 2 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 2 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 3421 :DISPLAY 654 .T. Col = 1 SELECTOR 0.00 ... xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 1 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 1 SELECTOR 0.00 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 2 ID 0.00 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 3 FIRST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 4 LAST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 5 STREET 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 6 CITY 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 7 STATE 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 8 ZIP 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10800 :PAINT 3421 :DISPLAY 13994 .F. Col = 9 HIREDATE 0.02 xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 1 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 1 SELECTOR 0.00 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 2 ID 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 3 FIRST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 4 LAST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 5 STREET 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 6 CITY 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 7 STATE 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 8 ZIP 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 9 HIREDATE 0.02 xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 1 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10903 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .F. Col = 1 SELECTOR 0.00 ... xRow = 18 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 18 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 1 SELECTOR 0.00 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 2 ID 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 3 FIRST 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 4 LAST 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 5 STREET 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 6 CITY 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 7 STATE 0.01 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 8 ZIP 0.02 (b)MAIN 4291 :TSDRAWCELL 4272 :DRAWLINE 10905 :PAINT 870 TCONTROL:HANDLEEVENT 9446 .T. Col = 9 HIREDATE 0.02 xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 19 19 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 1 SELECTOR 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 2 ID 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 3 FIRST 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 4 LAST 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 5 STREET 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 6 CITY 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 7 STATE 0.05 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 8 ZIP 0.05 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10621 :PAGEDOWN 8536 :KEYDOWN 9406 .F. Col = 9 HIREDATE 0.05 xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 19 19 ... xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 1 1 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 1 SELECTOR 0.00 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 2 ID 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 3 FIRST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 4 LAST 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 5 STREET 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 6 CITY 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 7 STATE 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 8 ZIP 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 9 HIREDATE 0.02 ... xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 19 19 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 1 SELECTOR 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 2 ID 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 3 FIRST 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 4 LAST 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 5 STREET 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 6 CITY 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 7 STATE 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 8 ZIP 0.04 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 10228 :LOSTFOCUS 896 TCONTROL:HANDLEEVENT 9446 .F. Col = 9 HIREDATE 0.05 xRow = 1 nRowCount = 18 nCell = 2 nTek = 1 RecNo = 19 19 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 1 SELECTOR 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 2 ID 0.01 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 3 FIRST 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 4 LAST 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 5 STREET 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 6 CITY 0.02 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 7 STATE 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 8 ZIP 0.03 (b)MAIN 4291 :TSDRAWCELL 4758 :DRAWSELECT 8034 :GOTFOCUS 915 TCONTROL:HANDLEEVENT 9446 .F. Col = 9 HIREDATE 0.03
| добавил еще время прорисовки с учетом вывода в лог, т.е. :Cargo:nSeconds := Seconds() :bOnDrawLine := {|ob,xrow| Local nRow := ob:nRowPos Local nPos := ob:nCell Local nLen := Len(ob:aRowPosAtRec) ob:Cargo:nSeconds := Seconds() ... :bTSDrawCell := {|ob,oc,ok| If oc:nDrawType == 0 ? myproc(1),procline(1),myproc(2),procline(2),myproc(3),procline(3),myproc(4),procline(4),myproc(5),procline(5) ?? oc:lDrawLine,"Col =",oc:nCell, ok:cName, Seconds() - ob:Cargo:nSeconds EndIf Return Nil } ...
| |
|
kkg
|
| |
Пост N: 25
Зарегистрирован: 29.11.19
|
|
Отправлено: 03.10.20 22:31. Заголовок: SergKis Вы предлага..
SergKis цитата: | Вы предлагайте конкретно по тексту, берем тут, правим так или так. |
| "поигрался" на реальных данных из "тяжёлых" отчётов, на удивление мерцание текста вызывает не DrawLine, а DrawSelect путём "кастрации" в метод DrawCell и его использования в GoRight GoLeft мерцание текста потушил, но у меня не совсем стандартное использование, попробуйте у себя Скрытый текст * ============================================================================ * METHOD TSBrowse:GoRight() Version 9.0 Nov/30/2009 * ============================================================================ ... lRefresh := ( ::lCanAppend /*.or. ::lIsArr*/ ) // Игорь прав уже год делаю такую правку While ! ::IsColVisible( ::nCell ) .and. ::nColPos < ::nCell ::nColPos ++ lRefresh := .T. EndDo ::HiliteCell( ::nCell ) If ::aColumns[ ::nCell ]:bGotFocus != Nil .and. ::nOldCell != ::nCell Eval( ::aColumns[ ::nCell ]:bGotFocus, ::nOldCell, ::nCell, Self ) EndIf If ::aColumns[ ::nOldCell ]:bLostFocus != Nil .and. ::nOldCell != ::nCell Eval( ::aColumns[ ::nOldCell ]:bLostFocus, ::nCell, ::nOldCell, Self ) EndIf If lRefresh ::lNoPaint := .F. ::Refresh( .F. ) ElseIf ! ::lEditing ::DrawCell( ::nAt, ::nOldCell) ::DrawCell( ::nAt, ::nCell) // ::DrawSelect() EndIf ... * ============================================================================ * METHOD TSBrowse:GoLeft() Version 9.0 Nov/30/2009 * ============================================================================ ... If ::aColumns[ ::nOldCell ]:bLostFocus != Nil .and. ::nOldCell != ::nCell Eval( ::aColumns[ ::nOldCell ]:bLostFocus, ::nCell, ::nOldCell, Self ) EndIf iif( ::oHScroll != Nil, ::oHScroll:SetPos( ::nCell ), Nil ) ::HiliteCell( ::nCell ) // If ::nOldCell > ::nColPos .or. ::nCell <= ::nFreeze ::DrawCell( ::nAt, ::nOldCell) ::DrawCell( ::nAt, ::nCell) Else ::DrawSelect() endif ::nOldCell := ::nCell // If ::aColumns[ ::nCell ]:lVisible == .F. If ::nCell == 1 ::GoRight() Else ::GoLeft() Endif endif ... * ============================================================================ * METHOD TSBrowse:DrawCell() возможно правильнее DrawCellSelect() * ============================================================================ METHOD DrawCell( nRow,nCol ) CLASS TSBrowse Local oColumn, nStartCol, hBitMap, hFont, nAlign, cPicture, nClrFore, nClrBack, ; //, nBegin , nLastCol lNoLite, uData, l3DLook, lMulti, nClrTo, lOpaque, lBrush, nCursor, lCheck, uBmpCell, cMsg, lAdjBmp, ; lSelected, lDrawCell, ; nVertText := 0, ; nMaxWidth := ::nWidth(), ; // use local copies for speed nRowPos := ::nRowPos, ; aColSizes := AClone( ::aColSizes ), ; hWnd := ::hWnd, ; hDC := ::hDc, ; lFocused := ::lFocused := ( GetFocus() == ::hWnd ), ; nVAlign := 1 Local l3DText, nClr3dL, nClr3dS Local aBitMaps, lCheckVal := .F., cColAls Local lDraw := .F., xData //nDeltaLen, Local nClrText := ::nClrText, ; nClrPane := ::nClrPane, ; nClrFocuFore := ::nClrFocuFore, ; nClrFocuBack := ::nClrFocuBack, ; nClrLine := ::nClrLine, ; nLineStyle /*:= ::nLineStyle*/, ; nClrSeleBack := ::nClrSeleBack, ; nClrSeleFore := ::nClrSeleFore, ; nHeightCell := ::nHeightCell //, ; // nHeightHead := iif( ::lDrawHeaders, ::nHeightHead, 0 ), ; // nHeightFoot := iif( ::lDrawFooters != nil .and. ::lDrawFooters, ::nHeightFoot, 0 ), ; // nHeightSuper := iif( ::lDrawHeaders, ::nHeightSuper, 0 ),; // nHeightSpecHd:= iif( ::lDrawSpecHd, ::nHeightSpecHd, 0 ) Default nRow := nRowPos, lDrawCell := .T. ::nPaintRow := nRow ::aDrawCols := {} If Empty( ::aColumns ) Return Self EndIf If nCol < 1 .or. nCol > len(::aColumns) Return Self EndIf If _HMG_MainClientMDIHandle != 0 .and. ! lFocused .and. ::hWndParent == GetActiveMdiHandle() lFocused := .T. EndIf ::lDrawSelect := .T. lSelected := ::lCanSelect .and. ( AScan( ::aSelected, iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt ) ) > 0 ) nClrBack := iif( ::nPhantom = -1 .and. ! Empty( ::aColumns ), ATail( ::aColumns ):nClrBack, nClrPane ) nClrBack := iif( ValType( nClrBack ) == "B", Eval( nClrBack, ::nAt, Len( ::aColumns ), Self ), nClrBack ) l3DLook := iif( ::nPhantom = -1 .and. ! Empty( ::aColumns ), ATail( ::aColumns ):l3DLook, .F. ) IF ::lRowPosAtRec IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount() ::aRowPosAtRec := Array( ::nRowCount() ) AFill( ::aRowPosAtRec, 0 ) ENDIF IF nRow == 0 .or. nRow > Len( ::aRowPosAtRec ) ELSEIF ::lIsDbf ::aRowPosAtRec[ nRow ] := ( ::cAlias )->( RecNo() ) ELSEIF ::lIsArr ::aRowPosAtRec[ nRow ] := ::nAt ENDIF ENDIF oColumn := ::aColumns[ nCol ] If ! ValType( oColumn ) == "O" .or. ! ValType(oColumn:oCell ) == "O" Return Self EndIf nLineStyle := ::nLineStyle nStartCol := oColumn:oCell:nStartCol If nStartCol == nil Return Self EndIf If HB_ISNUMERIC( oColumn:nLineStyle ) nLineStyle := oColumn:nLineStyle EndIf hFont := ::hFontGet( oColumn, nCol ) lAdjBmp := oColumn:lAdjBmp nAlign := oColumn:nAlign lOpaque := .T. lMulti := .F. cColAls := iif( '->' $ oColumn:cField, nil, oColumn:cAlias ) If nCol == 1 .and. ! Empty( ::hBmpCursor ) uBmpCell := ::hBmpCursor uData := "" xData := "" nAlign := nMakeLong( oColumn:nAlign, oColumn:nAlign ) lNoLite := .T. lAdjBmp := .F. lCheck := .F. Else If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" ElseIf cColAls != nil If Valtype( oColumn:bSeek ) == 'B' ( cColAls )->( Eval( oColumn:bSeek, Self, nCol ) ) EndIf uData := ::bDataEval( oColumn, , nCol ) Else If Valtype( oColumn:bSeek ) == 'B' Eval( oColumn:bSeek, Self, nCol ) EndIf uData := ::bDataEval( oColumn, , nCol ) EndIf xData := uData lMulti := Valtype( uData ) == "C" .and. At( Chr( 13 ), uData ) > 0 cPicture := ::cPictureGet( oColumn, nCol ) lCheck := ( oColumn:lCheckBox .and. ValType( uData ) == "L" .and. oColumn:lVisible ) lNoLite := oColumn:lNoLite nVertText := 0 If lCheck cPicture := "" nVertText := iif( uData, 3, 4 ) lCheckVal := uData EndIf uBmpCell := oColumn:uBmpCell If nCol == ::nColSel .and. ::uBmpSel != nil .and. lSelected uBmpCell := ::uBmpSel nAlign := nMakeLong( LoWord( nAlign ), ::nAligBmp ) ElseIf oColumn:lBitMap .and. Valtype( uData ) == "N" aBitMaps := iif( Valtype( oColumn:aBitMaps ) == "A", oColumn:aBitMaps, ::aBitMaps ) If ! Empty( aBitMaps ) .and. uData > 0 .and. uData <= Len( aBitMaps ) uBmpCell := aBitMaps[ uData ] EndIf nAlign := nMakeLong( LoWord( nAlign ), nAlign ) uData := "" ElseIf ! lCheck .and. oColumn:lEmptyValToChar .and. Empty( uData ) uData := "" ElseIf Empty( cPicture ) .or. lMulti uData := iif( Valtype( uData ) != "C", cValToChar( uData ), uData ) Else uData := iif( uData == nil, "", Transform( uData, cPicture ) ) EndIf EndIf nAlign := ::nAlignGet( oColumn:nAlign, nCol, DT_LEFT ) If lNoLite If ::lLiteBar nClrFore := ::GetValProp( oColumn:nClrFocuFore, nClrText, nCol, ::nAt ) nClrBack := ::GetValProp( oColumn:nClrFocuBack, nClrPane, nCol, ::nAt ) If ! Empty(oColumn:cName) .and. oColumn:cName == "oPhant" nClrBack := nClrPane ElseIf ValType( nClrBack ) == "N" .and. nClrBack < 0 nClrBack *= -1 EndIf Else nClrFore := ::GetValProp( oColumn:nClrFore, nClrText, nCol, ::nAt ) nClrBack := ::GetValProp( oColumn:nClrBack, nClrPane, nCol, ::nAt ) EndIf nCursor := 0 Else If ( nClrFore := iif( lFocused, oColumn:nClrFocuFore, oColumn:nClrSeleFore ) ) == Nil nClrFore := iif( lFocused, nClrFocuFore, nClrSeleFore ) EndIf nClrFore := ::GetValProp( nClrFore, nClrFore, nCol, ::nAt ) If ( nClrBack := iif( lFocused, oColumn:nClrFocuBack, oColumn:nClrSeleBack ) ) == Nil nClrBack := iif( lFocused, nClrFocuBack, nClrSeleBack ) EndIf nClrBack := ::GetValProp( nClrBack, nClrBack, nCol, ::nAt ) If ValType( nClrBack ) == "N" .and. nClrBack < 0 nCursor := Abs( nClrBack ) nClrBack := ::GetValProp( oColumn:nClrBack, nClrPane, nCol, ::nAt ) Else nCursor := 0 EndIf EndIf If ValType( nClrBack ) == "A" nClrBack := ::nClrBackArr( nClrBack, nCol, ::nAt ) nClrTo := nClrBack[2] nClrBack := nClrBack[1] Else nClrTo := nClrBack EndIf lBrush := Valtype( nClrBack ) == "O" l3DLook := oColumn:l3DLook hBitMap := iif( ValType( uBmpCell ) == "B" .and. ! ::lPhantArrRow, Eval( uBmpCell, nCol, Self ), uBmpCell ) hBitMap := iif( ValType( hBitMap ) == "O" .and. ! ::lPhantArrRow, Eval( ::bBitMapH, hBitMap ), hBitMap ) Default hBitMap := 0 If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 ) } If Valtype(oColumn:aCheck) == "A" hBitMap := oColumn:aCheck[ iif( lCheckVal, 1, 2 ) ] Else hBitMap := ::aCheck[ iif( lCheckVal, 1, 2 ) ] EndIf nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" EndIf If oColumn:l3DTextCell != nil l3DText := oColumn:l3DTextCell nClr3dL := oColumn:nClr3DLCell nClr3dS := oColumn:nClr3DSCell nClr3dL := iif( ValType( nClr3dL ) == "B", Eval( nClr3dL, ::nAt, nCol, Self ), nClr3dL ) nClr3dS := iif( ValType( nClr3dS ) == "B", Eval( nClr3dS, ::nAt, nCol, Self ), nClr3dS ) Else l3DText := nClr3dL := nClr3dS := nil EndIf If nAlign != DT_CENTER .and. ::nCellMarginLR != nil uData := ::CellMarginLeftRight( nCol, uData, oColumn, nAlign, lMulti, 0 ) EndIf oColumn:oCell:nRow := nRowPos oColumn:oCell:nCol := nStartCol // oColumn:oCell:nWidth := aColSizes[ nCol ] + nDeltaLen oColumn:oCell:nHeight := ::nHeightCell oColumn:oCell:nCell := nCol oColumn:oCell:uValue := xData oColumn:oCell:lDrawLine := .F. // DrawSelect() oColumn:oCell:hWnd := hWnd // 1 oColumn:oCell:hDC := hDC // 2 oColumn:oCell:xRow := nRowPos // 3 oColumn:oCell:nStartCol := nStartCol // 4 // oColumn:oCell:nSize := aColSizes[ nCol ] + nDeltaLen // 5 aColSizes[ nCol ] + nDeltaLen oColumn:oCell:uData := uData // 6 oColumn:oCell:nAlign := nAlign // 7 oColumn:oCell:nClrFore := nClrFore // 8 oColumn:oCell:nClrBack := nClrBack // 9 oColumn:oCell:hFont := hFont // 10 oColumn:oCell:hBitMap := hBitMap // 11 oColumn:oCell:nHeightCell:= nHeightCell // 12 oColumn:oCell:l3DLook := l3DLook // 13 oColumn:l3DLook oColumn:oCell:nLineStyle := nLineStyle // 14 oColumn:oCell:nClrLine := nClrLine // 15 oColumn:oCell:nDrawType := 0 // 16 line/header/footer/super // oColumn:oCell:nHeightHead:= nHeightHead // 17 // oColumn:oCell:nHeightFoot:= nHeightFoot // 18 // oColumn:oCell:nHeightSuper := nHeightSuper // 19 // oColumn:oCell:nHeightSpecHd := nHeightSpecHd // 20 oColumn:oCell:lAdjBmp := lAdjBmp // 21 oColumn:oCell:lMultiline := lMulti // 22 oColumn:oCell:nVAlign := nVAlign // 23 oColumn:oCell:nVertText := nVertText // 24 oColumn:oCell:nClrTo := nClrTo // 25 oColumn:oCell:lOpaque := lOpaque // 26 oColumn:oCell:hBrush := iif( lBrush, nClrBack:hBrush, 0 ) // 27 oColumn:oCell:l3DText := l3DText // 28 3D text oColumn:oCell:nClr3dL := nClr3dL // 29 3D text light color oColumn:oCell:nClr3dS := nClr3dS // 30 3D text shadow color oColumn:oCell:nCursor := nCursor // 31 Rect cursor oColumn:oCell:lInvertColor := !(::lCellBrw .and. nCol != ::nCell) // 32 Invert color If lDrawCell lDraw := ::TSDrawCell( oColumn:oCell, oColumn ) Else lDraw := .T. EndIf If lDraw AAdd( ::aDrawCols, nCol ) EndIf If ::bOnDraw != Nil Eval( ::bOnDraw, Self ) EndIf If ::lCellBrw cMsg := iif( ! Empty( ::AColumns[ ::nCell ]:cMsg ), ::AColumns[ ::nCell ]:cMsg, ::cMsg ) cMsg := iif( ValType( cMsg ) == "B", Eval( cMsg, Self, ::nCell ), cMsg ) If ! Empty( cMsg ) ::SetMsg( cMsg ) EndIf EndIf ::lDrawSelect := .F. Return Self
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3411
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.10.20 09:53. Заголовок: kkg пишет попробуйте..
kkg пишет Попробовал, поправил только ::DrawCell( /*::nAt*/, ::nOldCell) ::DrawCell( /*::nAt*/, ::nCell) т.к. :nAt это номер текущей строки отображения, т.е. для массива номер элемента, для dbf номер записи Разницы в работе не увидел (мониторы 14",15") Тут примеры https://TransFiles.ru/po4kc DemoMdi0.exe - это родной вариант DemoMdi.exe - это ваш
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3412
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.10.20 09:59. Заголовок: PS Разве что в приме..
PS Разве что в примере Tsb_Array_2 немного подрагивания меньше при горизонтальном движении вправо, но поставил ваше lRefresh := ( ::lCanAppend /*.or. ::lIsArr*/ ) и оно пропало
| |
|
Haz
|
| |
Пост N: 1625
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.10.20 11:58. Заголовок: SergKis пишет: lCan..
SergKis пишет: писал выше, нужно убрать всю строку целиком, не забыв проинициализировать переменную в . f. в начале метода. Просто не врубаюсь как связаны lCanAppend и goRight. С понедельника по не многу продолжу
| |
|
SergKis
|
| постоянный участник
|
Пост N: 3413
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.10.20 12:05. Заголовок: Haz пишет нужно убра..
Haz пишет цитата: | нужно убрать всю строку целиком, не забыв проинициализировать переменную в . f. в начале метода. Просто не врубаюсь как связаны lCanAppend и goRight. |
| У меня lCanAppend всегда .F., потому без разницы где инициализировать. А вдруг, кто то врубается , а мы сломаем
| |
|
Haz
|
| |
Пост N: 1626
Зарегистрирован: 20.02.11
|
|
Отправлено: 04.10.20 13:04. Заголовок: SergKis пишет: А вд..
SergKis пишет: цитата: | А вдруг, кто то врубается , а мы сломаем |
|
CanAppend разрешает skip ниже последней строки и делает Append . как это должно влиять на goright не пойму. В goLeft такого нет. Так что не сломаем, а если сломаем то починим.
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|