Автор | Сообщение |
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
[только новые]
|
|
Haz
|
| |
Пост N: 1613
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.20 16:05. Заголовок: SergKis пишет: IF..
SergKis пишет: цитата: | IF ( nType := Ascan( aType, {|e| e[1] == cType }) ) > 0 cType := aType[nType ][2] ENDIF |
| Сергей, тогда потеряется это ElseIf cType $ "^+" cPicture := Replicate( '9', 10 ) EndIf
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3396
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.09.20 18:37. Заголовок: Haz пишет тогда поте..
Haz пишет По правильному, надо выкинуть из массива стандартные значения, т.е. {"C", "C"}, ; // Character {"D", "D"}, ; // Date {"T", "T"}, ; // Time {"@", "T"}, ; // TimeStamp {"=", "T"}, ; // ModTime {"+", "N"}, ; // Autoinc {"^", "N"}, ; // RowVersion {"M", "M"}, ; // Memo {"L", "L"} ; // т.к. они будут браться из aStru[ nE, 2 ], не дали дописать, отвлекли
|
|
|
Haz
|
| |
Пост N: 1614
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.20 19:08. Заголовок: SergKis пишет: надо..
SergKis пишет: цитата: | надо выкинуть из массива стандартные значения |
|
Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3397
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.09.20 19:20. Заголовок: Haz пишет Сергей я б..
Haz пишет цитата: | Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться |
| Мне кажется это лишнее оставлять. Если убрать, то не теряются += и т.д., но если самому поставить свое значение, то оно сработает перекодировкой вместо стандартного. Т.е. мы ничего не теляем В каком виде будет valtype ? Если в виде массива (второй элемент), то тогда наверно надо идти путем бока кода второй элемент и анализ возврата, если это массив, то возвращается Type и Valtype ..., хотя не знаю надо ли ?
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3398
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.09.20 20:14. Заголовок: PS С Valtype можно п..
PS С Valtype можно попробовать следующее If nSize == Nil cData := ( cAlias )->( FieldGet( nE ) ) // убрать совсем cType := aStru[ nE, 2 ] IF cType != Valtype( cData ) .and. nType > 0 cType := Valtype( cData ) ENDIF nSize := aStru[ nE, 3 ] nDec := aStru[ nE, 4 ] ...
|
|
|
Haz
|
| |
Пост N: 1615
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.09.20 20:31. Заголовок: SergKis пишет: В ка..
SergKis пишет: цитата: | В каком виде будет valtype |
|
пока тоже не уверен как можно использовать. Просто в одном массиве соответствие всех типов для dbstruct и valtype
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1793
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.09.20 20:31. Заголовок: SergKis пишет: ..
SergKis пишет: цитата: | // убрать совсем cType := aStru[ nE, 2 ] IF cType != Valtype( cData ) .and. nType > 0 cType := Valtype( cData ) ENDIF |
| Ok, так и сделал
|
|
|
Haz
|
| |
Пост N: 1616
Зарегистрирован: 20.02.11
|
|
Отправлено: 29.09.20 17:59. Заголовок: Григорий, Можно в с..
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1794
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.09.20 20:31. Заголовок: Haz пишет: обновить..
Haz пишет: цитата: | обновить rddads.lib до версии 12 |
| Сделаю, конечно Благодарю за помощь
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 1795
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.09.20 10:03. Заголовок: Всем кому это интересно
Выпустил 5-е обновление сборки 20.08 со всеми последними наработками
|
|
|
Haz
|
| |
Пост N: 1617
Зарегистрирован: 20.02.11
|
|
Отправлено: 30.09.20 17:51. Заголовок: Предлагаю еще одну п..
Предлагаю еще одну проблемку обсудить. Суть в том то TSBrowse прорисовывается 2 раза Первый раз тут FUNCTION _EndTBrowse( bEnd ) *-----------------------------------------------------------------------------* LOCAL i, oBrw LOCAL oc := NIL, ow := NIL #ifdef _OBJECT_ ow := oDlu2Pixel() #endif IF _HMG_BeginTBrowseActive i := AScan( _HMG_aControlHandles, _HMG_ActiveTBrowseHandle ) IF i > 0 oBrw := _HMG_aControlIds[ i ] oBrw:lRePaint := .T. oBrw:Display() _HMG_ActiveTBrowseName := "" _HMG_ActiveTBrowseHandle := 0 _HMG_BeginTBrowseActive := .F. #ifdef _OBJECT_ IF _HMG_lOOPEnabled ow := _WindowObj( _HMG_aControlParenthandles[ i ] ) oc := _ControlObj( _HMG_aControlHandles [ i ] ) ENDIF #endif Do_ControlEventProcedure( bEnd, i, oBrw, ow, oc ) ENDIF ENDIF RETURN NIL Второй раз из hantleevent по событию UPDATEWINDOW чтобы это увидеть достаточно добавить в TSBrowse:DrawLine() Default xRow := iif( ::lDrawHeaders, Max( 1, nRowPos ), nRowPos ), lDrawCell := ::lDrawLine StrFile( hb_ntoc(++ nCount) + Chr(9) + hb_ntoc(xRow) + chr(9) + Procname(0) + hb_ntoc(ProcLine(0)) + chr(9) + Procname(1) + hb_ntoc(ProcLine(1)) + chr(9) + Procname(2) + hb_ntoc(ProcLine(2)) + chr(9) + Procname(3) + hb_ntoc(ProcLine(3)) + chr(9) + Procname(4) + hb_ntoc(ProcLine(4)) + chr(9) + Procname(5) + hb_ntoc(ProcLine(5)) + chr(9) + hb_eol(), "_DrawLine", .t. ) и посмотреть лог Если на экране не один бровс и выборка данных для него не быстрая - начинает напрягать. Собственно вопрос насколько нужна прорисовка в _EndTBrowse (где первый раз) , если через евенты по любому нарисуем снова. Тупое комментирование выделенных строк в _EndTBrowse на результат не повлияло, но прорисовка выполнилась один раз
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3399
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.09.20 18:31. Заголовок: Haz пишет Тупое комм..
Haz пишет цитата: | Тупое комментирование выделенных строк в _EndTBrowse на результат не повлияло, но прорисовка выполнилась один раз |
| Не все так просто с этим. Тоже смотре на это место, бывает даже с двойной прорисовкой получается ерунда в отображении, т.е. сетка строк сбита (внизу дыра чуть ли не 2-3 строки, курсорная строка прорисована в 2х местах), добавляю в END TBROWSE ON END {|obr| ..., obr:Refresh() } и только тогда получается правильная прорисовка всей сетки тсб. Если использовать :aRowPosAtRec[ xRow ], то приходится проверять соответствие тек. строки массива ( RecNo() ) и тек. RecNo() базы, сталкивался не только с несовпадением, но и со значением Nil, т.е. ощущение что :DrawLine() перепрыгнула запись в файле. Но пробовать можно ускорять, добавив переменную типа DATA lSpeedDraw AS LOGICAL INIT .T. и проверять в END TBROWSE
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3400
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.09.20 18:37. Заголовок: PS :DrawLine() еще п..
PS :DrawLine() еще присутствует во всех :Go...() методах, т.е. одного END TBROWSE "маловато будет"
|
|
|
Haz
|
| |
Пост N: 1618
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.10.20 09:04. Заголовок: SergKis пишет: т.е...
SergKis пишет: цитата: | т.е. одного END TBROWSE "маловато будет |
|
да, заметил такое. Не дошел вчера. Иногда в проекте у себя вижу по 4 раза рисует. ::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3401
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.10.20 09:56. Заголовок: Haz пишет ::lSpedDra..
Haz пишет цитата: | ::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки |
| Сейчас прорисовка осуществляется примерно так, от текущей записи (если курсор в середине окна тсб лучше видно) к началу и потом от текущей к концу списка рисуемых строк. На мой взгляд это надо бы поменять, рисуя от первой строки и до конца списка рисуемых строк (:nRowCount()). Тогда управлять проще, для этого и отладки вводил массив :aRowPosAtRec, Tooltip на нем это побочное явление, но пока остановился на этом (упростить не получается), слишком много прорисовки вызовов разбросано по тексту
|
|
|
Haz
|
| |
Пост N: 1619
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.10.20 13:14. Заголовок: SergKis пишет: Сейч..
SergKis пишет: цитата: | Сейчас прорисовка осуществляется примерно так, от текущей записи (если курсор в середине окна тсб лучше видно) к началу и потом от текущей к концу списка рисуемых строк |
| Это точно? не нашел в коде такого алгоритма Зато нашел лишнее METHOD GoRight() CLASS TSBrowse 7884: Local nTxtWid, nWidth, nCell, nSkip, lRefresh := .F. добавить инициализацию .F. 7949: lRefresh := ( ::lCanAppend .or. ::lIsArr ) Лишняя строка , вызывает лишнюю прорисовку при работе метода METHOD TSBrowse:PostEdit() 11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3402
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.10.20 15:18. Заголовок: Haz пишет Это точно?..
Haz пишет цитата: | Это точно? не нашел в коде такого алгоритма |
| Ты прав, нет такого, визуально показалось, т.к. сначала перепоказ идет текущей строки, потом переход на первую на экране и рисование до нижней, тек. уже нарисована и не меняется. цитата: | 11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал |
| Это скорее перепоказ изменившихся др. строк в общем доступе Поправил в методе DrawLine METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse ... If ::bOnDrawLine != Nil Eval( ::bOnDrawLine, Self, xRow ) EndIf ... Взял пример Tsb_MoreFields\demo.prg и добавил #define _HMG_OUTLOG #include "hmg.ch" #include "TSBrowse.ch" REQUEST DBFCDX FUNCTION Main() ... ON INIT {| ob | TsbCreate( ob, .T. ) } :Cargo := oKeyData() :lRowPosAtRec := .T. :bTSDrawCell := {|ob,oc| If oc:nDrawType == 0 ? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5) ?? " Col =",oc:nCell EndIf Return Nil } :bOnDrawLine := {|ob,xrow| Local nRow := ob:nRowPos Local nPos := ob:nCell Local nLen := Len(ob:aRowPosAtRec) // ? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5) ? "xRow =",xrow,"nRowCount =",nLen,"nCell =",nPos,"nTek =",nRow,"RecNo =" If nRow > 0 .and. nRow <= nLen ?? ob:aRowPosAtRec[ nRow ] Else ?? "Error", nRow EndIf Return Nil } END TBROWSE ON END {| ob | TsbCreate( ob, .F. ) } ... смотрю лог и в целом выглядит логично по отображению
|
|
|
Haz
|
| |
Пост N: 1620
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.10.20 21:49. Заголовок: SergKis пишет: смот..
SergKis пишет: цитата: | смотрю лог и в целом выглядит логично по отображению |
|
завтра погоняю твой пример
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3403
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 12:14. Заголовок: Haz пишет погоняю тв..
Haz пишет Поправь еще в методе :DrawSelect() METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... ENDIF If ::bOnDrawLine != Nil Eval( ::bOnDrawLine, Self, xRow ) EndIf If ! ::lDrawLine nBegin := 1 nLastCol := ::nColCount() EndIf ... В примере добавь STATIC FUNC myProc( n ) RETURN StrTran(Procname(n), "TSBROWSE:", ":") и :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 EndIf Return Nil } удобней смотреть будет
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 3404
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.20 12:16. Заголовок: PS :bOnDraw..
PS :bOnDrawLine := {|ob,xrow| Local nRow := ob:nRowPos Local nPos := ob:nCell Local nLen := Len(ob:aRowPosAtRec) // ? procname(1),procline(1),procname(2),procline(2),procname(3),procline(3),procname(4),procline(4),procname(5),procline(5) ? "xRow =",xrow,"nRowCount =",nLen,"nCell =",nPos,"nTek =",nRow,"RecNo =" If nRow > 0 .and. nRow <= nLen ?? ob:aRowPosAtRec[ nRow ] Else ?? "Error nRow", nRow EndIf If xrow > 0 .and. xrow <= nLen ?? ob:aRowPosAtRec[ xrow ] Else ?? "Error xrow", xrow EndIf Return Nil }
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|