Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

Ответов - 229, стр: 1 2 3 4 5 6 7 8 9 10 11 12 All

Andrey: Всем привет ! А библу hbole совсем выкинули из версии 18.06 ? Больше её не будет в Харборе ?

gfilatov2002: Andrey пишет: hbole совсем выкинули из версии 18.06 Да, верно Andrey пишет: Больше её не будет Нет, не будет Функционал этой устаревшей библиотеки полностью заменяется связкой contrib библиотек hbwin + xhb

Vlad04: hbole совсем выкинули из версии 18.06 Собираю НОВЫЙ проект в дизайнере. Программа не собирается, требует hbole. Стараы проекты собираются


gfilatov2002: Vlad04 пишет: требует hbole Обнови локально HMGS-IDE до версии 1.4.3.4 или дождись новой сборки 18.07, которая выйдет завтра

gfilatov2002: Выпущена новая сборка 18.07 для BCC 5.51 и компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.07-setup.exe Рекомендуется к использованию Также имеются в наличии готовые сборки для: - MinGW 8.1.0 32-bit для Harbour 3.2.0dev; - MinGW 8.1.0 64-bit для Harbour 3.4.0dev; - MS VisualC 2017 32-bit для Harbour 3.2.0dev; - Borland/Embarcadero C++ 7.3 (32-bit) для Harbour 3.4.0dev (НОВАЯ!). Благодарю за Ваше внимание и поддержку

SergKis: gfilatov2002 Добавил в класс TsBrowse переменную для использования как контейнер handle фонтов[pre2] DATA aFontHandle AS ARRAY INIT {} [/pre2] по мне это удобнее, чем внешние переменные, к примеру вместо STATIC a_Font[pre2] STATIC FUNCTION TsbFont( nAt, nCol, oBrw ) LOCAL hFont, lVal //, nVar STATIC a_Font Default nAt := 0 If a_Font == Nil .or. pCount() == 0 a_Font := {} AAdd( a_Font, GetFontHandle( "Font_1" ) ) AAdd( a_Font, GetFontHandle( "Font_2" ) ) AAdd( a_Font, GetFontHandle( "Font_3" ) ) AAdd( a_Font, GetFontHandle( "Font_4" ) ) AAdd( a_Font, GetFontHandle( "Font_5" ) ) AAdd( a_Font, GetFontHandle( "Font_6" ) ) AAdd( a_Font, GetFontHandle( "Font_7" ) ) ... [/pre2] делать AAdd( :aFontHandle, GetFontHandle( "Font_1" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_2" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_3" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_4" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_5" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_6" ) ) AAdd( :aFontHandle, GetFontHandle( "Font_7" ) ) и использовать в блоке кода от ob:aFontHandle[...] oCol:hFont := {|nr,nc,ob| TsbFont(nr, nc, ob)}

sashaBG: Пример INET_CHECKER зависает после длительной больше 8 часов работы иконка исчезает и с меню тоже неизвестно что творится . А у меня на базе етого примера управление LetoDB прицеплено . Пришлось откатится ! Windows 7 / 32bit, проверьте пожалуйста проявляется ли ето зависание на других версиях, т.к. у меня нет возможности сейчас !

Dima: sashaBG Скорее всего утечка памяти

gfilatov2002: sashaBG пишет: Пример INET_CHECKER зависает Благодарю за сообщение об ошибке Dima пишет: утечка памяти Да, это утечка ресурсов Я уже поправил код обработки изменения иконки в трее (для новой сборки). Сейчас тестирую на длительность работы...

SergKis: gfilatov2002 Немного изменил[pre2] CLASS TSBrowse ... // METHOD SetGetValue( xCol, xVal ) METHOD SetGetValue( xCol, xVal ) INLINE ::bDataEval( ::GetColumn( hb_defaultValue( xCol, ::nCell ) ), xVal ) METHOD SetValue( xCol, xVal ) INLINE ::SetGetValue( xCol, xVal ) METHOD GetValue( xCol ) INLINE ::SetGetValue( xCol ) METHOD bDataEval( oCol, xVal ) // METHOD bDataEval( oCol ) INLINE iif(Empty(oCol:cAlias) .or. '->' $ oCol:cField, ; // Eval( oCol:bData ), (oCol:cAlias)->( Eval( oCol:bData ) )) ... METHOD bDataEval( oCol, xVal ) CLASS TSBrowse LOCAL lNoAls := Empty(oCol:cAlias) .or. '->' $ oCol:cField If xVal == Nil // FieldGet If lNoAls; xVal := Eval( oCol:bData ) Else ; xVal := (oCol:cAlias)->( Eval( oCol:bData ) ) EndIf Else // FieldPut If lNoAls; Eval( oCol:bData, xVal ) Else ; (oCol:cAlias)->( Eval( oCol:bData, xVal ) ) EndIf EndIf RETURN xVal ... [/pre2]

