Форум » 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

Haz: SergKis пишет: IF ( nType := Ascan( aType, {|e| e[1] == cType }) ) > 0 cType := aType[nType ][2] ENDIF Сергей, тогда потеряется это [pre2] ElseIf cType $ "^+" cPicture := Replicate( '9', 10 ) EndIf [/pre2]

SergKis: 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: SergKis пишет: надо выкинуть из массива стандартные значения Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться


SergKis: Haz пишет Сергей я бы оставил. Так как в этом массиве? Будет ещё и тип valtype. Может пригодиться Мне кажется это лишнее оставлять. Если убрать, то не теряются += и т.д., но если самому поставить свое значение, то оно сработает перекодировкой вместо стандартного. Т.е. мы ничего не теляем В каком виде будет valtype ? Если в виде массива (второй элемент), то тогда наверно надо идти путем бока кода второй элемент и анализ возврата, если это массив, то возвращается Type и Valtype ..., хотя не знаю надо ли ?

SergKis: PS С Valtype можно попробовать следующее [pre2] 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 ] ... [/pre2]

Haz: SergKis пишет: В каком виде будет valtype пока тоже не уверен как можно использовать. Просто в одном массиве соответствие всех типов для dbstruct и valtype

gfilatov2002: SergKis пишет: // убрать совсем cType := aStru[ nE, 2 ] IF cType != Valtype( cData ) .and. nType > 0 cType := Valtype( cData ) ENDIF Ok, так и сделал

Haz: Григорий, Можно в сборке обновить rddads.lib до версии 12 Собрано под bcc82 https://drive.google.com/file/d/1TKuIGuCBsMjVe1b57IOipY8IJs9m1SYX/view?usp=sharing

gfilatov2002: Haz пишет: обновить rddads.lib до версии 12 Сделаю, конечно Благодарю за помощь

gfilatov2002: Выпустил 5-е обновление сборки 20.08 со всеми последними наработками

Haz: Предлагаю еще одну проблемку обсудить. Суть в том то TSBrowse прорисовывается 2 раза Первый раз тут [pre2] 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 [/pre2] Второй раз из hantleevent по событию UPDATEWINDOW чтобы это увидеть достаточно добавить в TSBrowse:DrawLine() [pre2] 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. ) [/pre2] и посмотреть лог Если на экране не один бровс и выборка данных для него не быстрая - начинает напрягать. Собственно вопрос насколько нужна прорисовка в _EndTBrowse (где первый раз) , если через евенты по любому нарисуем снова. Тупое комментирование выделенных строк в _EndTBrowse на результат не повлияло, но прорисовка выполнилась один раз

SergKis: 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: PS :DrawLine() еще присутствует во всех :Go...() методах, т.е. одного END TBROWSE "маловато будет"

Haz: SergKis пишет: т.е. одного END TBROWSE "маловато будет да, заметил такое. Не дошел вчера. Иногда в проекте у себя вижу по 4 раза рисует. ::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки

SergKis: Haz пишет ::lSpedDraw действительно можно завести, чтобы тестировать оптимизацию прорисовки Сейчас прорисовка осуществляется примерно так, от текущей записи (если курсор в середине окна тсб лучше видно) к началу и потом от текущей к концу списка рисуемых строк. На мой взгляд это надо бы поменять, рисуя от первой строки и до конца списка рисуемых строк (:nRowCount()). Тогда управлять проще, для этого и отладки вводил массив :aRowPosAtRec, Tooltip на нем это побочное явление, но пока остановился на этом (упростить не получается), слишком много прорисовки вызовов разбросано по тексту

Haz: SergKis пишет: Сейчас прорисовка осуществляется примерно так, от текущей записи (если курсор в середине окна тсб лучше видно) к началу и потом от текущей к концу списка рисуемых строк Это точно? не нашел в коде такого алгоритма Зато нашел лишнее [pre2] METHOD GoRight() CLASS TSBrowse 7884: Local nTxtWid, nWidth, nCell, nSkip, lRefresh := .F. добавить инициализацию .F. 7949: lRefresh := ( ::lCanAppend .or. ::lIsArr ) Лишняя строка , вызывает лишнюю прорисовку при работе метода METHOD TSBrowse:PostEdit() 11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал [/pre2]

SergKis: Haz пишет Это точно? не нашел в коде такого алгоритма Ты прав, нет такого, визуально показалось, т.к. сначала перепоказ идет текущей строки, потом переход на первую на экране и рисование до нижней, тек. уже нарисована и не меняется. 11552: SysRefresh() - тоже вроде как для подстраховки и вызывает прорисовку потестил без него - разницу не унюхал Это скорее перепоказ изменившихся др. строк в общем доступе Поправил в методе DrawLine[pre2] METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse ... If ::bOnDrawLine != Nil Eval( ::bOnDrawLine, Self, xRow ) EndIf ... [/pre2] Взял пример Tsb_MoreFields\demo.prg и добавил [pre2] #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. ) } ... [/pre2] смотрю лог и в целом выглядит логично по отображению

Haz: SergKis пишет: смотрю лог и в целом выглядит логично по отображению завтра погоняю твой пример

SergKis: Haz пишет погоняю твой пример Поправь еще в методе :DrawSelect() [pre2] 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 } удобней смотреть будет [/pre2]

SergKis: PS[pre2] :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 } [/pre2]



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