Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №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: Игорь Мне думается, что дело не в скорости прорисовки строк тсб, а в скорости выполнения перемещений по базе и заполнения буферов записи rdd, т.е. много dbSkip() подводов вперед-назад. Если прочитать записи отображения 1 раз в буфер-массив и потом отображаить\рисовать их, то скорость работы тсб увеличится, даже при 4х кратной прорисовке окна тсб

kkg: коллеги, лишние прорисовки видны: при движении курсора в видимой области влево вправо когда прорисовывается вся строка вместо 2 ячеек аналогично лишняя прорисовка зоны nFreeze при прокрутке страницы но мне кажется максимальный эффект можно получить если не прорисовывать весь грид, а скопировать видимую неизменяемую часть экрана а потом стандартно прорисовать только одну стоку или столбец которых не хватает.

SergKis: kkg Вы почти правы, если отбросить 20 элементов обработки цветов в колонках. Если повторите мои исправления в тсб и пример, то увидите, что придраться к отработке событий прорисовки в логе почти не к чему. Основной тормоз это перемещения по файлу, осуществляемое при каждой прорисовке, сначала от текущей записи к первой потом от нее к последней, потом опять на текущую, с учетом событий got\lost focus как записи так и колонки


kkg: SergKis я бы согласился, но тормоза присутствуют и на массивах (кстати файлы тоже кешированны)

SergKis: kkg пишет я бы согласился, но тормоза присутствуют и на массивах (кстати файлы тоже кешированны) Работа блоков кода на колонках по преобразованию данных (цветов ...) не убирается, создайте массив строковый сразу - будет чуть лучше. А создайте массив сразу с объектами oTScell будет совсем хорошо.

kkg: SergKis Вы не поняли, я и предложил не создавать каждый раз, а использовать цвет пикселей экрана (прямоугольник) который уже просчитан и на экране, просто эту область переместить на нужные координаты и дорисовать строку или колонку которой не хватает

SergKis: kkg пишет просто эту область переместить на нужные координаты и дорисовать строку или колонку которой не хватает Я все понял. Сейчас тсб переотображая страницу покажет и изменившиеся значения в др. колонках при общем доступе с учетом цветов bmp и т.д. Ваш этого не учтет. В некоторых вариантах это необходимо, конечно. Но ... Вы предлагайте конкретно по тексту, берем тут, правим так или так. Игорь, как раз и смотрит, где можно что отсечь, к примеру с помощью доп. переменной. Меня лично скорость тсб устраивает, т.к. нет у меня MoreFields, практически все колонки помещаю на один экран (методика в примере Tsb_MoreFields\demo.prg) + выборки из базы (letodb) короткие только нужные колонки (для связи на letodb и доп. тек. индексов) и т.д.

gfilatov2002: SergKis пишет: Игорь, как раз и смотрит, где можно что отсечь, к примеру с помощью доп. переменной. Для этих целей добавил в класс TSBrowse переменную lFastDraw DATA lFastDraw AS LOGICAL INIT .F. Пример использования в методе GoRight(): [pre2] If ! ::lFastDraw lRefresh := ( ::lCanAppend .or. ::lIsArr ) EndIf [/pre2]

Haz: gfilatov2002 пишет: Пример использования в методе GoRight(): Григорий, тут эта строка лишняя на все 100. В goleft(), к примеру, нет подобного. К сожалению сегодня не удалось дальше поразбираться, но продолжу. О результатах буду писать здесь. Переменная нужна, она позволит оценить разницу в прорисовке не затрагивая стабильность работы.

Haz: SergKis пишет: Мне думается, что дело не в скорости прорисовки строк тсб, а в скорости выполнения перемещений по базе и заполнения безусловно, но тормоза в прорисовке тоже большие. У меня в тестовом проекте значения для показа в ячейке берутся из справочника по ID, после первого показа уже из hash. Скорость возрастает в разы! Словно режим турбо включили, но когда на экране более 5 связных бровсов , тот тут только прорисовка и даже видно как все происходит. Сначала один бровс, потом остальные. Вот и хочу понять где.