gfilatov2002: SergKis пишет: Немного изменил OK

SergKis: gfilatov2002 Продолжение[pre2] METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ; ... Default ::nHeightSuper := 0, ; nKey := VK_RETURN, ; nKeyFlags := 0, ; uVar := ::bDataEval( oCol ), ; // Eval( oCol:bData ), ; cPicture := oCol:cPicture, ; ... // If ValType( Eval( oCol:bData ) ) == "N" If ValType( ::bDataEval( oCol ) ) == "N" nWidth := 0 Aeval( aGet, { |x| nWidth := Max( Len(x), nWidth ) } ) nWidth := Max( GetTextWidth( 0, Replicate( 'B', nWidth ), hFont ), oCol:nWidth ) EndIf ... METHOD Excel2( cFile, lActivate, hProgress, cTitle, lSave, bPrintRow ) CLASS TSBrowse ... cPic := '' // cType := If( Empty( ::aColumns[ nCol ]:cDataType ), ValType( Eval( ::aColumns[ nCol ]:bData ) ), ::aColumns[ nCol ]:cDataType ) cType := If( Empty( ::aColumns[ nCol ]:cDataType ), ValType( ::bDataEval( ::aColumns[ nCol ] ) ), ::aColumns[ nCol ]:cDataType ) if cType == 'N' .and. !Empty( ::aColumns[ nCol ]:cPicture ) ... For nCol := 1 To Len( ::aColumns ) If ::aColumns[ nCol ]:lBitMap Loop EndIf // uData := Eval( ::aColumns[ nCol ]:bData ) uData := ::bDataEval( ::aColumns[ nCol ] ) nAlign := LoWord( ::aColumns[ nCol ]:nAlign ) ... METHOD ExcelOle( cXlsFile, lActivate, hProgress, cTitle, hFont, lSave, bExtern, aColSel, bPrintRow ) CLASS TSBrowse ... For nCol := 1 To Len( ::aColumns ) If aColSel != Nil .and. AScan( aColSel, nCol ) == 0 Loop EndIf // uData := Eval( ::aColumns[ nCol ]:bData ) uData := ::bDataEval( ::aColumns[ nCol ] ) If ValType( uData ) == "C" ... METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse ... If ::lAppendMode Return 0 EndIf ::lNoPaint := .F. // cTypeCol := iif( ::nLen == 0, "U", ValType( Eval( ::aColumns[ ::nCell ]:bData ) ) ) // Modificado por Carlos cTypeCol := iif( ::nLen == 0, "U", ValType( ::bDataEval( ::aColumns[ ::nCell ] ) ) ) // Modificado por Carlos If Upper( ::aMsg[ 1 ] ) == "YES" ... METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... ElseIf ::lCellBrw .and. ( nKey == VK_COPY .or. nKey == VK_INSERT ) // uTemp := cValToChar( Eval( ::aColumns[ nCol ]:bData ) ) uTemp := cValToChar( ::bDataEval( ::aColumns[ nCol ] ) ) CopyToClipboard( uTemp ) SysRefresh() ... nCol := ::nColSpecHd If Empty(uTemp) // cType := ValType( Eval( ::aColumns[ nCol ]:bData ) ) cType := ValType( ::bDataEval( ::aColumns[ nCol ] ) ) If cType $ "CM" // uTemp := Space( Len( Eval( ::aColumns[ nCol ]:bData ) ) ) uTemp := Space( Len( ::bDataEval( ::aColumns[ nCol ] ) ) ) ElseIf cType == "N" ... ElseIf ::lAppendMode .and. ::aDefault != Nil If Len( ::aDefault ) < Len( ::aColumns ) ASize( ::aDefault, Len( ::aColumns ) ) EndIf uTemp := If( ::aDefault[ nCol ] != Nil, If( ValType( ::aDefault[ nCol ] ) == "B", ; Eval( ::aDefault[ nCol ], Self ), ::aDefault[ nCol ] ), ::bDataEval( ::aColumns[ nCol ] ) ) // Eval( ::aDefault[ nCol ], Self ), ::aDefault[ nCol ] ), Eval( ::aColumns[ nCol ]:bData ) ) Else // uTemp := Eval( ::aColumns[ nCol ]:bData ) uTemp := ::bDataEval( ::aColumns[ nCol ] ) ... METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... If Eval( If( ! ::lAppendMode, bRecLock, bAddRec ), uTemp ) // Eval( ::aColumns[ nCol ]:bData, uTemp, Self ) ::bDataEval( ::aColumns[ nCol ], uTemp ) SysRefresh() If lAppend If ! Empty( ::aDefault ) ASize( ::aDefault, Len( ::aColumns ) ) AEval( ::aDefault, { | e, n | If( e != Nil .and. n != nCol, If( Valtype( e ) == "B", ; ::bDataEval( ::aColumns[ n ], Eval( e, Self ) ), ; ::bDataEval( ::aColumns[ n ], e ) ), Nil ) } ) // Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), ; // Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } ) ::DrawLine() EndIf ... EndIf // Eval( ::aColumns[ nCol ]:bData, uTemp ) ::bDataEval( ::aColumns[ nCol ], uTemp ) SysRefresh() If ::aColumns[ nCol ]:bPostEdit != Nil Eval( ::aColumns[ nCol ]:bPostEdit, uTemp, Self, lAppend ) EndIf ::lEditing := .F. ::lPostEdit := .F. If lAppend If ! Empty( ::aDefault ) ASize( ::aDefault, Len( ::aColumns ) ) AEval( ::aDefault, { | e, n | If( e != Nil .and. n != nCol, If( Valtype( e ) == "B", ; ::bDataEval( ::aColumns[ n ], Eval( e, Self ) ), ::bDataEval( ::aColumns[ n ], e ) ), Nil ) } ) // Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } ) EndIf ::DrawLine() EndIf ... Static Function RecordBrowse( oBrw ) ... For Each oCol In oBrw:aColumns // AAdd( aArr, { oCol:cHeading, Eval( oCol:bData ) } ) AAdd( aArr, { oCol:cHeading, oBrw:bDataEval( oCol ) } ) Next ...[/pre2]

