Форум » 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] LOCAL aClr := {} AAdd( aClr, { CLR_FOCUSB, { |a,b,c| iif( c:nCell == b, ; // CLR_FOCUSB { HMG_RGB2n( 66, 255, 236), HMG_RGB2n(209, 227, 248) }, ; { HMG_RGB2n(220, 220, 220), HMG_RGB2n(220, 220, 220) } ) } } ) AAdd( aClr, { CLR_HEADF , {|| HMG_RGB2n( YELLOW ) } } ) // 3 , текста шапки таблицы AAdd( aClr, { CLR_HEADB , {|| { HMG_RGB2n(40, 122, 237), ; HMG_RGB2n(48, 29, 26) } } } ) // 4 , фона шапка таблицы oBrw := Brw2Arr(cBrw, nY, nX, nW, nH, aDatos, aClr, aFont) [/pre2]

gfilatov2002: SergKis пишет: HMG_RGB2n( YELLOW ) Кстати, еще есть такая псевдо-функция ArrayRGB_TO_COLORREF(aRGB) SergKis пишет: HMG_RGB2n(40, 122, 237) Проще RGB(40, 122, 237)

SergKis: gfilatov2002 пишет RGB(40, 122, 237) Использование псевдо функции в блоке кода приведет к сообщению Error: Unresolved external '_HB_FUN_RGB' referenced ...


SergKis: gfilatov2002 пишет Проще RGB(40, 122, 237) Мои названия RGB2n(...) и n2RGB(...) добавил HMG_... для общей схемы. Может и не надо добавлять.

gfilatov2002: SergKis пишет: Использование псевдо функции в блоке кода приведет к сообщению Нет, такая ошибка не возникла в следующем коде: [pre2] AAdd( aClr, { 6, { |a,b,c| iif( c:nCell == b, ; // CLR_FOCUSB { RGB( 66, 255, 236), RGB(209, 227, 248) }, ; { RGB(220, 220, 220), RGB(220, 220, 220) } ) } } ) AAdd( aClr, { CLR_HEADF , {|| ArrayRGB_TO_COLORREF( YELLOW ) } } ) // 3 , текста шапки таблицы AAdd( aClr, { CLR_HEADB , {|| { RGB(40, 122, 237), ; RGB(48, 29, 26) } } } ) // 4 , фона шапка таблицы oBrw := Brw2Arr(cBrw, nY, nX, nW, nH, aDatos, aClr, aFont) [/pre2]Пример отработал нормально с этими кодо-блоками

SergKis: gfilatov2002 пишет Пример отработал нормально с этими кодо-блоками Да. Отработал Мой косяк, переносил текст и перенес RGB( { 40, 122, 237 } ), RGB( YELLOW ) с лишними скобками {} Но ArrayRGB_TO_COLORREF( YELLOW ) не вспомнишь как пишется. Останусь на своих RGB2n(...), n2RGB(...) Спасибо.

Andrey: SergKis пишет: Но ArrayRGB_TO_COLORREF( YELLOW ) не вспомнишь как пишется. Останусь на своих RGB2n(...), n2RGB(...) Да это точно такую функцию и не вспомнишь.... да и эту тоже nRGB2Arr() Я тоже замучился из проекта в проект таскать эти ToRgb()... Сергей правильно предложил HMG_RGB2n() и HMG_n2RGB() . Можно и сократить до MG_RGB2n() и MG_n2RGB() Лишь бы были и не таскать из проекта в проект.

SergKis: gfilatov2002 пишет аргументируйте... Небольшой аргумент в пользу функций (не псевдо) - это хранение цветов в файлах ini, xml или использование hb_macroBlock(...) для создания блоков кода.

gfilatov2002: Andrey пишет: Сергей правильно предложил HMG_RGB2n() и HMG_n2RGB() С учетом обсуждения (и поддержки) добавил эти макросы в заголовок i_pseudofunc.ch Теперь код ниже [pre2] LOCAL aClr := {} AAdd( aClr, { CLR_FOCUSB, { |a,b,c| iif( c:nCell == b, ; // CLR_FOCUSB { HMG_RGB2n( 66, 255, 236), HMG_RGB2n(209, 227, 248) }, ; { HMG_RGB2n(220, 220, 220), HMG_RGB2n(220, 220, 220) } ) } } ) AAdd( aClr, { CLR_HEADF , {|| HMG_RGB2n( YELLOW ) } } ) // 3 , текста шапки таблицы AAdd( aClr, { CLR_HEADB , {|| { HMG_RGB2n(40, 122, 237), ; HMG_RGB2n(48, 29, 26) } } } ) // 4 , фона шапка таблицы oBrw := Brw2Arr(cBrw, nY, nX, nW, nH, aDatos, aClr, aFont)[/pre2] отработал без проблем

SergKis: gfilatov2002 Можно изменить в HMG_Alert() строки[pre2] STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable ) ... This.Closable := lClosable This.&( aBut[ Max( 1, Min( nLenaOp, _HMG_ModalDialogReturn ) ) ] ).SetFocus() This.Center() IF lClosable ON KEY ESCAPE OF &cForm ACTION ( _HMG_ModalDialogReturn := 0, lPressButton := .T., ThisWindow.Release() ) ENDIF IF HB_ISBLOCK( bBlock ) Do_WindowEventProcedure( bBlock, This.Index, 'WINDOW_ACTIVATE' ) ENDIF IF _IsControlDefined( "oTimer", cForm ) This.oTimer.Enabled := .T. ENDIF ... [/pre2]

gfilatov2002: SergKis пишет: изменить в HMG_Alert() строки Сделал, конечно

SergKis: gfilatov2002 Предлагаю добавить метод в TsColumn (при работе с dbf заполняются :nFieldTyp, :nFieldLen на колонки)[pre2] METHOD ToWidth( uLen, nKfc ) CLASS TSColumn LOCAL nWidth, nLen, cTyp, cChr := 'B' Default nKfc := 1 If ! empty( ::cPicture ) .and. HB_ISCHAR( ::cPicture ) If empty( uLen ) cChr := ::cPicture If Left(cChr, 2) == '@K' cChr := AllTrim(Substr(cChr, 3)) EndIf nLen := Len( cChr ) Else If '9' $ ::cPicture; cChr := '9' ElseIf 'X' $ ::cPicture; cChr := 'X' EndIf nLen := uLen cChr := Replicate(cChr, nLen) EndIf Else cTyp := ::cFieldTyp nLen := iif( empty(uLen), ::nFieldLen, uLen ) If cTyp $ 'CML'; cChr := 'B' ElseIf cTyp == 'ND'; cChr := '9' EndIf nLen := iif( empty(nLen), 7, nLen ) cChr := Replicate(cChr, nLen) EndIf nWidth := GetTextWidth( 0, cChr, ::hFont ) nWidth := Int( nWidth * nKfc ) RETURN nWidth Применять так к примеру with object oBrw For i := 1 To Len( :aColumns ) oc := :aColumns[ i ] cp := oc:cName xv := :GetValue(cp) cn := '_' + cp s := iif( oc:nFieldLen > 40, 40, Nil ) nl := oc:ToWidth( s ) @ y, x LABEL &cn ; VALUE oc:cHeading ; WIDTH l HEIGHT h ; VCENTERALIGN @ y, x+l+20 GETBOX &cp ; VALUE xv ; WIDTH nl HEIGHT h ; PICTURE :cPictureGet(, i) y += This.&(cn).Height + 20 Next end with [/pre2]

gfilatov2002: SergKis пишет: добавить метод в TsColumn Принято с благодарностью

Andrey: SergKis пишет: Предлагаю добавить метод в TsColumn (при работе с dbf заполняются :nFieldTyp, :nFieldLen на колонки) А как код будет выглядеть ?

SergKis: Andrey пишет А как код будет выглядеть ? SergKis пишет Применять так к примеру with object oBrw For i := 1 To Len( :aColumns ) oc := :aColumns[ i ] cp := oc:cName xv := :GetValue(cp) cn := '_' + cp s := iif( oc:nFieldLen > 40, 40, Nil ) nl := oc:ToWidth( s ) @ y, x LABEL &cn ; VALUE oc:cHeading ; WIDTH l HEIGHT h ; VCENTERALIGN @ y, x+l+20 GETBOX &cp ; VALUE xv ; WIDTH nl HEIGHT h ; PICTURE :cPictureGet(, i) y += This.&(cn).Height + 20 Next end with или :LoadFields(.F.) nKfc := 0.8 // коэффициент для коррекции nWidth полученной при расчете, если надо такая поправка AEval( :aColumns, {|oc| oc:nWidth := oc:ToWidth(iif( oc:nFieldLen > 40, 40, Nil ), nKfc) } )

SergKis: gfilatov2002 Предлагаю такой HMG_Alert(), добавил параметр cFont, для исп. вместо DlgFont. Тогда можно применять Alert...() ф-ии с DlgFont. [pre2] *-----------------------------------------------------------------------------* FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFont ) *-----------------------------------------------------------------------------* LOCAL nLineas LOCAL aIcon := { "ALERT", "QUESTION", "INFO", "STOP" } LOCAL lFont := .F. LOCAL lEmpty := ( Empty( aOptions ) .OR. ISNUMERIC( aOptions ) ) LOCAL cForm := "oDlg" IF _IsWindowDefined( cForm ) nLineas := 0 WHILE _IsWindowDefined( cForm := 'oDlg' + hb_ntos( ++nLineas ) ) END ENDIF lPressButton := .F. lIsWin10 := hb_osisWin10() hb_default( @aBackColor, nRGB2Arr( GetSysColor( COLOR_BTNFACE ) ) ) hb_default( @aFontColor, nRGB2Arr( GetSysColor( COLOR_BTNTEXT ) ) ) DEFAULT cTitle TO "Attention", aOptions TO { "&OK" }, lClosable TO .F. IF ValType( aOptions ) == "A" DEFAULT nType := iif( Len( aOptions ) > 1, 2, 1 ) ELSE DEFAULT nType := 1 ENDIF #ifdef _HMG_COMPAT_ CHECK TYPE cMsg AS USUAL, ; aOptions AS USUAL, ; cTitle AS CHARACTER, ; nType AS NUMERIC, ; cIcoFile AS USUAL, ; nIcoSize AS USUAL, ; aBtnColors AS USUAL, ; bInit AS USUAL, ; lClosable AS LOGICAL #endif IF nType < 1 .OR. nType > 4 nType := 1 ENDIF AEval( aIcon, {|x, i| aIcon[ i ] := "ZZZ_B_" + x } ) DEFAULT cIcoFile := aIcon[ nType ], nIcoSize := 32, cFont := "DlgFont" IF GetFontHandle( cFont ) == 0 lFont := .T. DEFINE FONT &cFont FONTNAME GetDefaultFontName() SIZE GetDefaultFontSize() - iif( lIsWin10, 1, 0 ) ENDIF cMsg := cValToChar( cMsg ) cMsg := StrTran( cMsg, ";", CRLF ) nLineas := MLCount( cMsg, 254 ) IF lEmpty lClosable := .T. _HMG_ModalDialogReturn := 0 ELSE hb_default( @_HMG_ModalDialogReturn, 0 ) ENDIF DEFINE WINDOW &cForm WIDTH 0 HEIGHT 0 TITLE cTitle MODAL NOSIZE BACKCOLOR aBackColor ; ON INTERACTIVECLOSE ( lPressButton .OR. lClosable ) ; ON RELEASE iif( ! lPressButton .AND. lClosable, _HMG_ModalDialogReturn := 0, NIL ) FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFont ) END WINDOW ACTIVATE WINDOW &cForm IF lFont RELEASE FONT &cFont ENDIF RETURN _HMG_ModalDialogReturn *-----------------------------------------------------------------------------* STATIC FUNCTION FillDlg( cMsg, aOptions, nLineas, cIcoFile, nIcoSize, aBtnColors, bBlock, lClosable, cFont ) *-----------------------------------------------------------------------------* LOCAL hWnd LOCAL hDC LOCAL hDlgFont LOCAL aBut := {} LOCAL cForm := ThisWindow.Name LOCAL cLblName LOCAL cBtnName LOCAL nCol LOCAL nOpc := 1 LOCAL nMaxLin := 0 LOCAL nMaxBoton := 0 LOCAL nLenBotones LOCAL nLenaOp LOCAL nWidthCli, nHeightCli LOCAL nWidthDlg, nHeightDlg LOCAL nChrHeight LOCAL nHeightBtn LOCAL nVMARGIN_BUTTON := VMARGIN_BUTTON LOCAL nSeconds LOCAL n LOCAL lExt #ifdef _HMG_COMPAT_ CHECK TYPE cMsg AS CHARACTER, ; aOptions AS USUAL, ; nLineas AS NUMERIC, ; cIcoFile AS CHARACTER, ; nIcoSize AS NUMERIC #endif IF ValType( aOptions ) == "N" nSeconds := aOptions aOptions := { "&OK" } DEFINE TIMER oTimer OF &cForm INTERVAL nSeconds * 1000 ACTION ( lPressButton := .T., ThisWindow.Release() ) This.oTimer.Enabled := .F. ENDIF nLenaOp := iif( ValType( aOptions ) == "A", Len( aOptions ), 1 ) IF ( lExt := ( ISARRAY( aBtnColors ) .AND. Len( aBtnColors ) == nLenaOp ) ) nVMARGIN_BUTTON := 3 * VMARGIN_BUTTON ENDIF hDlgFont := GetFontHandle( cFont ) // calculate the column of the text output nCol := MARGIN_ICON + iif( nIcoSize == 32, 0, MARGIN_ICON / iif( nIcoSize == 64, 2.8, 3.2 ) ) hWnd := This.Handle hDC := GetDC( hWnd ) // calculate the character height for the dialog font nChrHeight := GetTextHeight( hDC, aOptions[ 1 ], hDlgFont ) + nVMARGIN_BUTTON / 2 // calculate the maximum width of the lines FOR n := 1 TO nLineas nMaxLin := Max( nMaxLin, GetTextWidth( hDC, AllTrim( MemoLine( cMsg,, n ) ), hDlgFont ) ) NEXT // calculate the maximum width of the buttons FOR n := 1 TO nLenaOp nMaxBoton := Max( nMaxBoton, GetTextWidth( hDC, aOptions[ n ], hDlgFont ) ) NEXT ReleaseDC( hWnd, hDC ) nMaxBoton += ( HMARGIN_BUTTON * iif( ! lExt .AND. lIsWin10 .AND. nLenAop > 2, 1.1, iif( nLenAop > 1, 2, 3 ) ) ) // calculate the width of the options + their separations nLenBotones := ( nMaxBoton + SEP_BUTTON ) * nLenaOp nHeightBtn := nVMARGIN_BUTTON + nChrHeight + nVMARGIN_BUTTON // calculate the width of the client area nWidthCli := Max( MARGIN_ICON + nMaxLin + MARGIN, MARGIN + nLenBotones + MARGIN - HMARGIN_BUTTON ) + iif( nIcoSize > 48, MARGIN / 4, 0 ) nWidthDlg := nWidthCli + GetBorderWidth() nHeightCli := ( ( nLineas + iif( nLineas == 1, 4, 3 ) ) * nChrHeight ) + nVMARGIN_BUTTON + nHeightBtn + GetBorderHeight() nHeightDlg := nHeightCli + GetTitleHeight() + SEP_BUTTON + GetBorderHeight() / iif( lIsWin10, 2.5, 1 ) IF MSC_VER() > 0 .AND. _HMG_IsThemed nWidthDlg += 10 nHeightDlg += 10 ENDIF This.Width := nWidthDlg This.Height := nHeightDlg IF nLineas > 1 FOR n := 1 TO nLineas cLblName := "Say_" + StrZero( n, 2 ) @ nChrHeight * ( n + iif( nLineas == 1, .5, 0 ) ) + GetBorderHeight(), nCol ; LABEL &cLblName VALUE AllTrim( MemoLine( cMsg,, n ) ) OF &cForm ; FONT cFont WIDTH nWidthCli - nCol - GetBorderWidth() - MARGIN / 4 HEIGHT nChrHeight ; FONTCOLOR aFontColor BACKCOLOR aBackColor VCENTERALIGN NEXT n ELSE @ nChrHeight * 1.5 + GetBorderHeight(), nCol ; LABEL Say_01 VALUE AllTrim( cMsg ) OF &cForm ; FONT cFont WIDTH nWidthCli - nCol - GetBorderWidth() - MARGIN / 4 HEIGHT nChrHeight ; FONTCOLOR aFontColor BACKCOLOR aBackColor VCENTERALIGN ENDIF DRAW ICON IN WINDOW &cForm ; AT nChrHeight + GetBorderHeight(), MARGIN / iif( nIcoSize == 32, 1.4, iif( nIcoSize == 48, 1.7, 2 ) ) ; PICTURE cIcoFile WIDTH nIcoSize HEIGHT nIcoSize TRANSPARENT FOR n := 1 TO nLenaOp cBtnName := "Btn_" + StrZero( n, 2 ) AAdd( aBut, cBtnName ) IF lExt @ 0, 0 BUTTONEX &cBtnName OF &cForm CAPTION aOptions[ n ] ; FONTCOLOR aFontColor BACKCOLOR aBtnColors[ n ] NOXPSTYLE HANDCURSOR ; FONT cFont WIDTH nMaxBoton HEIGHT nVMARGIN_BUTTON + nChrHeight + nVMARGIN_BUTTON ; ACTION ( _HMG_ModalDialogReturn := This.Cargo, lPressButton := .T., ThisWindow.Release() ) ELSE @ 0, 0 BUTTON &cBtnName OF &cForm CAPTION aOptions[ n ] ; FONT cFont WIDTH nMaxBoton HEIGHT nVMARGIN_BUTTON + nChrHeight + nVMARGIN_BUTTON ; ACTION ( _HMG_ModalDialogReturn := This.Cargo, lPressButton := .T., ThisWindow.Release() ) ENDIF This.&( aBut[ nOpc ] ).Cargo := nOpc++ NEXT n nOpc := 1 FOR n := nLenaOp TO 1 STEP -1 This.&( aBut[ n ] ).Row := nHeightCli + SEP_BUTTON + GetBorderHeight() / iif( lIsWin10, 2.5, .9 ) - nChrHeight - nHeightBtn This.&( aBut[ n ] ).Col := nWidthCli + iif( lIsWin10, 0, GetBorderWidth() / 2 ) - ( nMaxBoton + SEP_BUTTON ) * nOpc++ NEXT n This.Closable := lClosable This.&( aBut[ Max( 1, Min( nLenaOp, _HMG_ModalDialogReturn ) ) ] ).SetFocus() This.Center() IF lClosable ON KEY ESCAPE OF &cForm ACTION ( _HMG_ModalDialogReturn := 0, lPressButton := .T., ThisWindow.Release() ) ENDIF IF HB_ISBLOCK( bBlock ) Do_WindowEventProcedure( bBlock, This.Index, 'WINDOW_ACTIVATE' ) ENDIF IF _IsControlDefined( "oTimer", cForm ) This.oTimer.Enabled := .T. ENDIF RETURN NIL [/pre2] Т.е. в примере можно сделать[pre2] FUNCTION Main() ... SET DIALOGBOX CENTER OF PARENT SET CENTERWINDOW RELATIVE PARENT ... DEFINE FONT FontBold FONTNAME _HMG_DefaultFontName SIZE _HMG_DefaultFontSize BOLD DEFINE FONT AgeCard FONTNAME "Verdana" SIZE 12 BOLD DEFINE FONT DlgFont FONTNAME "Tahoma" SIZE 12 ... STATIC FUNC AgeCard( oWnd, oBrw, oCnl ) ... LOCAL cFont := 'AgeCard' If ! empty( oBrw:GetValue('AGE') ) .or. ! empty( oBrw:GetValue('FIRST') ) HMG_Alert( cMsg, aButt, cTitl, , cBmp, , aClr, bInit, .T., cFont ) EndIf ... STATIC FUNC Age_CardSave( oBrw, lSave ) ... If empty( lSave ) .and. ThisWindow.Cargo // lMsg := MsgYesNo('Save card - '+cValToChar(This.AGE.Value )+CRLF+ ; lMsg := AlertYesNo('Save card - '+cValToChar(This.AGE.Value )+CRLF+ ; cValToChar(This.FIRST.Value)+CRLF+ ; cValToChar(This.LAST.Value ), ; 'NR. '+hb_ntos(oBrw:nAt)+ ' RECNO ' + cValToChar(nRec)) EndIf ... [/pre2]

gfilatov2002: SergKis пишет: Предлагаю такой HMG_Alert(), добавил параметр cFont Принято

SergKis: gfilatov2002 Можете пояснить зачем удаляется фонт из списка, если в контролах он не создается (не увидел) ? [pre2] *-----------------------------------------------------------------------------* FUNCTION _EraseControl ( i, p ) *-----------------------------------------------------------------------------* LOCAL hWnd LOCAL mVar LOCAL t, x x := _HMG_aControlFontHandle IF ISNUMERIC ( x ) .AND. !Empty ( x ) .AND. !( x == GetFontHandle ( "DlgFont" ) ) DeleteObject ( x ) ENDIF ... [/pre2] такая штука удаляет фонт, если он не DlgFont, созданный по DEFINE FONT ... и использованный в контроле.

gfilatov2002: SergKis пишет: такая штука удаляет фонт, если он не DlgFont, созданный по DEFINE FONT ... и использованный в контроле Да, все верно. В момент удаления мы ведь не знаем название шрифта, а только указатель (handle) на него. Сейчас этот фрагмент кода выглядит так [pre2] FUNCTION _EraseControl ( i , p ) ... IF ISNUMERIC ( x ) .AND. !Empty ( x ) .AND. ; !( x == GetFontHandle ( "DlgFont" ) ) .AND. !( x == GetFontHandle ( _HMG_ActiveDialogFontName ) ) DeleteObject ( x ) ENDIF [/pre2]

SergKis: gfilatov2002 пишет В момент удаления мы ведь не знаем название шрифта, а только указатель (handle) на него. Зачем удалять фонт, созданный (сохранен в базе _HMG_aControlType == 'FONT') по DEFINE FONT ... ? Его удаляем по RELEASE FONT, а в контролах, если не найден в базе фонтов, используем _HMG_DefaultFontName, или фонт установленный на окно. Или я что то упускаю ?



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