Форум » 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: gfilatov2002 Сделал правки [pre2] CLASS TSBrowse FROM TControl ... ACCESS Tsb INLINE ::oWnd ACCESS nAtPos INLINE iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt ) ... METHOD FastDrawClear( cCell ) CLASS TSBrowse LOCAL oCell, oCol Default cCell := ::nAtPos IF ISNUMERIC( cCell ) ; cCell := hb_ntos( cCell ) ENDIF IF ISLOGICAL( cCell ) .and. cCell ::aFastDrawCell := hb_Hash() ELSEIF ISCHAR( cCell ) IF "." $ cCell oCell := hb_HGetDef( ::aFastDrawCell, cCell, NIL ) IF oCell != Nil hb_HDel( ::aFastDrawCell, cCell ) ENDIF ELSE FOR EACH oCol IN ::aColumns oCell := hb_HGetDef( ::aFastDrawCell, cCell+"."+hb_ntos( oCol:nId ), NIL ) IF oCell != Nil hb_HDel( ::aFastDrawCell, cCell+"."+hb_ntos( oCol:nId ) ) ENDIF NEXT ENDIF ENDIF Return Self ... METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, nClrBack ) CLASS TSBrowse ... If oCol:bPrevEdit != Nil If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays ElseIf nKey != VK_RETURN // GF 15-10-2015 uVar := Eval( oCol:bPrevEdit, uValue, Self, nCell, oCol ) If ValType( uVar ) == "L" .and. ! uVar nKey := VK_RETURN EndIf EndIf EndIf ::FastDrawClear( hb_ntos( ::nAtPos )+"."+hb_ntos( oCol:nId ) ) cMsg := iif( ValType( cMsg ) == "B", Eval( cMsg, Self, nCell ), cMsg ) ... METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse ... IF ::lRowPosAtRec IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount() ::aRowPosAtRec := Array( ::nRowCount() ) AFill( ::aRowPosAtRec, 0 ) ENDIF IF ::nLen == 0 .or. xRow == 0 .or. xRow > Len( ::aRowPosAtRec ) ELSE ::aRowPosAtRec[ xRow ] := ::nAtPos //ELSEIF ::lIsDbf // ::aRowPosAtRec[ xRow ] := ( nAt := ( ::cAlias )->( RecNo() ) ) //ELSEIF ::lIsArr // ::aRowPosAtRec[ xRow ] := ( nAt := ::nAt ) ENDIF ENDIF If ::nLen > 0 IF nAt == Nil ; nAt := ::nAtPos // iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt ) ENDIF ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... IF ::lRowPosAtRec IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount() ::aRowPosAtRec := Array( ::nRowCount() ) AFill( ::aRowPosAtRec, 0 ) ENDIF IF xRow == 0 .or. xRow > Len( ::aRowPosAtRec ) ELSE ::aRowPosAtRec[ xRow ] := ::nAtPos //ELSEIF ::lIsDbf // ::aRowPosAtRec[ xRow ] := ( nAt := ( ::cAlias )->( RecNo() ) ) //ELSEIF ::lIsArr // ::aRowPosAtRec[ xRow ] := ( nAt := ::nAt ) ENDIF ENDIF ... IF nAt == Nil ; nAt := ::nAtPos // iif( ::lIsDbf, ( ::cAlias )->( RecNo() ), ::nAt ) ENDIF ... If lDrawCell .and. ::lDrawLine lDraw := ::TSDrawCell( oColumn:oCell, oColumn ) Else lDraw := .T. EndIf IF ::lFastDrawCell .and. ! lCell hb_HSet( ::aFastDrawCell, cCell, __objClone( oColumn:oCell ) ) ENDIF nStartCol += aColSizes[ nJ ] + nDeltaLen ... [/pre2]

SergKis: Haz пишет Думаю нужны три метода для этого хеша. Это check, refresh и clear Не очень понятны по смыслу check, refresh. Для одной колонки и даже для всей строки - проще удалить чем выяснять или я не учитываю что то.

SergKis: gfilatov2002 Чуток поправить [pre2] METHOD FastDrawClear( cCell ) CLASS TSBrowse LOCAL oCell, oCol Default cCell := ::nAtPos IF ISNUMERIC( cCell ) ; cCell := hb_ntos( cCell ) ENDIF IF ! ::lFastDrawCell ELSEIF ISLOGICAL( cCell ) .and. cCell ::aFastDrawCell := hb_Hash() ... [/pre2]