SergKis: gfilatov2002 И еще, если добавить в TsColumn[pre2] DATA bDecode // Charset decode or other DATA bEncode // Charset encode or other ... изменить METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse LOCAL cAlias := oCol:cAlias LOCAL lNoAls := Empty(cAlias) .or. '->' $ oCol:cField If xVal == Nil // FieldGet If lNoAls; xVal := Eval( oCol:bData ) Else ; xVal := (cAlias)->( Eval( oCol:bData ) ) EndIf Else // FieldPut If HB_ISBLOCK(oCol:bEncode) nCol := hb_defaultValue( nCol, ::nCell ) If lNoAls xVal := Eval( oCol:bEncode, xVal, Self, nCol ) Else xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) ) EndIf EndIf If lNoAls; Eval( oCol:bData, xVal ) Else ; (cAlias)->( Eval( oCol:bData, xVal ) ) EndIf EndIf RETURN xVal ... METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... If Eval( If( ! ::lAppendMode, bRecLock, bAddRec ), uTemp ) // Eval( ::aColumns[ nCol ]:bData, uTemp, Self ) ::bDataEval( ::aColumns[ nCol ], uTemp, nCol ) SysRefresh() If lAppend If ! Empty( ::aDefault ) ASize( ::aDefault, Len( ::aColumns ) ) AEval( ::aDefault, { | e, n | If( e != Nil .and. n != nCol, If( Valtype( e ) == "B", ; ::bDataEval( ::aColumns[ n ], Eval( e, Self ), n ), ; ::bDataEval( ::aColumns[ n ], e, n ) ), Nil ) } ) // Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), ; // Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } ) ::DrawLine() EndIf ... EndIf // Eval( ::aColumns[ nCol ]:bData, uTemp ) ::bDataEval( ::aColumns[ nCol ], uTemp, nCol ) SysRefresh() If ::aColumns[ nCol ]:bPostEdit != Nil Eval( ::aColumns[ nCol ]:bPostEdit, uTemp, Self, lAppend ) EndIf ... If lAppend If ! Empty( ::aDefault ) ASize( ::aDefault, Len( ::aColumns ) ) AEval( ::aDefault, { | e, n | If( e != Nil .and. n != nCol, If( Valtype( e ) == "B", ; ::bDataEval( ::aColumns[ n ], Eval( e, Self ), n ), ::bDataEval( ::aColumns[ n ], e, n ) ), Nil ) } ) // Eval( ::aColumns[ n ]:bData, Eval( e, Self ) ), Eval( ::aColumns[ n ]:bData, e ) ), Nil ) } ) EndIf ::DrawLine() EndIf ... запись в таблицу будет проще решать при работе с CHARSET [/pre2]