Haz: SergKis пишет: Меня лично скорость тсб устраивает, т.к. нет у меня MoreFields, в понедельник постараюсь накидать пример из нескольких бровсов. Уверен проблема обозначиться яснее. Суть в подчиненности таблиц, в зависимости от стройки в первой имеем выборку во второй ... и так далее. Прорисовка на экране идет волной более чем заметной. Возможно это тормозит метод :reset(). Вобщем постараюсь... накидать если по работе без форс мажора будет

Haz: kkg пишет: мне кажется максимальный эффект можно получить если не прорисовывать весь грид, а скопировать видимую неизменяемую часть экрана а потом стандартно прорисовать только одну стоку или столбец которых не хватает. Нужно переделывать сдвиги в сторону на скролл окна, как при движении вверх или вниз. Текущий алгоритм унаследован со времен клиппер. Скорость прорисовки возрастет кратно, но не отобразит на скроллируемом куске изменения данных другими пользователями ( так и есть при вверх вниз) и думаю это нормально. Сергей реализовал класс cell, на основe которого можно сделать :refreshscreen() который будет перерисовывать изменившиеся ячейки видимой части бровсв.

SergKis: Haz пишет класс cell, на основe которого можно сделать :refreshscreen() который будет перерисовывать изменившиеся ячейки видимой части бровсв. Это будет давать эффект, если иметь массив таких TSBcell объектов для всех строк экрана\окна тсб, для одной, как сейчас ничего не решит. Т.е. рисуем запоминаем объекты TSBcell, потом используем при повторных прорисовках

SergKis: Haz пишет но когда на экране более 5 связных бровсов , тот тут только прорисовка и даже видно как все происходит. Сначала один бровс, потом остальные. Вот и хочу понять где. Посмотрев лог примера выше, скажу так, если тсб на окне несколько, то на каждом срабатывает прорисовка от обычного режима +2, т.е. добавляются прорисовки GotFocus, LostFocus. Вот пример лога вход тсб + 2 раза pgdn и переключение на Far и обратно и выход [pre2] 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 [/pre2] добавил еще время прорисовки с учетом вывода в лог, т.е.[pre2] :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 } ... [/pre2]

kkg: SergKis Вы предлагайте конкретно по тексту, берем тут, правим так или так. "поигрался" на реальных данных из "тяжёлых" отчётов, на удивление мерцание текста вызывает не DrawLine, а DrawSelect путём "кастрации" в метод DrawCell и его использования в GoRight GoLeft мерцание текста потушил, но у меня не совсем стандартное использование, попробуйте у себя [pre2] * ============================================================================ * 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 [/pre2]

SergKis: kkg пишет попробуйте у себя Попробовал, поправил только ::DrawCell( /*::nAt*/, ::nOldCell) ::DrawCell( /*::nAt*/, ::nCell) т.к. :nAt это номер текущей строки отображения, т.е. для массива номер элемента, для dbf номер записи Разницы в работе не увидел (мониторы 14",15") Тут примеры https://TransFiles.ru/po4kc DemoMdi0.exe - это родной вариант DemoMdi.exe - это ваш

SergKis: PS Разве что в примере Tsb_Array_2 немного подрагивания меньше при горизонтальном движении вправо, но поставил ваше lRefresh := ( ::lCanAppend /*.or. ::lIsArr*/ ) и оно пропало

Haz: SergKis пишет: lCanAppend писал выше, нужно убрать всю строку целиком, не забыв проинициализировать переменную в . f. в начале метода. Просто не врубаюсь как связаны lCanAppend и goRight. С понедельника по не многу продолжу

SergKis: Haz пишет нужно убрать всю строку целиком, не забыв проинициализировать переменную в . f. в начале метода. Просто не врубаюсь как связаны lCanAppend и goRight. У меня lCanAppend всегда .F., потому без разницы где инициализировать. А вдруг, кто то врубается , а мы сломаем

Haz: SergKis пишет: А вдруг, кто то врубается , а мы сломаем CanAppend разрешает skip ниже последней строки и делает Append . как это должно влиять на goright не пойму. В goLeft такого нет. Так что не сломаем, а если сломаем то починим.



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