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

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

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

krutoff: Григорий, наткнулся на такую проблемку. Для ввода новой записи в полнооконном режиме я всегда делаю такой код if isAppend; Go Bottom; Skip; endIf // Чтобы показало нулевые поля Затем форму наполняю getBox'ами с параметром FIELD. В этом случае фома будет универсальной для ввода/корректировки записи. Так вот если при вводе новой записи в ON INIT переприсвоить значения getBox'ов, то ничего не переприсваивается. Нашел, где портится - при открытии окна идет цепочка процедур (h_windows.prg): _ActivateWindow _SetActivationFlag _ProcessInitProcedure _RefreshDataControls И вот эта последняя процедура _RefreshDataControls присваивает значения из записи файла. Можно ли в этой цепочке поставить _ProcessInitProcedure последней?

gfilatov2002: Выпустил очередной релиз библиотеки. Сборка для компилятора BCC лежит на официальном сайте библиотеки по адресу: http://hmgextended.com/files/CONTRIB/hmg-2.5.2-setup.zip Также доступна сборка для компилятора MinGW по адресу: http://hmgextended.com/files/CONTRIB/hmg252-mingw.exe и компактный архив для свежей версии компилятора xHarbour http://hmgextended.com/files/CONTRIB/xhmg252_xhb10131.zip Благодарю за внимание

Haz: gfilatov2002 пишет: Выпустил очередной релиз библиотеки пересобрал проект все норм


gfilatov2002: Haz Игорь, благодарю за подтверждение! krutoff Так задумано автором, и менять этот порядок вызовов нет смысла из соображений совместимости со старым кодом

SergKis: gfilatov2002 Григорий, поковырялся еще в вызовах блока кода TsBrowse. Можно добавть эти модификации (bold-ом) ? [pre2] METHOD DrawHeaders( lFooters ) CLASS TSBrowse ... For nI := nBegin To nLastCol ... nAlign := If( ValType( oColumn:nHAlign ) == "B", ; Eval( oColumn:nHAlign, nJ, Self ), oColumn:nHAlign ) ... hBitMap := If( ValType( oColumn:uBmpHead ) == "B", Eval( oColumn:uBmpHead, nJ, Self ), oColumn:uBmpHead ) ... cHeading := If( Valtype( oColumn:cHeading ) == "B", Eval( oColumn:cHeading, nJ, Self ), oColumn:cHeading ) ... nClr3dL := If( ValType( nClr3dL ) == "B", Eval( nClr3dL, 0, nJ, Self ), nClr3dL ) nClr3dS := If( ValType( nClr3dS ) == "B", Eval( nClr3dS, 0, nJ, Self ), nClr3dS ) ... IF ::lDrawSpecHd ... nAlign := If( ValType( oColumn:nSAlign ) == "B", Eval( oColumn:nSAlign, nJ, Self ), oColumn:nSAlign ) ... nClrFore := If( ValType( nClrFore ) == "B", Eval( nClrFore, nJ, Self ), nClrFore ) ... nClrBackS := If( ValType( nClrBackS ) == "B", Eval( nClrBackS, nJ, Self ), nClrBackS ) ... cHeading := If( Valtype( oColumn:cSpcHeading ) == "B", Eval( oColumn:cSpcHeading, nJ, Self ), oColumn:cSpcHeading ) ... hBitMap := If( ValType( oColumn:uBmpSpcHd ) == "B", Eval( oColumn:uBmpSpcHd, nJ, Self ), oColumn:uBmpSpcHd ) ... nClr3dL := If( ValType( nClr3dL ) == "B", Eval( nClr3dL, 0, nJ, Self ), nClr3dL ) nClr3dS := If( ValType( nClr3dS ) == "B", Eval( nClr3dS, 0, nJ, Self ), nClr3dS ) ... If ::lFooting .and. ::lDrawFooters ... nClrFore := If( ValType( nClrFore ) == "B", Eval( nClrFore, nJ, Self ), nClrFore ) ... nClrBack := If( ValType( nClrBack ) == "B", Eval( nClrBack, nJ, Self ), nClrBack ) ... cFooting := If( Valtype( oColumn:cFooting ) == "B", Eval( oColumn:cFooting, nJ, Self ), oColumn:cFooting ) ... hBitMap := If( ValType( oColumn:uBmpFoot ) == "B", Eval( oColumn:uBmpFoot, nJ, Self ), oColumn:uBmpFoot ) ... nClr3dL := If( ValType( nClr3dL ) == "B", Eval( nClr3dL, 0, nJ, Self ), nClr3dL ) nClr3dS := If( ValType( nClr3dS ) == "B", Eval( nClr3dS, 0, nJ, Self ), nClr3dS ) ... METHOD DrawLine( xRow ) CLASS TSBrowse ... For nI := nBegin To nLastCol ... nAlign := If( ValType( nAlign ) == "B", Eval( nAlign, nJ, Self ), nAlign ) ... hBitMap := If( ValType( uBmpCell ) == "B", Eval( uBmpCell, nJ, Self ), uBmpCell ) ... nClr3dL := If( ValType( nClr3dL ) == "B", Eval( nClr3dL, ::nAt, nJ, Self ), nClr3dL ) nClr3dS := If( ValType( nClr3dS ) == "B", Eval( nClr3dS, ::nAt, nJ, Self ), nClr3dS ) ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... For nI := nBegin To nLastCol ... nAlign := If( ValType( nAlign ) == "B", Eval( nAlign, nJ, Self ), nAlign ) ... hBitMap := If( ValType( uBmpCell ) == "B", Eval( uBmpCell, nJ, Self ), uBmpCell ) ... nClr3dL := If( ValType( nClr3dL ) == "B", Eval( nClr3dL, ::nAt, nJ, Self ), nClr3dL ) nClr3dS := If( ValType( nClr3dS ) == "B", Eval( nClr3dS, ::nAt, nJ, Self ), nClr3dS ) ... [/pre2]