SergKis: PS Можно перенести в :bDataEval и :bDecode, тогда изменения такие [pre2] METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse LOCAL cAlias := oCol:cAlias LOCAL lNoAls := Empty(cAlias) .or. '->' $ oCol:cField If xVal == Nil // FieldGet If lNoAls; xVal := Eval( oCol:bData ) Else ; xVal := (cAlias)->( Eval( oCol:bData ) ) EndIf If HB_ISBLOCK(oCol:bDecode) .and. nCol != Nil If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol ) Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol ) ) EndIf EndIf Else // FieldPut If HB_ISBLOCK(oCol:bEncode) nCol := hb_defaultValue( nCol, ::nCell ) If lNoAls xVal := Eval( oCol:bEncode, xVal, Self, nCol ) Else xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) ) EndIf EndIf If lNoAls; Eval( oCol:bData, xVal ) Else ; (cAlias)->( Eval( oCol:bData, xVal ) ) EndIf EndIf RETURN xVal ... METHOD DrawLine( xRow ) CLASS TSBrowse ... ElseIf cColAls != Nil If HB_ISBLOCK( oColumn:bSeek ) ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ::bDataEval( oColumn, , nJ ) // uData := ( cColAls )->( Eval( oColumn:bData ) ) // If Valtype( oColumn:bDecode ) == 'B' // uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) ) // EndIf Else If HB_ISBLOCK( oColumn:bSeek ) Eval( oColumn:bSeek, Self, nJ ) EndIf uData := ::bDataEval( oColumn, , nJ ) // uData := Eval( oColumn:bData ) // If Valtype( oColumn:bDecode ) == 'B' // uData := Eval( oColumn:bDecode, uData, Self, nJ ) // EndIf EndIf ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... ElseIf cColAls != Nil If HB_ISBLOCK( oColumn:bSeek ) ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ::bDataEval( oColumn, , nJ ) // uData := ( cColAls )->( Eval( oColumn:bData ) ) // If HB_ISBLOCK( oColumn:bDecode ) // uData := ( cColAls )->( Eval( oColumn:bDecode, uData, Self, nJ ) ) // EndIf Else If HB_ISBLOCK( oColumn:bSeek ) Eval( oColumn:bSeek, Self, nJ ) EndIf uData := ::bDataEval( oColumn, , nJ ) // uData := Eval( oColumn:bData ) // If HB_ISBLOCK( oColumn:bDecode ) // uData := Eval( oColumn:bDecode, uData, Self, nJ ) // EndIf EndIf ... [/pre2]

SergKis: PS Пример из поста 1940 этой темы, работает нормально https://my-files.ru/dofcn3

gfilatov2002: SergKis пишет: Можно перенести в :bDataEval и :bDecode Выполнил предложенные изменения. Благодарю за помощь