kkg: SergKis [pre2] ENDIF ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... IF ::lRowPosAtRec .and. ::nRowCount() > 0 IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount() ::aRowPosAtRec := Array( ::nRowCount() ) AFill( ::aRowPosAtRec, 0 ) ENDIF IF xRow == 0 .or. xRow > Len( ::aRowPosAtRec ) ELSE ::aRowPosAtRec[ xRow ] := ::nAtPos //ELSEIF ::lIsDbf // ::aRowPosAtRec[ xRow ] := ( nAt := ( ::cAlias )->( RecNo() ) ) //ELSEIF ::lIsArr // ::aRowPosAtRec[ xRow ] := ( nAt := ::nAt ) ENDIF ENDIF ... [/pre2] Серж, я ещё такую правку делаю, иначе на пустых выборках слетает

gfilatov2002: SergKis пишет: Сделал правки OK, принято SergKis пишет: Чуток поправить Благодарю за помощь

Haz: SergKis пишет: Не очень понятны по смыслу check, refresh. Для одной колонки и даже для всей строки - проще удалить чем выяснять или я не учитываю что то. Tsbrowse статичен , то есть это просто отрисованная картинка, а хеш содержит все нобходимые данные для проверки какие ячейки изменились. С появлением хеша появилась возможность в realtime показывать изменения ячеек другими пользователями по сети без перерисовки всего бровса. Смысл не только в визуальном вау ээфекте, очень часто возникает диалог - Поменяй !!! - поменял - не вижу - обнови - как ? итд

SergKis: kkg пишет такую правку делаю, иначе на пустых выборках слетает Надо как в :DrawLine()[pre2] METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... IF ::lRowPosAtRec IF Empty( ::aRowPosAtRec ) .or. Len( ::aRowPosAtRec ) != ::nRowCount() ::aRowPosAtRec := Array( ::nRowCount() ) AFill( ::aRowPosAtRec, 0 ) ENDIF IF ::nLen == 0 .or. xRow == 0 .or. xRow > Len( ::aRowPosAtRec ) ELSE ::aRowPosAtRec[ xRow ] := ::nAtPos ENDIF ENDIF ... [/pre2]

Haz: Тут добавил третий параметр в ::Refresh() [pre2] METHOD ChangeFont( hFont, nColumn, nLevel ) CLASS TSBrowse ... If ::lPainted SetHeights( Self ) ::Refresh( .F.,,.F. ) EndIf METHOD DelColumn( nPos ) CLASS TSBrowse ... ::SetFocus() ::Refresh( .F.,,.F. ) METHOD PageDown( nLines ) CLASS TSBrowse ... If nKeyPressed == Nil ::Refresh( ::nLen < nTotLines,, .F. ) METHOD PageUp( nLines ) CLASS TSBrowse ... If ::lPageMode .and. ::nRowPos > 1 ::DrawLine() // nSkipped := ::Skip( -( ::nRowPos - 1 ) ) //V90 active ::nRowPos := 1 ::Refresh( .F.,,.F. ) METHOD PanEnd() CLASS TSBrowse ... ::Refresh( .F. ,, .F.) If ! ::lNoHScroll .and. ::oHScroll != Nil METHOD PanLeft() CLASS TSBrowse ... If ::nCell != ::nOldCell ::Refresh( .F. ,, .F.) EndIf METHOD PanRight() CLASS TSBrowse ... If ::nCell != ::nOldCell ::Refresh( .F.,, .F. ) EndIf METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... If lAppend .and. ::nLen <= ::nRowCount() ::Refresh( .T. ,, .F.) ::nRowPos := Min( ::nRowCount(), ::nLen ) EndIf METHOD SetNoHoles( nDelta, lSet ) CLASS TSBrowse ... ::Paint() ::lEnabled := .T. ::Refresh( .F.,,.F. ) [/pre2]

SergKis: Haz пишет Tsbrowse статичен , то есть это просто отрисованная картинка, а хеш содержит все нобходимые данные для проверки какие ячейки изменились. Т.е. пляшем от hash, а не колонок, что то типа такого[pre2] Local oCols := oKeyData():aKey := oBrw:aFastDrawCell Local aCols := oCols:GetAll(.F.), aCol, nCol, oCol, cCell Local xData, uData FOR EACH aCol IN aCols cCell := aCol[1] oCol := aCol[2] xData := oCol:oCell:uValue uData := oBrw:GetValue(oCol:cName) IF xData != uData .... ENDIF NEXT [/pre2]

SergKis: PS Пропустил переход по записям[pre2] nRec := val(left(cCell, At(".", cCell)-1)) (oBrw:cAlias)->( dbGoto(nRec) ) // тут xData, uData [/pre2]

Haz: SergKis пишет: Т.е. пляшем от hash, а не колонок, что то типа такого да , примерно так пока не сложилось как понять что oCell принадлежит видимой части ( окну ) бровса

gfilatov2002: gfilatov2002 пишет: OK, принято Заметил некорректную работу при активном индексе в базе (зависает при сортировке - двойной клик по заголовку колонки). Пример для проверки - в папке \SAMPLES\Advanced\Tsb_SpecHeader

Haz: gfilatov2002 пишет: Заметил некорректную работу при активном индексе в базе (зависает при сортировке - двойной клик по заголовку колонки). у меня отработало нормально. Может какие правки из последних не учел. Есть где взять со всеми последними изменениями ? На рабочем проекте тоже переключает индексы нормально

gfilatov2002: Haz пишет: На рабочем проекте тоже переключает индексы нормально Отлично, значит, мне показалось Haz пишет: где взять со всеми последними изменениями ? Выложил здесь click here

SergKis: Haz пишет На рабочем проекте тоже переключает индексы нормально Соглашусь с Григорием Заметил некорректную работу при активном индексе в базе (зависает при сортировке - двойной клик по заголовку колонки). Установил последнюю версию в раб. каталоге (без последних изменений с FastDraw), пример \SAMPLES\Advanced\Tsb_SpecHeader работает странно (меню первое пункт SPECHEADER) не виснет, но сортировка туду-сюда нормально не работает. В тексте есть[pre2] Brw_1:aColumns[ 1 ]:cOrder := "FIRST" Brw_1:aColumns[ 4 ]:cOrder := "CITY" Brw_1:SetAppendMode( .T. ) //Brw_1:SetIndexCols( 1, 2 ) Brw_1:SetIndexCols( 1, 4 ) // поправил на 4-ю колонку индекс //Brw_1:SetOrder( 1 ) [pre2] работает при 2 клике по колонкам, но странно. Пример Tsb_addrecord_2 с такими же возможностями 2 клика -> сортировка работает нормально и в версии с FastDraw Правка текста в нем для сортировки туда-обратно, так же работает OK, т.е.[pre2] ... oCol := oBrw:GetColumn("ID") oCol:cOrder := "KOD" //oCol:lNoDescend := .T. oCol := oBrw:GetColumn("INFO") oCol:cOrder := "NAM" //oCol:lNoDescend := .T. ... oBrw:SetIndexCols( oBrw:nColumn("ID"), ; oBrw:nColumn("INFO") ) oBrw:SetOrder( oBrw:nColumn("ID") ) ... [/pre2]

SergKis: Haz пишет На рабочем проекте тоже переключает индексы нормально Соглашусь с Григорием Заметил некорректную работу при активном индексе в базе (зависает при сортировке - двойной клик по заголовку колонки). Установил последнюю версию в раб. каталоге (без последних изменений с FastDraw), пример \SAMPLES\Advanced\Tsb_SpecHeader работает странно (меню первое пункт SPECHEADER) не виснет, но сортировка туду-сюда нормально не работает. В тексте есть[pre2] Brw_1:aColumns[ 1 ]:cOrder := "FIRST" Brw_1:aColumns[ 4 ]:cOrder := "CITY" Brw_1:SetAppendMode( .T. ) //Brw_1:SetIndexCols( 1, 2 ) Brw_1:SetIndexCols( 1, 4 ) // поправил на 4-ю колонку индекс //Brw_1:SetOrder( 1 ) [pre2] работает при 2 клике по колонкам, но странно. Пример Tsb_addrecord_2 с такими же возможностями 2 клика -> сортировка работает нормально и в версии с FastDraw Правка текста в нем для сортировки туда-обратно, так же работает OK, т.е.[pre2] ... oCol := oBrw:GetColumn("ID") oCol:cOrder := "KOD" //oCol:lNoDescend := .T. oCol := oBrw:GetColumn("INFO") oCol:cOrder := "NAM" //oCol:lNoDescend := .T. ... oBrw:SetIndexCols( oBrw:nColumn("ID"), ; oBrw:nColumn("INFO") ) oBrw:SetOrder( oBrw:nColumn("ID") ) ... [/pre2]

SergKis: PS :lFastDrawCell не ставил в .T., т.е. отключена была для тестирования этих примеров

SergKis: PS2 проверил с :lFastDrawCell := .T. туда-сюда сортировка на колонках работает нормально, версия с изменениями FastDraw

SergKis: это про пример Tsb_addrecord_2, не туда ткнул

gfilatov2002: SergKis пишет: пример \SAMPLES\Advanced\Tsb_SpecHeader работает странно Разобрался и поправил этот пример для правильной работы с индексом NTX. 1) создание индексов д.б. USE Employee SHARED NEW Index On Employee->First+Employee->Last To Name // NTX Index On Employee->City To City // NTX Set Index To Name, City // NTX 2) подключение индексов в зависимости от типа источника данных д.б. [pre2] IF met > 1 Brw_1:aColumns[ 1 ]:cOrder := "FIRST" Brw_1:aColumns[ 4 ]:cOrder := "CITY" ELSE Brw_1:aColumns[ 1 ]:cOrder := "Name" Brw_1:aColumns[ 4 ]:cOrder := "City" ENDIF [/pre2] Теперь пример работает нормально



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