gfilatov2002: SergKis пишет: Можно добавть эти модификации Если очень нужно, то, конечно, сделаю...

SergKis: gfilatov2002 пишет:Если очень нужно, то, конечно, сделаю... Дело в том, что при вызове блока кода без nJ, Sel не понятно, какая колонка прорисовывается и использование PUBLIC oBrw переменной в нем не самый лучший стиль программирования. Например cFooting := If( Valtype( oColumn:cFooting ) == "B", Eval( oColumn:cFooting, nJ, Self ), oColumn:cFooting ) без nJ требует от блока кода указания в какой колонке он используется, а если добавить колонку перед - придется править все правые блоки указывая новую позицию и это справедливо для всех указанных выше строк

SergKis: PS. без nJ к oCol:cName не прицепиться

gfilatov2002: SergKis пишет: без nJ к oCol:cName не прицепиться Уже сделал эти исправления

SergKis: gfilatov2002 Отлично. А что на счет поста N 801 с предыдущего листа

gfilatov2002: SergKis пишет: что на счет поста N 801 Благодарю за напоминание Пропустил эти исправления Сейчас буду проверять и затем использовать

SergKis: gfilatov2002 Еще предложение, добавить в CLASS TSColumn переменную DATA lValToCharEmpty AS LOGICAL INIT .F. // при .T. показывать пустую строку для пустых значений типа D,N,T,L после cValToChar(...) вместо 0, 0.00, / / , ... добавив небольшой код (bold-ом) [pre2] METHOD DrawLine( xRow ) CLASS TSBrowse ... //V90 If lCheck Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 )} hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ElseIf oColumn:lValToCharEmpty .and. empty(uData) uData := "" EndIf //end ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... If lCheck //V90 Default ::aCheck := { StockBmp( 6 ), StockBmp( 7 ) } hBitMap := ::aCheck[ If( Upper( uData ) == "T", 1, 2 ) ] nAlign := nMakeLong( DT_CENTER, DT_CENTER ) uData := "" ElseIf oColumn:lValToCharEmpty .and. empty(uData) uData := "" EndIf //end ... [/pre2]

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

Haz: Григорий , еще правочка . В одном месте в блок bPrevEdit не передается обект. Остальные вызовы по коду OK [pre2] METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... ... If ::aColumns[ nCol ]:bPrevEdit != Nil If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) // append mode for arrays Else // GF 16-05-2008 uVal := Eval( ::aColumns[ nCol ]:bData ) uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self ) If ValType( uVal ) == "L" .and. ! uVal Return 0 EndIf EndIf EndIf [/pre2]

gfilatov2002: Haz пишет: еще правочка Благодарю за помощь! Поправил...

