On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
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;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


kkg



Пост N: 26
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 04.10.20 23:51. Заголовок: Haz а если сломаем ..


Haz

 цитата:
а если сломаем то починим.


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


для GoLeft аналогично
нужно проверить :lMoreFields := .T. может он и ненужен будет

PS. наверно нужно прокомментировать.
это место где при выходе за пределы экрана прорисовывается весь экран (что бы проверить достаточно заремить)
меня как и Сержа не волнует скорость, раздражает мерцание текста (двойная прорисовка)
чтоб убрать мерцание в зоне Freeze хотел DrawCell расширить до прорисовки таблицы и заодно рисовать не построчно,
а по колонкам (по идее один раз открывая объект колонки и меняя только изменяемые значения для строк можно было бы ускорится)
по факту все попытки получить массив строк и колонок вызывают DraweLine (что делает бессмысленным саму прорисовку)
как и нет смысла рисовать строку курсора DrawSelect всё равно вызовется 2 раза до и после по GotLostFocus.
если подскажете как в этом месте получить массив строк,колонок без прорисовки, попробую допилить DrawCell

Спасибо: 0 
Профиль
kkg



Пост N: 27
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 05.10.20 11:48. Заголовок: Haz писал выше, нуж..


Haz

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



не нужно, при движении вправо по последней строке и достижения конца, должна произойти вставка строки и для её отображения нужен refresh
для движения влево не нужно

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




Пост N: 3414
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.20 16:40. Заголовок: kkg пишет по факту в..


kkg пишет
 цитата:
по факту все попытки получить массив строк и колонок вызывают DraweLine (что делает бессмысленным саму прорисовку) как и нет смысла рисовать строку курсора DrawSelect всё равно вызовется 2 раза до и после по GotLostFocus.


Не все так грустно.
Можно делать таким образом для начала, схема очень упрощенная
- имеем hash с ключом <Recno\Element>+<имя колонки>+<тип вывода (line\select)> в значении {oCol, oCell}
- в блоке кода :bOnDrawLine если ключ есть, то выводим :TSDrawCell( oCell, oCol ) из массива и возвращаем .T.
- в блоке кода :bTSDrawCell если ключ есть, то вывод уже был, возвращаем .F. иначе на ключ запоминаем массив {oCol, oCell} и возврат .T.
- для ключа <Recno\Element> значение берем из
 
If xrow > 0 .and. xrow <= Len(ob:aRowPosAtRec)
?? ob:aRowPosAtRec[ xrow ]
EndIf

- не очень ясно в какой момент очищать hash от ключей уже не используемых, т.е. за пределами данных массива ob:aRowPosAtRec

По тексту
 
METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse
...

If ::bOnDrawLine != Nil // свой блок кода для рисования
IF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) ) ; RETURN Self
ENDIF

EndIf
...
METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse
...
If ::bOnDrawLine != Nil // свой блок кода для рисования
IF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) ) ; RETURN Self
ENDIF

EndIf

If ! ::lDrawLine
...
В программе ставим
:lRowPosAtRec := .T.
:bTSDrawCell := {|ob,ocel,ocol|
If oc:nDrawType == 0
IF oc:lDrawLine // DrawLine
// рисуем, если ключ есть
ELSE // DrawSelect
// рисуем, если ключ есть
ENDIF
EndIf
Return Nil
}
:bOnDrawLine := {|ob,xrow|
// свой вывод или стандартный
Return Nil
}


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1627
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.10.20 17:22. Заголовок: kkg пишет: при движ..


kkg пишет:

 цитата:
при движении вправо по последней строке и достижения конца, должна произойти вставка строки


в исходниках не нашел такой фичи , ткните пальцем

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1628
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.10.20 17:25. Заголовок: kkg пишет: меня как..


kkg пишет:

 цитата:
меня как и Сержа не волнует скорость, раздражает мерцание текста (двойная прорисовка)


со скоростью соглашусь , на локальном примере без сети и простым дбф - не удалость получить эффект тормоза. Видимо Сергей прав - все дело в скорости выборки данных

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




Пост N: 3415
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.20 18:16. Заголовок: Haz пишет все дело в..


Haz пишет
 цитата:
все дело в скорости выборки данных


Весь текст h_tbrowse.prg пропитан такими строками
 
nSkip := nNewRow - nOldRow

If ( ::nRowPos + nSkip ) <= nTotRow .and. ( ::nRowPos + nSkip ) >= 1

::Skip( nSkip )
::nRowPos += nSkip

ElseIf ! ::lIsDbf
::nAt := nNewRow
ElseIf Empty( ::nLogicPos() )

While ::nAt != nNewRow

If ::nAt < nNewRow
::Skip( 1 )
Else
::Skip( -1 )
EndIf

EndDo

ElseIf ! Empty( ::nLogicPos() )

( cAlias )->( DbSkip( nSkip ) )
::nAt := ::nLogicPos()

Else
( cAlias )->( Eval( ::bGoToPos, nNewRow ) )
::nAt := ::nLogicPos()
EndIf

If nNewRow != nOldRow .and. ::nLen > nTotRow .and. nNewRow > nTotRow

If ::lIsDbf

nRecNo := ( cAlias )->( RecNo() )

( cAlias )->( DbSkip( nTotRow - ::nRowPos ) )

If ( cAlias )->( EoF() )

Eval( ::bGoBottom )
::nRowPos := nTotRow

While ::nRowPos > 1 .and. ( cAlias )->( RecNo() ) != nRecNo
::Skip( -1 )
::nRowPos --
EndDo

Else
( cAlias )->( DbGoTo( nRecNo ) )
EndIf

т.е. постоянно переходим к первой потом от нее к текущей и еще это может происходить не 1 раз, откуда скорость возьмется ?
Запоминать только первую строку (позицию) и переходить от нее к тек. не очень проходит, в промежутке может появиться новая строка и все развалится. Можно пробовать танцевать от массива :aRowPosAtRec по содержимому элементов, т.е. сразу переход на первый и потом до тек. xRow и до конца отображать, в принциме аналогичным массивом\hash можно организовать одинарную прорисовку строк, но как то хлопотно по мне

Спасибо: 0 
Профиль
kkg



Пост N: 28
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 05.10.20 19:10. Заголовок: Haz в исходниках не..


Haz

 цитата:
в исходниках не нашел такой фичи , ткните пальцем


в исходниках этого не найти, это жизнь.
когда пользователь вводит данные и нажимает Enter уходит вправо,
на последней строке и последней колонке рождается новая строка (в ней весь заложенный смысл)
хотя согласен, для арабов должно работать и при движении влево, видать не юзают Harbour
PS был не прав, то что для нас вправо вниз, а влево ввех, для арабов наоборот, лучше этот вариант вообще не рассматривать, а то запутаемся

Спасибо: 0 
Профиль
kkg



Пост N: 29
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 05.10.20 19:22. Заголовок: SergKis Можно делат..


SergKis

 цитата:
Можно делать таким образом для начала, схема очень упрощенная


в обед нарыл попроще
 
m := ::lFirstPaint
::lFirstPaint := nil
n := ::lDrawLine
::lDrawLine := .F.
j :=::nAt
i := -1 * ::nRowPos() - 1
if i !=0; ::skip(i)
endif
for i = 1 to ::nRowCount()
::skip(1)
next
::GoPos( j, ::nCell )
::lDrawLine := n
::lFirstPaint := m

, но к сожалению на несколько дней загрузили работой.
если есть интерес могу скинуть промежеточный код DrawCell в DrawRect но он очень "сырой"

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




Пост N: 3416
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.20 19:42. Заголовок: kkg пишет если есть ..


kkg пишет
 цитата:
если есть интерес могу скинуть


Нет, не надо, в целом, меня устраивает и то как сейчас работает.
Все решается выборкой на local pc или процедурой на сервере (массив recno) и тсб на этот файл с выборкой
Скорости хватает, не спорткар, но и не трактор

Спасибо: 0 
Профиль
kkg



Пост N: 30
Зарегистрирован: 29.11.19
ссылка на сообщение  Отправлено: 05.10.20 20:44. Заголовок: SergKis не спорткар,..


SergKis
 цитата:
не спорткар, но и не трактор


