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

gfilatov2002: SergKis пишет: Предлагаю добавить в CLASS TControl ... DATA lMsg AS LOGICAL INIT .T. ... METHOD SetMsg( cText, lDefault ) CLASS TControl ... If ! ::lMsg .or. ::nStatusItem < 1 return Nil EndIf ... тогда можно отключать "порчу" 1го itemа StatusBar, проделываемого TsBrowse Благодарю за предложение Но что мешает уже сейчас присвоить :nStatusItem := 0 с тем же результатом

SergKis: gfilatov2002 пишет Но что мешает уже сейчас присвоить Как говорится, УПС. Вполне можно. В своей версии увидел DATA lMsg INIT .F. (всегда отключено, не исп. внутренний механизм тсб), вот и дернулся.

Haz: Григорий , проверьте точно ли исправления прошли в новой версии. После обновления опять словил глюк , глянул исходники - они не изменились [pre2] Haz пишет: Григорий, уберите пожалуйста проверку на номер записи. С индексами и фильтром при наличии проверки не работает метод ( конкретно под ADS , остальное не проверял ) METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse LOCAL cAlias LOCAL nSkip LOCAL n LOCAL nRecSave LOCAL lRet := .F. LOCAL lReCount := .F. IF ::lIsDbf lRet := .T. cAlias := ::cAlias ::nLastPos := ( cAlias )->( RecNo() ) вот эта строка портит позицию если удалить все нормально nRec := Min( ( cAlias )->( LastRec() ), nRec ) [/pre2] нужно удалить ( закоментить ) строки , у себя убрал. Глюк исчез [pre2] If Empty( ( cAlias )->( dbFilter() ) ) nRec := Min( ( cAlias )->( LastRec() ), nRec ) EndIf [/pre2]


gfilatov2002: Haz пишет: удалить ( закоментить ) строки , у себя убрал. Глюк исчез If Empty( ( cAlias )->( dbFilter() ) ) nRec := Min( ( cAlias )->( LastRec() ), nRec ) EndIf Убрал эти строки из метода GotoRec() Благодарю за проверку

gfilatov2002: Andrey пишет: можно эти функции добавить в базовые ? Нет, это локальные одно-строчные функции, которые можно легко заменить с помощью препроцессорных команд #xtranslate #xtranslate GetIni( cSection, cEntry, cDefault, cFile ) =>; GetPrivateProfileString(cSection, cEntry, cDefault, cFile ) *--------------------------------------------------------* #xtranslate WriteIni( cSection, cEntry, cValue, cFile ) =>; WritePrivateProfileString( cSection, cEntry, cValue, cFile ) *--------------------------------------------------------* #xtranslate IsINISection(cIniFile, cName) =>; ( aScan( _GetSectionNames(cIniFile), {|x| UPPER(x) == UPPER(cName)} ) > 0 ) *--------------------------------------------------------* #xtranslate IsVarINISection(cIniFile, cSecName, cName) =>; ( aScan( _GetSection(cSecName, cIniFile), {|x| UPPER(x[1]) == UPPER(cName)} ) > 0 )

Haz: Часто требуется узнать какой хороший человек отредактировал данные в таблице. У себя задаче решил через ::bPrevEdit и ::bPostEdit в колонках Но поскольку бровсов уже более 50 и это не предел , поднадоело в каждом это прописывать. Предлагаю включить в библиотеку базовый механизм 1 в данных бровса определить [pre2] DATA xOldEditValue DATA xNewEditValue DATA bEditLog [/pre2] 2 в METHOD Edit CLASS TSbrowse добавить [pre2] Default nCell := ::nCell, ; ::lPostEdit := .F., ; ::lNoPaint := .F. ::xOldEditValue := ::xNewEditValue := Eval(::aColumns[ nCell ]:bData ) [/pre2] 3 в конце METHOD PostEdit CLASS TSbrowse добавить [pre2] ::xNewEditValue := Eval(::aColumns[ ::nCell ]:bData) if hb_isBlock( ::bEditLog ) Eval( ::bEditLog, ::xOldEditValue, ::xNewEditValue, Self ) end Return Nil [/pre2] тогда в своей программе при определении бровса достаточно указать [pre2] oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c:cAlias ) } [/pre2] и прописать саму функцию в которой в базу или текстовик вести протокол кто когда что и тд Func WriteEditLog ( xOld, xNew, cAlias ) ... ... return nil Как идейка