SergKis: Haz пишет:uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self ) Не знаю насколько это важно, но у себя я добавил еще параметр Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self, .T. ) // .T. - вызов из ::Edit(...) метода uVal := Eval( ::aColumns[ nCol ]:bPrevEdit, uVal, Self .F. ) // .F. - вызов из ::KeyDown(...) метода

Andrey: Григорий, а можно в ядро библиотеки поставить 2 классные функции SergKis ? GetClientWidth() и GetClientHeight() Они прекрасно выдают правильные размеры объектов и пользоваться удобно. Пример: #include "minigui.ch" Function MAIN() Local nMaxWidth, nMaxHeight nMaxWidth := GetClientWidth(0) nMaxHeight := GetClientHeight(0) DEFINE WINDOW Form_1 AT 0,0 WIDTH nMaxWidth HEIGHT nMaxHeight ; TITLE 'Test MAX desktop' ; MAIN END WINDOW Form_1.Center Form_1.Activate Return Nil /////////////////////////////////////////////////////////////////////////////////////////// // SergKis http://clipper.borda.ru // // GETCLIENTHEIGHT(0) - высота клиентской (внутренней) области Desktop с учетом наличия строки Start // GETCLIENTWIDTH(0) - ширина клиентской (внутренней) области Desktop // GETCLIENTHEIGHT(hWnd) - высота клиентской (внутренней) области окна (или контрола) // GETCLIENTWIDTH(hWnd) - ширина клиентской (внутренней) области окна (или контрола) // т.е.: // hWnd := GetFormHandle('Form_1') // MsgDebug( GetClientWidth(hWnd), GetClientHeight(hWnd) ) #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" // BAA HB_FUNC( GETCLIENTWIDTH ) { RECT rect; LONG hWnd=hb_parnl(1); // SPI_GETWORKAREA == 0x0030 if(hWnd==0) SystemParametersInfo( 0x0030, 0, &rect, 0); else GetClientRect( ( HWND ) hWnd, &rect ); hb_retni( ( INT ) rect.right - rect.left ); } // BAA HB_FUNC( GETCLIENTHEIGHT ) { RECT rect; LONG hWnd=hb_parnl(1); // SPI_GETWORKAREA == 0x0030 if(hWnd==0) SystemParametersInfo( 0x0030, 0, &rect, 0); else GetClientRect( ( HWND ) hWnd, &rect ); hb_retni( ( INT ) rect.bottom - rect.top ); } #pragma ENDDUMP

Dima: Andrey Да функций много хороших и полезных с WINAPI , но вырастет ядро. Вот что Григорий ответил на похожее предложение НО более глобальное цитата: все WINAPI функции ... прикрутить к основной библиотеке. Этот подход сейчас используется в официальной сборке HMG. И он привел к тому, что размер экзешника простого примера составляет свыше 3,5 MБ. Подобный пример, собранный с помощью минигуи с компилятором MinGW, будет иметь размер около 2.2 MБ. Поэтому сохранение компактного ядра библиотеки рассматривается как приоритетная задача в Минигуи. А использование дополнительных функций из примеров рекомендуется только в случае необходимости. Поэтому и ответ на Ваше предложение - отрицательный ЗЫ Проще самостоятельно затолкать все нужное в свою отдельную либу.

SergKis: gfilatov2002 Предложение немного поменять стоки местами:[pre2] METHOD EditExit(...) ... Line: 4045 ::lAppendMode := oCol:oEdit:lAppend oCol:oEdit:Move( 1500,0 ) oCol:oEdit:End() // oCol:oEdit := Nil было ::PostEdit( uValue, nCol, bValid ) oCol:oEdit := Nil ::oWnd:bValid := ::oGet cMsg := If( ! Empty( oCol:cMsg ), oCol:cMsg, ::cMsg ) cMsg := If( Valtype( cMsg ) == "B", Eval( cMsg, Self, ::nCell ), cMsg ) ::SetMsg( cMsg ) Return Nil ... Line: 4091 oCol:oEdit:End() // oCol:oEdit := Nil было ::oWnd:bValid := ::oGet ::PostEdit( uValue, nCol, bValid ) oCol:oEdit := Nil cMsg := If( ! Empty( oCol:cMsg ), oCol:cMsg, ::cMsg ) cMsg := If( Valtype( cMsg ) == "B", Eval( cMsg, Self, ::nCell ), cMsg ) ::SetMsg( cMsg ) ... [/pre2] Тогда в bValid из oCol:oEdit координаты ячейки видны нормальным образом (сейчас нет)

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



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