Форум » 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 пишет: добавить методы Добавил эти методы, но, конечно, переименовал SetDublClick в SetDoubleClick Благодарю за помощь

SergKis: gfilatov2002 Мелочь, но поправьте [pre2] #translate System.ClientWidth => ( GetDesktopWidth () - GetBorderWidth () ) #translate System.ClientHeight => ( GetDesktopHeight() - GetBorderHeight() - GetTaskBarHeight() ) [/pre2]

gfilatov2002: SergKis пишет: поправьте OK


SergKis: gfilatov2002 Для простого определения принадлежности колонки к алиасу добавил [pre2] CLASS TSColumn ... DATA cError // Bad valid error message DATA cArea INIT "" // Alias name of column DATA cField INIT "" // Field Name of column ... METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel ) CLASS TSBrowse ... ATail( ::aColumns ):cArea := cAlias ATail( ::aColumns ):cData := cAlias + "->" + FieldName( nE ) ... METHOD LoadRelated( cAlias, lEditable, aNames, aHeaders ) CLASS TSBrowse ... ATail( ::aColumns ):cAlias := cAlias ATail( ::aColumns ):cData := cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cField := cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cName := cAlias + "->" + ( cAlias )->( FieldName( nE ) ) ATail( ::aColumns ):cArea := cAlias ATail( ::aColumns ):cFieldTyp := aStru[ nE, 2 ] ATail( ::aColumns ):nFieldLen := aStru[ nE, 3 ] ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] Next ... [/pre2]

gfilatov2002: SergKis пишет: определения принадлежности колонки к алиасу добавил Продублировал эти изменения также, хотя и не очень понятно, почему недостаточно ATail( ::aColumns ):cAlias := cAlias и требуется дублировать это значение в еще одну переменную cArea

SergKis: gfilatov2002 пишет требуется дублировать это значение в еще одну переменную cArea oBrw:cAlias опр. рабочую область тсб, oCol:cAlias задействован в работе блока кода, для массива то же срабатывает. oCol:cArea позволит связать колонку с полем в базе, не меняя "старые" алгоритмы, в том числе и при тсб массива. Выделять из oCol:cData алиас можно, но не очень удобно. Код (выделен) [pre2] :LoadFields(.T., aColSel, cAls) FOR nI := 1 TO Len( aColSel ) :GetColumn(aColSel[ nI ]):bPrevEdit := {|| (cAls)->( RLock() ) } :GetColumn(aColSel[ nI ]):bPostEdit := {|| (cAls)->( dbUnLock() ) } NEXT :GetColumn("MARRIED" ):bEncode := {|lx| ! lx } [/pre2] Можно, в дальнейшем, убрать в тсб, где cAls брать из oCol:cArea, т.к. сейчас при LOCK свойстве тсб блокируется \ разблокируется запись oBrw:cAlias

gfilatov2002: SergKis пишет: oCol:cArea позволит связать колонку с полем в базе Понятно, благодарю за разъяснение SergKis пишет: Можно, в дальнейшем, убрать в тсб, где cAls брать из oCol:cArea Тогда ожидаю такую модификацию, если она потребуется...

SergKis: gfilatov2002 пишет Тогда ожидаю такую модификацию Сделал так [pre2] CLASS TSBrowse FROM TControl ... DATA lRecLockArea AS LOGICAL INIT .F. // flag to lock record for oCol:cArea alias ... METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse ... Local lLockArea, cArea ... bAddRec := If( ! Empty( ::bAddRec ), ::bAddRec, {|| ( cAlias )->( dbAppend() ), ! NetErr() } ) cArea := ::aColumns[ nCol ]:cArea lLockArea := ::lRecLockArea .and. ! Empty( cArea ) .and. Select( cArea ) > 0 If bValid != Nil ... If ::lIsDbf If Eval( If( ! ::lAppendMode, bRecLock, bAddRec ), uTemp ) If lLockArea If ( cArea )->( RLock() ) ::bDataEval( ::aColumns[ nCol ], uTemp, nCol ) EndIf Else ::bDataEval( ::aColumns[ nCol ], uTemp, nCol ) EndIf SysRefresh() ... if !("SQL" $ ::cDriver) ( cAlias )->( DbUnLock() ) endif If lLockArea ( cArea )->( dbUnLock() ) ( cArea )->( DbSkip( 0 ) ) EndIf If lAppend ... [/pre2] Пример проверки тут https://TransFiles.ru/xe6ti

gfilatov2002: SergKis пишет: Сделал так Принято с благодарностью SergKis пишет: Пример проверки Работает отлично Я только добавил :GetColumn("MARRIED" ):nEditMove := DT_DONT_MOVE чтобы не убегал курсор после нажатия Enter на этом поле

SergKis: gfilatov2002 Возможно, будет интересно. Подключил в примерах Tsb_ReportAge и Tsb_SetFieldsTo работу с LetoDbf, работают с одной базой Employee.dbf. Сервер из каталога SAMPLES\Advanced\LetoDbf\SERVER должен быть запущен. Запуск в обоих случаях Demo.exe * На сервер переписывается таблица Employee.dbf, если первым запустить Tsb_ReportAge, то на сервере в таблице будет 1000 записей, если Tsb_SetFieldsTo, то 11000 Tsb_ReportAge тут https://TransFiles.ru/etjm9 Tsb_SetFieldsTo тут https://TransFiles.ru/l8587