SergKis: Haz пишет Как идейка На первый взгляд, ОК! только ::xOldEditValue := ::xNewEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell ) и ::xNewEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell )

SergKis: PS[pre2] if hb_isBlock( ::bEditLog ) .and. ::xOldEditValue != ::xNewEditValue Eval( ::bEditLog, ::xOldEditValue, ::xNewEditValue, Self ) end [/pre2]

SergKis: PPS Возможно, эти переменные надо не CLASS TsBrowse, а в CLASS TsColumn Тогда все колонки тек. линии будут иметь старые, новые значения

Haz: SergKis пишет: На первый взгляд, ОК! Спасибо за правки

Haz: SergKis пишет: PPS Возможно, эти переменные надо не CLASS TsBrowse, а в CLASS TsColumn Тогда все колонки тек. линии будут иметь старые, новые значения Нет смысла , редактируется всегда только одна из колонок в один момент времени

Haz: Haz пишет: Нет смысла , редактируется всегда только одна из колонок в один момент времени хотя , если в TsColumn , то это позволит undo по строке сделать

SergKis: И в TsColumn должно быть достаточным только старое значение, а новое в bPostEdit должно быть определено. Именно для Undo и есть смысл в колонке иметь старое значение

Haz: В общем пока получилось так [pre2] CLASS TSColumn ... DATA xOldEditValue CLASS TSBrowse ... DATA bEditLog METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ; nClrBack ) CLASS TSBrowse Local nRow, nHeight, cType, uValue, nI, aGet, oCol, cMsg, aRct, bChange, lSpinner, bUp, bDown, ; bMin, bMax, nStartX, nWidth, lCombo, lMulti, nCol, lLogicDrop, lPicker, nTxtHeight, hFont, ix Local cWnd := ::cControlName Local nK, aKey, oGet Default nCell := ::nCell, ; ::lPostEdit := .F., ; ::lNoPaint := .F. ::aColumns[ nCell ]:xOldEditValue := ::bDataEval( ::aColumns[ nCell ], , nCell ) METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse Local aMoveCell, bRecLock, bAddRec, cAlias, uRet, ; nLastKey := ::oWnd:nLastKey, ; lAppend := ::lAppendMode, xNewEditValue ... // в самом конце xNewEditValue := ::bDataEval( ::aColumns[ ::nCell ], , ::nCell ) if hb_isBlock( ::bEditLog ) .and. ::aColumns[ ::nCell ]:xOldEditValue != xNewEditValue Eval( ::bEditLog, ::aColumns[ ::nCell ]:xOldEditValue, xNewEditValue, Self ) end Return Nil [/pre2] После объявления в своей программе oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c ) } все передается корректно