SergKis: gfilatov2002 Еще немного поправил[pre2] METHOD SetGetValue( xCol, xVal ) INLINE ::bDataEval ( xCol, xVal ) METHOD SetValue( xCol, xVal ) INLINE ::SetGetValue( xCol, xVal ) METHOD GetValue( xCol ) INLINE ::SetGetValue( xCol ) ... METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse LOCAL cAlias, lNoAls If ! HB_ISOBJECT( oCol ) nCol := iif( HB_ISCHAR( oCol ), ::nColumn( oCol ), oCol ) oCol := ::aColumns[ nCol ] EndIf cAlias := oCol:cAlias lNoAls := Empty(cAlias) .or. '->' $ oCol:cField If xVal == Nil // FieldGet If lNoAls; xVal := Eval( oCol:bData ) Else ; xVal := (cAlias)->( Eval( oCol:bData ) ) EndIf If HB_ISBLOCK(oCol:bDecode) .and. nCol != Nil If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol ) Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol ) ) EndIf EndIf Else // FieldPut If HB_ISBLOCK(oCol:bEncode) .and. nCol != Nil If lNoAls; xVal := Eval( oCol:bEncode, xVal, Self, nCol ) Else ; xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) ) EndIf EndIf If lNoAls; Eval( oCol:bData, xVal ) Else ; (cAlias)->( Eval( oCol:bData, xVal ) ) EndIf EndIf RETURN xVal [/pre2]

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

gfilatov2002: Всем кому это интересно Подготовил первый релиз-кандидат для новой сборки библиотеки со следующим списком изменений [pre2] * Fixed: Detected resource leakage at a long changing of a notify icon. It exists in the official version too. Problem was reported by Sasha Savov <savovs/at/gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\INET_CHECKER) * Fixed: Processing of the 'ColumnWidthLimits' property in a Grid at the column's adding (problem was introduced in the build 18.07). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\ReadXLS) * New: A Grid control supports an optional Grouping feature. As its name suggests, this feature allows you to group items based on a particular information. It's conceptually a way to create horizontal columns to group related sets of items, and use the ListView a bit like a simplified grid control. This feature have the following properties and methods: - <Window>.<Grid>.GroupEnabled [ := | -->] lBoolean - <Window>.<Grid>.GroupDeleteAll - <Window>.<Grid>.GroupDelete ( nGroupID ) - <Window>.<Grid>.GroupExpand ( nGroupID ) - <Window>.<Grid>.GroupCollapsed ( nGroupID ) - <Window>.<Grid>.GroupAdd ( nGroupID [, nPosition ] ) - <Window>.<Grid>.GroupInfo ( nGroupID ) [ := | -->] { [cHeader], [nAlignHeader], [cFooter], [nAlingFooter], [nState] } - <Window>.<Grid>.GroupItemID ( nItem ) [ := | -->] nGroupID - nAlignHeader & nAlingFooter --> GRID_GROUP_LEFT | GRID_GROUP_CENTER | GRID_GROUP_RIGHT - nState --> GRID_GROUP_NORMAL | GRID_GROUP_COLLAPSED - <Window>.<Grid>.GroupDeleteAllItems ( nGroupID ) - <Window>.<Grid>.GroupGetAllItemIndex ( nGroupID ) --> anItemIndex - <Window>.<Grid>.GroupCheckBoxAllItems ( nGroupID ) := lCheck Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\Grid_Groups) * New: Added a possibility to set/get the following hidden properties in a Grid/Browse control at runtime: Form.Browse.HeaderDragDrop [ := | -->] lBoolean Form.Grid.InfoTip [ := | -->] lBoolean The default value of the above properties is TRUE (introduced in the build 2.4.5). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\ListViewEx) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - New: it is possible to assign any data type or a list of data in a Label control, e.g. @ ... LABEL ... VALUE xDataType Form.Label.Value := xDataType Form.Label.Value := { xDataType, xDataType, ... } (see demo in folder \samples\Basic\DirectoryRecurse) - New: it is possible to set/get the following properties in a Grid/Browse control at runtime: Form.Browse.PaintDoubleBuffer [ := | -->] lBoolean (see Browse6.prg in folder \samples\Basic\Browse_3) Form.Grid.CheckBoxEnabled [ := | -->] lBoolean (see demo in folder \samples\Basic\CheckBox_Grid) - Fixed: 'This' object reference incorrect on Grid VALID procedure. (see demo in folder \samples\Basic\Grid_Virtual) - Modified: when loads a Grid control and 'ColumnControls' property is NIL then converts automatically any data type in a text type, this avoids that column appears with the empty values. (see demo4.prg in folder \samples\Basic\Grid_Test) Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> * Modified: The improved function cValToChar() was moved to MiniGUI core. A dependance of Minigui core from the tsbrowse library was removed (introduced in the build 18.02). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\Grid_Test) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - New: added the optional code block :bEncode in TSColumn class. - Modified: replace Eval( oCol:bData ) with ::bDataEval( oCol ). - Updated: modifications in the methods bDataEval() and PostEdit(). - Updated: modification in the methods DrawLine() and DrawSelect(). Suggested and contributed by Sergej Kiselev. * Updated: Harbour Compiler 3.2.0dev (SVN 2018-06-04 01:30): * Updated: OpenSSL wrapper for using of the version 1.0.2o. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'How to set/get a number of visible rows in a Grid control' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo4.prg in folder \samples\Basic\Grid_Test) * New: 'Simple app for test of Virtual Grid' sample. Based upon a contribution of Marek Olszewski <mol/at/pro.onet.pl>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Grid_Virtual) * Updated: 'Print Pie Graph' sample: updated the data for July 2018. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Hyper Link' sample: added calling of the function HMG_CallDLL(). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\HYPERLINK) * Updated: MAINDEMO (SYNTAX I) sample: updated a notify icon handling. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see at folder \samples\Basic\MAINDEMO_(SYNTAX_I)) * Updated: 'Multi RichEditEx' sample: - fixed the Save options without an opened RTF file. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Advanced\RicheditEx_2) [/pre2] Благодарю за Ваше внимание P.S. И немного о грустном: Кузьме Скрябину сегодня исполнилось бы 50 лет...

SergKis: gfilatov2002 Возможно будет интересно (альтернатива :bData). Ввел в TsColumns DATA bValue. [pre2] METHOD bDataEval( oCol, xVal, nCol ) CLASS TSBrowse LOCAL cAlias, lNoAls If ! HB_ISOBJECT( oCol ) nCol := iif( HB_ISCHAR( oCol ), ::nColumn( oCol ), oCol ) oCol := ::aColumns[ nCol ] EndIf cAlias := oCol:cAlias lNoAls := Empty(cAlias) .or. '->' $ oCol:cField If xVal == Nil // FieldGet If HB_ISBLOCK(oCol:bValue) If lNoAls; xVal := Eval( oCol:bValue , NIL , Self, nCol, oCol ) Else ; xVal := (cAlias)->( Eval( oCol:bValue , NIL , Self, nCol, oCol ) ) EndIf Else If lNoAls; xVal := Eval( oCol:bData ) Else ; xVal := (cAlias)->( Eval( oCol:bData ) ) EndIf EndIf If HB_ISBLOCK(oCol:bDecode) .and. nCol != Nil If lNoAls; xVal := Eval( oCol:bDecode, xVal, Self, nCol ) Else ; xVal := (cAlias)->( Eval( oCol:bDecode, xVal, Self, nCol ) ) EndIf EndIf Else // FieldPut If HB_ISBLOCK(oCol:bEncode) .and. nCol != Nil If lNoAls; xVal := Eval( oCol:bEncode, xVal, Self, nCol ) Else ; xVal := (cAlias)->( Eval( oCol:bEncode, xVal, Self, nCol ) ) EndIf EndIf If HB_ISBLOCK(oCol:bValue) If lNoAls; xVal := Eval( oCol:bValue , xVal, Self, nCol, oCol ) Else ; xVal := (cAlias)->( Eval( oCol:bValue , xVal, Self, nCol, oCol ) ) EndIf Else If lNoAls; Eval( oCol:bData , xVal ) Else ; (cAlias)->( Eval( oCol:bData , xVal ) ) EndIf EndIf EndIf RETURN xVal [/pre2] Использование[pre2] oColum:cName := 'MET' oColum:lChecBox := .T. oColum:Cargo := oKeyData() // контейнер\список для recno отмеченных записей oColum:bValue := {|xval,obrw,ncol,ocol| ; xval := ocol:Cargo:Get((obrw:cAlias)->( RecNo() )), ; ncol := ! empty(xval) } // .T. - при наличии в контейнере ... oBrw:UserKeys( VK_SPACE, {|obr| Local oCol := obr:aColumns[obr:nCell] Local nRec If oCol:cName == 'MET' nRec := (obr:cAlias)->( RecNo() ) If empty(oCol:Cargo:Get(nRec)) // добавим в список oCol:Cargo:Set(nRec, nRec) Else oCol:Cargo:Del(nRec) // уберем из списка EndIf EndIf Return Nil } ) [/pre2]



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