gfilatov2002: SergKis пишет: Подключил в примерах Tsb_ReportAge и Tsb_SetFieldsTo работу с LetoDbf Спасибо! Да, примеры работают с сервером при запуске demo.exe * Заметил, что в Tsb_SetFieldsTo количество отобранных записей в подвале правильно обновляется только со второй попытки...

SergKis: gfilatov2002 пишет количество отобранных записей в подвале правильно обновляется только со второй попытки... Добавьте прорисовку подвала [pre2] oBrw:GetColumn("NN"):cFooting := hb_ntos( (cOut)->( OrdKeyCount() ) ) oBrw:DrawFooters() [/pre2]

SergKis: gfilatov2002 Модифицировал пример, добавив справочник STATE.DBF, колонки в тсб набираются смешано с 3х алиасов. Работает запуск и с сервером тоже Пример тут https://TransFiles.ru/xuqt2

SergKis: gfilatov2002 Предлагаю добавить в тсб[pre2] METHOD IsEditable( nCol ) INLINE ::lCellBrw .and. ::aColumns[ nCol ]:lEdit .and. ; ( ::aColumns[ nCol ]:bWhen == Nil .or. Eval( ::aColumns[ nCol ]:bWhen, Self ) ) ACCESS IsEdit INLINE ! Empty( ::aColumns[ ::nCell ]:oEdit ) ... использовать, к примеру, вместо // ON KEY ESCAPE ACTION iif( Empty(oBrw:aColumns[ oBrw:nCell ]:oEdit), _wPost(99), ) ON KEY ESCAPE ACTION iif( oBrw:IsEdit, , _wPost(99) ) [/pre2]

SergKis: PS Добавить параметр[pre2] METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse ... If ValType( ::aHeaders ) == "A" .and. ! Empty( ::aHeaders ) .and. n <= Len( ::aHeaders ) cHeading := ::aHeaders[ n ] Else cHeading := ::Proper( ( cAlias )->( Field( nE ) ) ) EndIf If HB_ISARRAY( aHeadSel ) .and. Len( aHeadSel ) > 0 .and. n <= Len( aHeadSel ) .and. aHeadSel[ n ] != Nil cHeading := aHeadSel[ n ] EndIf ... тогда можно так делать ( удобнее ) :LoadFields(.F., {"REC" }, cOut , {"IDN"}, {"Id"}) :LoadFields(.F., {"STATE"}, cAls ) :LoadFields(.F., {"NAME" }, cAlsS, , {"State name"}) :LoadFields(.T., {"CITY", "STREET", "ZIP", "FIRST", "LAST", "AGE", "MARRIED" }, cAls) AEval(:aColumns, {|oc,nc| oc:lEmptyValToChar := .T., ; oc:lFixLite := .T. }) // :GetColumn("IDN" ):cHeading := "Id" // :GetColumn("NAME"):cHeading := "State name" ... [/pre2]

gfilatov2002: SergKis пишет: Модифицировал пример, добавив справочник STATE.DBF ОК SergKis пишет: Предлагаю добавить в тсб Принято с благодарностью

gfilatov2002: SergKis пишет: ON KEY ESCAPE ACTION iif( oBrw:IsEdit, , _wPost(99) ) Записал эту строку так: ON KEY ESCAPE ACTION iif( oBrw:IsEdit, oBrw:PostMsg( WM_KEYDOWN, VK_ESCAPE, 0 ), _wPost(99) ) Работает нормально

SergKis: gfilatov2002 пишет ON KEY ESCAPE ACTION iif( oBrw:IsEdit, oBrw:PostMsg( WM_KEYDOWN, VK_ESCAPE, 0 ), _wPost(99) Может добавить[pre2] METHOD PostMsg( nMsg, wParam, lParam ) INLINE ::Super:PostMsg( hb_defaultValue(nMsg, WM_KEYDOWN), wParam, hb_defaultValue(lParam, 0) ) Мелочь, но тогда короче писать можно (клавишных сообщений исп. достаточно) ON KEY ESCAPE ACTION iif( oBrw:IsEdit, oBrw:PostMsg(, VK_ESCAPE), _wPost(99) ) [/pre2]

gfilatov2002: SergKis пишет: Может добавить Нет, на мой взгляд такой синтаксис oBrw:PostMsg( WM_KEYDOWN, VK_ESCAPE, 0 ) нагляднее В противном случае, надо помнить, что сообщение WM_KEYDOWN используется по умолчанию (и не забыть поставить запятую перед VK_ESCAPE), но ведь есть и другие сообщения

SergKis: gfilatov2002 пишет такой синтаксис нагляднее Согласен Хотелось покороче писать, к примеру, методами oBrw:PostKeyDown( VK_ESCAPE ) oBrw:PostKeyUp( VK_ESCAPE ) но короче не получается, а вот последний параметр можно не задавать. oBrw:PostMsg( WM_KEYDOWN, VK_ESCAPE, 0 )



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