SergKis: gfilatov2002 Управление линиями в колонке[pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... oColumn := If( nJ > Len( ::aColumns ), ::oPhant, ::aColumns[ nJ ] ) nLineStyle := ::nLineStyle If HB_ISNUMERIC(oColumn:nLineStyle) nLineStyle := oColumn:nLineStyle EndIf cPicture := ::cPictureGet( oColumn, nJ ) ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... oColumn := If( nJ > Len( ::aColumns ), ::oPhant, ::aColumns[ nJ ] ) nLineStyle := ::nLineStyle If HB_ISNUMERIC(oColumn:nLineStyle) nLineStyle := oColumn:nLineStyle EndIf hFont := ::hFontGet( oColumn, nJ ) ... CLASS TSColumn ... DATA nLineStyle ... Пример // LINES_NONE LINES_ALL LINES_VERT LINES_HORZ LINES_3D LINES_DOTTED oCol:nLineStyle := LINES_HORZ или oCol:nLineStyle := LINES_NONE [/pre2]

SergKis: gfilatov2002 Для Header, Footer тоже самое можно сделать[pre2] CLASS TSColumn ... DATA nLineStyle DATA nHLineStyle DATA nSLineStyle // SpecHd DATA nFLineStyle ... METHOD DrawHeaders( lFooters ) CLASS TSBrowse ... nClrLine := ::nClrLine Local nLineStyle := 1 Default lFooters := .F. ... Else l3DText := nClr3dL := nClr3dS := Nil EndIf nLineStyle := 1 If HB_ISNUMERIC(oColumn:nHLineStyle) nLineStyle := oColumn:nHLineStyle EndIf TSDrawCell( hWnd, ; // 1 hDC, ; // 2 0, ; // 3 nStartCol, ; // 4 aColSizes[ nJ ], ; // 5 cHeading, ; // 6 nAlign, ; // 7 nClrFore, ; // 8 nClrBack, ; // 9 hFont, ; // 10 hBitMap, ; // 11 nHeightHead, ; // 12 l3DLook, ; // 13 nLineStyle, ; // 14 nLineStyle nClrLine, ; // 15 1, ; // 16 1=Header 2=Footer 3=Super 4=Special ... IF ::lDrawSpecHd ... Else l3DText := nClr3dL := nClr3dS := Nil EndIf nLineStyle := 1 If HB_ISNUMERIC(oColumn:nSLineStyle) nLineStyle := oColumn:nSLineStyle EndIf TSDrawCell( hWnd, ; // 1 hDC, ; // 2 0, ; // 3 nStartCol, ; // 4 aColSizes[nJ], ; // 5 cHeading, ; // 6 nAlign, ; // 7 nClrFore, ; // 8 nClrBackS, ; // 9 hFont, ; // 10 hBitMap, ; // 11 0, ; // 12 nHeightFoot l3DLook, ; // 13 nLineStyle, ; // 14 nLineStyle nClrLine, ; // 15 4, ; // 16 1=Header 2=Footer 3=Super 4=Special ... If ::lFooting .and. ::lDrawFooters ... Else l3DText := nClr3dL := nClr3dS := Nil EndIf nLineStyle := 1 If HB_ISNUMERIC(oColumn:nFLineStyle) nLineStyle := oColumn:nFLineStyle EndIf TSDrawCell( hWnd, ; // 1 hDC, ; // 2 ::nRowCount(), ; // 3 nStartCol, ; // 4 aColSizes[nJ], ; // 5 cFooting, ; // 6 nAlign, ; // 7 nClrFore, ; // 8 nClrBack, ; // 9 hFont, ; // 10 hBitMap, ; // 11 nHeightFoot, ; // 12 l3DLook, ; // 13 nLineStyle, ; // 14 nLineStyle nClrLine, ; // 15 2, ; // 16 1=Header 2=Footer 3=Super ... [/pre2]

SergKis: gfilatov2002 Предлагаю добавить для блокировки перехода на др. строку вверх\вниз при :PostEdit (oCol:EditMove работает)[pre2] CLASS TSBrowse FROM TControl ... DATA lPostEdit // to detect postediting DATA lPostEditGo AS LOGICAL INIT .T. // to detect postediting VK_UP,VK_RIGHT,VK_LEFT,VK_DOWN ... METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... ( cAlias )->( DbSkip( 0 ) ) // refresh relations just in case that a relation field changes ::SetFocus() If nLastKey == VK_UP .and. ::lPostEditGo ::GoUp() ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo ::GoRight() ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo ::GoLeft() ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo ::GoDown() ::Refresh( .F. ) ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behavior post-edit movement Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] ) ::DrawSelect() If ! ::lAppendMode ::Refresh( .F. ) EndIf ElseIf ::aColumns[ nCol ]:nEditMove == 0 .and. ! ::lAutoEdit ::DrawSelect() EndIf ::oWnd:nLastKey := Nil ... Else If lAppend .and. ::lIsArr ... ::SetFocus() If nLastKey == VK_UP .and. ::lPostEditGo ::GoUp() ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo ::GoRight() ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo ::GoLeft() ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo ::GoDown() ::Refresh( .F. ) ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behaviour post-edit movement Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] ) ElseIf ::aColumns[ nCol ]:nEditMove == 0 ::DrawSelect() EndIf ::oWnd:nLastKey := Nil ... [/pre2]

gfilatov2002: SergKis Добавил эти изменения, хотя и считаю их необязательными Благодарю за помощь

gfilatov2002: Просто к сведению Завершена подготовка следующей сборки 19.04, которая выйдет на этой неделе Список изменений для новой сборки можно увидеть на сайте библиотеки (файл ChangelogHMG.docx).

SergKis: gfilatov2002 пишет Добавил эти изменения, хотя и считаю их необязательными Согласен, что это мелочь. Но линиями давно хотел заняться, т.к. надо часто показывать колонки, как одну графу, суперхидер над ней занят. Приходилось показывать через выражение, а модифицировать на окне как отдельные поля\getbox. Второе изменение, по мне, более четко отрабатывает установленный на колонки :nEditMove алгоритм, не перескакивая на др. запись, отличную от строки с :Edit



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