абсолютно согласен, лично у меня ERP системы приучили пользователя,
что нажав кнопку получить отчёт, а через 25 мин он получает TimeOut
и при этом пользователя обвиняют что он был не прав взяв большой период,
то мы пока всё таки спорткар :) (пока данные и отчёты берут от нас)

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1629
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 05.10.20 22:29. Заголовок: SergKis пишет: Весь..


SergKis пишет:

 цитата:
Весь текст h_tbrowse.prg пропитан такими строками


От этих skip никуда не деться. Можно попробовать оптимизировать уменьшив число переходов. Но полностью от цикла не уйти.
Сегодня попробовал вариант goLeft goRight делать скролом окна бровса и прорисовывать только появляющуюся колонку. В исходнике кстати есть намек на такой вариант, но автор его бросил ( или не доделал). Из рисков такой логики это наткнуться на ситуацию когда скроллируемое окно не соответствует по записям новой колонке ( удалил или добавил кто то в совместном доступе ). Как обойти не придумал. Получается нужно в объекте держать массив номеров recno текущего отображения бровса..... А если так то и до массива всех записей в окне бровса недалеко. Тогда придется работать страницами. В текущем окне все будет летать , но появятся задержки при формировании новой страницы значениями для показа. Плюс не ясно как ловить изменения по сети. В общем пока только одни мысли, до решения далеко

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




Пост N: 3417
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.20 22:59. Заголовок: Haz пишет Получается..


Haz пишет
 цитата:
Получается нужно в объекте держать массив номеров recno текущего отображения бровса..... А если так то и до массива всех записей в окне бровса недалеко.


Мы с тобой об одном и том же, выше описал на базе ob:aRowPosAtRec именно такую схему, а все записи бровса (страница, можно, конечно и весь) храним по ключу в hash в виде практически готовых объектов oCl, oCell, при выводе только координаты поправляются, т.к. goleft и goright по разному список колонок, помещающихся показывают. От skipov сильно не избавишься, но данные блоков кода, выполненые раз хранятся в oCell

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




Пост N: 3418
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.10.20 23:19. Заголовок: Haz пишет Плюс не яс..


Haz пишет
 цитата:
Плюс не ясно как ловить изменения по сети.


Как обычно pgUp, pgDn и явный Refresh по кнопке или F5, как в IE и т.д.

 цитата:
Из рисков такой логики это наткнуться на ситуацию когда скроллируемое окно не соответствует по записям новой колонке ( удалил или добавил кто то в совместном доступе ).


Не очень понял, в совместном доступе у нас dbf или результат выборки (структура определена), как то не с руки в такой ситуевине менять структуру - это уже, как бы др. запрос, др. результат\ файл\массив

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1630
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 06.10.20 12:03. Заголовок: Из рисков такой логи..



 цитата:
Из рисков такой логики это наткнуться на ситуацию когда скроллируемое окно не соответствует по записям новой колонке ( удалил или добавил кто то в совместном доступе ).


Сергей я о другом механизме ::GoLeft() и ::GoRight() в КРАЙНИХ позициях
Сейчас реализовано через полную перерисовку и передачу фокуса на появившуюся колонку. В методах ::GoUp() и ::GoDown() по другому - там сразу скролл всего окна бровса и ::DrawLine() на "освободившейся" строке.

Если ::GoLeft() и ::GoRight() в КРАЙНИХ позициях перевести на эту логику , то скролл окна вправо или влево и ::DrawCol() - которого пока нет ))
Функция TSBrwHScroll() в С модуле есть, метод ::TSBrwHScroll прописать не сложно как METHOD TSBrwHScroll( nDir ) INLINE TSBrwHScroll( ::hWnd, nDir, 0, 0) - проверил работает
Сложнее сделать новые ::GoLeft2() и ::GoRight2() на основе скрола и тут может возникнуть ситуация когда новый ::DrawCol() нарисует колонку с другим набором записей чем на скроллируемой картинке.
Думаю этот вопрос и заставил автора библиотеки бросить эту тему и пойти по пути перерисовки всего бровса

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




Пост N: 3419
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.10.20 13:05. Заголовок: Haz пишет тут может ..


Haz пишет
 цитата:
тут может возникнуть ситуация когда новый ::DrawCol() нарисует колонку с другим набором записей чем на скроллируемой картинке.
Думаю этот вопрос и заставил автора библиотеки бросить эту тему и пойти по пути перерисовки всего бровса


Согласен с тобой и автором. Ускорить прорисовку (не ясно насколько) можно попробовать сохраняя oCell в hash для каждой нарисованной записи и ячейки DrawLine, DrawSelect при первом проходе, потом использовать данные hash для повторных рисований. oCol можно исп. из :aColumns, но если активно исп. Cargo колонки, то и oCol желательно сохранять для каждой ячейки вместе с oCell

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




Пост N: 3420
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.10.20 13:41. Заголовок: PS новый ::DrawCol()..


PS
 цитата:
новый ::DrawCol() нарисует колонку


новый :DrawCol() может опираться на массив записей, заполненный в DrawLine, DrawSelect, т.е. к примеру :aRowPosAtRec
тогда рассогласования по списку записей не будет

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




Пост N: 3421
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 11:44. Заголовок: gfilatov2002 Поправ..


gfilatov2002
Поправить немного надо, Игорь подсказал, где сбивалось содержимое ::aRowPosAtRec
 
METHOD GoDown() CLASS TSBrowse
...
If lTranspar
::Paint()
Else
::nRowPos := nLines
::TSBrwScroll( 1 )
::Skip( -1 )
::DrawLine( ::nRowPos - 1 ) // added 10.07.2015
::Skip( 1 )
IF ::lRowPosAtRec .and. Len( ::aRowPosAtRec ) > 0
hb_ADel( ::aRowPosAtRec, 1, .T. )
AAdd( ::aRowPosAtRec, ::nAt )
ENDIF

EndIf
...
METHOD GoUp() CLASS TSBrowse
...
If ! lTranspar
::lRePaint := .F.
::TSBrwScroll( -1 )
::Skip( 1 )
::DrawLine( 2 )
::Skip( -1 )
IF ::lRowPosAtRec .and. Len( ::aRowPosAtRec ) > 0
ASize( ::aRowPosAtRec, Len( ::aRowPosAtRec ) - 1 )
hb_AIns( ::aRowPosAtRec, 1, ::nAt, .T. )
ENDIF

Else
::Paint()
EndIf
...


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1631
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.10.20 12:15. Заголовок: SergKis пишет: Уск..


SergKis пишет:

 цитата:
Ускорить прорисовку (не ясно насколько) можно попробовать сохраняя oCell в hash для каждой нарисованной записи и ячейки DrawLine,


это хорошая мысль.
В принципе логика получается простая, 2 хеша содержат
1 хеш содержит { номер записи => хеш значений записи }
2 хеш значений содержит { имя колонки => значение для показа ( или oCell целиком )}
или как вариант хеши держать в каждой ::aColumns, тогда 1 хаш в каждой колонке { RecNo() => значение для показа ( или oCell целиком )}

Прирост в скорости будет в разы по сети , год назад тестировал хеширование справочников используемых в ::bData в результате по сети получил прирост раза в 4 ( визуально )


::Refresh() обнуляет хеш(и), а ::DrawLine() и ::DrawSelect() заполняют если ключа нет или берут из хеша если ключ есть

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




Пост N: 3422
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.20 12:52. Заголовок: Haz пишет 2 хеша сод..


Haz пишет
 цитата:
2 хеша содержат


А почему не один ?
{ Ключ := <:nAt>+<oCol:cName> => <копия oCell> }
Если смотреть на DrawLine и DrawSelect, то они отличаются раскраской и вопрос хранить ли DrawSelect или рисовать его всегда.
Если хранить то в этом же hash
{ Ключ := <:nAt>+<oCol:cName>+<oCel:lDrawLine> => <копия oCell> }

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1633
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.10.20 12:54. Заголовок: SergKis пишет: А по..


SergKis пишет:

 цитата:
А почему не один ?
{ Ключ := <:nAt>+<oCol:cName> => <копия oCell> }


Согласен
SergKis пишет:

 цитата:
хранить ли DrawSelect или рисовать его всегда.


на него можно забить и не хранить

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 203
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет