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

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

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

Ответов - 80, стр: 1 2 3 4 All

gfilatov2002: SergKis пишет: тогда в FUNC Do_OnCtlRelease( i, p ) можно убрать Благодарю снова за это важное исправление! Теперь модальные окна работают нормально с ООП, но вернулась проблема с очисткой переменной ::oName после закрытия любого дочернего окна. Возможно, надо убрать эти строки ::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy() , Nil ), ; ::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy() , Nil ), ; также из класса TWndData

SergKis: gfilatov2002 Был не прав применив CLASSDATA, т.к. хотел другого. Поправил [pre2] CLASS TWndData ... VAR oProp AS OBJECT VAR oName AS OBJECT VAR oHand AS OBJECT ... METHOD Def( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ... ::oEvent := oKeyData( Self ), ::oUserKeys := oKeyData(), ; ::oName := oKeyData(), ::oHand := oKeyData(), ; ::oProp := oKeyData(), ; hmg_SetWindowObject( ::nHandle, Self ), ; ... CLASS TCnlData INHERIT TWndData ... METHOD Set() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Set( ::cName , Self ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Set( ::nHandle, Self ), ) ) METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Del( ::cName ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Del( ::nHandle ), ) ) METHOD Get( xName ) INLINE iif( HB_ISCHAR( xName ), ::oWin:oName:Get( xName ), ; ::oWin:oHand:Get( xName ) ) METHOD GetListType() INLINE ::oWin:GetListType() METHOD GetObj4Type( cType, lEque ) INLINE ::oWin:GetObj4Type( cType, lEque ) METHOD GetObj4Name( cName ) INLINE ::oWin:GetObj4Name( cName ) METHOD SetProp( xKey, xVal ) INLINE ::oWin:oProp:Set( xKey, xVal ) METHOD GetProp( xKey ) INLINE ::oWin:oProp:Get( xKey ) METHOD DelProp( xKey ) INLINE ::oWin:oProp:Del( xKey ) ... METHOD Destroy() INLINE ( ::Del(), ; ... ::oUserKeys := iif( HB_ISOBJECT( ::oUserKeys ), ::oUserKeys:Destroy() , Nil ), ; ::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy() , Nil ), ; ::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy() , Nil ), ; ::nParent := ::nIndex := ::cName := ::cType := ::cVar := ::cChr := Nil, ; ... Перенес изменения из Вашей hmg в свою lib. В пример с :UaerKeys добавил ITEM 'Item main menu 1.8' ACTION This_Msg( oWnd:GetListType(), 'ALL TYPE' ) NAME M_1_8 IMAGE 'n8' ITEM 'Item main menu 1.9' ACTION Modal_Click() NAME M_1_9 IMAGE 'n9' SEPARATOR ... @ nY, nX BUTTONEX FRM_3 PICTURE 'n3' CAPTION "" ; ACTION ( oWnd:UserKeys( This.Name ), ; This_Msg( (This.Object):GetListType(), 'ALL TYPE' ), ; oBrw1:SetFocus() ) ; WIDTH 50 HEIGHT 50 ; ... *-----------------------------------------------------------------------------* Procedure Modal_CLick *-----------------------------------------------------------------------------* DEFINE WINDOW Form_2 ; AT 0,0 ; WIDTH 430 HEIGHT 400 ; TITLE 'Modal Window ' ; MODAL ; NOSIZE ; FONT 'Arial' ; SIZE 10 ; @ 15,10 LABEL Label_1 ; VALUE 'F1' AUTOSIZE @ 45,10 LABEL Label_2 ; VALUE 'F2' AUTOSIZE @ 80,10 BUTTON Button_0 CAPTION 'All Type' ; ACTION MsgDebug( (This.Object):GetListType(), 'ALL TYPE' ) END WINDOW Form_2.Center Form_2.Activate Return Работает как надо. Пробовал пересобрать Вашу сборку ... не сошлось что то. [/pre2]

gfilatov2002: SergKis пишет: Работает как надо. Подтверждаю, что после этих исправлений все работает нормально SergKis пишет: Пробовал пересобрать Вашу сборку Выложил очередную бетку с учетом Ваших изменений по старому адресу. Благодарю за оперативную помощь

SergKis: gfilatov2002 Такой пример получился с исп. MESSAGEONLY ... [pre2] /* * Harbour MiniGUI Demo * (c) 2017 */ #include "minigui.ch" #include "hbclass.ch" #define _METHOD METHOD MEMVAR oApp, oMain, oWnd /////////////////////////////////////////////////////////////////////////// FUNCTION Main( ... ) LOCAL cTx, nY := 10, nX := 10 SET OOP ON PUBL oApp := oAppData( "DataBase", "MyProg", 100 ) IF oApp:Error MsgStop( "Application events not create !", "ERROR" ) QUIT ENDIF WITH OBJECT oApp :Event( 1, {|oa,ky| cTx := '', AEval({ oa:Desktop, ; oa:MyDocuments, ; oa:ProgramFiles, ; oa:System, ; oa:Windows, ; oa:Temp }, ; {|ct,ni| cTx += hb_ntos(ni)+'. '+ct+CRLF }), ; MsgBox(cTx, "System path. Event="+hb_ntos(ky)) } ) :Event( 2, {|oa,ky| cTx := '', AEval({ oa:Exe, ; oa:ExePath, ; oa:ExeName, ; oa:ExeIni, ; oa:ExeCfg }, ; {|ct,ni| cTx += hb_ntos(ni)+'. '+ct+CRLF }), ; MsgBox(cTx, "Exe property. Event="+hb_ntos(ky)) } ) :Event( 3, {|oa,ky| cTx := '', AEval({ oa:Name, ; oa:CurDir, ; oa:CurIni, ; oa:CurCfg }, ; {|ct,ni| cTx += hb_ntos(ni)+'. '+ct+CRLF }), ; MsgBox(cTx, "Current property. Event="+hb_ntos(ky)) } ) :Event( 4, {|oa,ky| cTx := '', AEval({ oa:Name, ; oa:Path, ; oa:PathIni, ; oa:PathCfg }, ; {|ct,ni| cTx += hb_ntos(ni)+'. '+ct+CRLF }), ; MsgBox(cTx, "Path property. Event="+hb_ntos(ky)) } ) END WITH DEFINE WINDOW Win_1 ; CLIENTAREA 400, 400 ; TITLE 'Demo App objects. ' ; MAIN PRIV oWnd := ThisWindow.Object PUBL oMain := oWnd DEFINE BUTTONEX Button1 ROW nY COL nX CAPTION "Event 1" ACTION oApp:Event(1) TOOLTIP "System path. Event=1" END BUTTONEX nY += This.Button1.Height + 10 DEFINE BUTTONEX Button2 ROW nY COL nX CAPTION "Event 2" ACTION oApp:Event(2) TOOLTIP "Exe property. Event=2" END BUTTONEX nY += This.Button2.Height + 10 DEFINE BUTTONEX Button3 ROW nY COL nX CAPTION "Event 3" ACTION oApp:Event(3) TOOLTIP "Current property. Event=3" END BUTTONEX nY += This.Button3.Height + 10 DEFINE BUTTONEX Button4 ROW nY COL nX CAPTION "Event 4" ACTION oApp:Event(4) TOOLTIP "Path property. Event=4" END BUTTONEX nY += This.Button4.Height + 10 DEFINE BUTTONEX Button5 ROW nY COL nX CAPTION "PostMsg 1" ACTION oApp:SendMsg(1) END BUTTONEX nY += This.Button5.Height + 10 DEFINE BUTTONEX Button6 ROW nY COL nX CAPTION "PostMsg 2" ACTION oApp:SendMsg(2) END BUTTONEX nY += This.Button6.Height + 10 DEFINE BUTTONEX Button7 ROW nY COL nX CAPTION "PostMsg 3" ACTION oApp:SendMsg(3) END BUTTONEX nY += This.Button7.Height + 10 DEFINE BUTTONEX Button8 ROW nY COL nX CAPTION "PostMsg 4" ACTION oApp:PostMsg(4) END BUTTONEX END WINDOW Win_1.Center Win_1.Activate oApp:Destroy() RETURN Nil /////////////////////////////////////////////////////////////////////////////// CLASS TAppData /////////////////////////////////////////////////////////////////////////////// PROTECTED: VAR cExe INIT hb_ProgName() VAR cName INIT hb_FNameName( hb_ProgName() ) VAR nApp INIT 100 VAR hWnd INIT 0 VAR lErr INIT .F. VAR oEvent AS OBJECT EXPORTED: VAR cPath INIT '' VAR oCargo AS OBJECT METHOD New( nApp ) INLINE ( ::nApp := iif( HB_ISNUMERIC(nApp), nApp, ::nApp ), ; Self ) CONSTRUCTOR METHOD Def( cPath, cName ) INLINE ( ::Name := cName, ::Path := cPath, ; ::oEvent := oKeyData(Self), ::oCargo := oKeyData(), Self ) ASSIGN Handle( hWnd ) INLINE ( ::hWnd := hWnd, ::lErr := Empty(hWnd) ) ACCESS Error INLINE ::lErr ACCESS WmApp INLINE ( WM_USER + 100 ) ACCESS Name INLINE ::cName ASSIGN Name( cName ) INLINE ( cName := iif( HB_ISCHAR(cName), cName, ::cName ), ; ::cName := iif( Empty(cName), ::cName , cName ) ) ACCESS Desktop INLINE GetDesktopFolder() + hb_ps() ACCESS MyDocuments INLINE GetMyDocumentsFolder() + hb_ps() ACCESS ProgramFiles INLINE GetProgramFilesFolder() + hb_ps() ACCESS System INLINE GetSystemFolder() + hb_ps() ACCESS Temp INLINE GetTempFolder() + hb_ps() ACCESS Windows INLINE GetWindowsFolder() + hb_ps() ACCESS Exe INLINE ::cExe ACCESS ExePath INLINE hb_FNameDir ( ::cExe ) ACCESS ExeName INLINE hb_FNameName( ::cExe ) ACCESS ExeIni INLINE ::ExePath + ::ExeName + ".ini" ACCESS ExeCfg INLINE ::ExePath + ::ExeName + ".cfg" ACCESS CurDir INLINE hb_DirBase() ACCESS CurIni INLINE ::CurDir + ::cName + ".ini" ACCESS CurCfg INLINE ::CurDir + ::cName + ".cfg" ACCESS Path INLINE ::cPath ASSIGN Path( cPath ) INLINE ( cPath := iif( HB_ISCHAR(cPath) , cPath, ::cName ), ; cPath := iif( Empty(cPath), ::cName, cPath ), ; cPath := iif( hb_ps() $ cPath, cPath, ::CurDir + cPath ), ; ::cPath := cPath + iif( right(cPath, 1) == hb_ps(), "", hb_ps() ) ) ACCESS PathIni INLINE ::cPath + ::cName + ".ini" ACCESS PathCfg INLINE ::cPath + ::cName + ".cfg" ACCESS DesktopWidth INLINE GetDesktopWidth () ACCESS DesktopHeight INLINE GetDesktopHeight() - GetTaskBarHeight() METHOD Create() INLINE _App_Wnd_Events_( Self ) METHOD Event ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ; ::oEvent:Set( Key, Block ), ; ::oEvent:Do ( Key, Block, p2, p3 ) ) METHOD PostMsg( nKey, nPar ) INLINE PostMessage( ::hWnd, ::WmApp, nKey, hb_defaultValue( nPar, 0 ) ) METHOD SendMsg( nKey, nPar ) INLINE SendMessage( ::hWnd, ::WmApp, nKey, hb_defaultValue( nPar, 0 ) ) METHOD Destroy() INLINE ( ::Cargo := Nil, ; ::oCargo := iif( HB_ISOBJECT( ::oCargo ), ::oCargo:Destroy(), Nil ), ; ::oEvent := iif( HB_ISOBJECT( ::oEvent ), ::oEvent:Destroy(), Nil ) ) #ifndef __XHARBOUR__ DESTRUCTOR DestroyObject() #endif ENDCLASS /////////////////////////////////////////////////////////////////////////////// #ifndef __XHARBOUR__ METHOD PROCEDURE DestroyObject() CLASS TAppData ::Destroy() RETURN #endif *-----------------------------------------------------------------------------* FUNCTION oAppData( cPathBase, cName, nApp ) *-----------------------------------------------------------------------------* LOCAL o := TAppData():New( nApp ):Def( cPathBase, cName ) o:Create() RETURN o *-----------------------------------------------------------------------------* FUNC _App_Wnd_Events_( hWnd, nMsg, wParam, lParam ) *-----------------------------------------------------------------------------* LOCAL h, r := 0 STATIC o_app If HB_ISOBJECT( hWnd ) MESSAGEONLY _App_Wnd_App_ EVENTS _App_Wnd_Events_ TO h o_app := hWnd o_app:Handle := h RETURN r ElseIf ! HB_ISOBJECT( o_app ) RETURN r EndIf IF nMsg == o_app:WmApp o_app:Event(wParam, lParam) r := 1 ENDIF RETURN r [/pre2]

SergKis: PS пропустил ошибку ACCESS WmApp INLINE ( WM_USER + 100 ) надо ACCESS WmApp INLINE ( WM_USER + ::nApp )

gfilatov2002: SergKis пишет: пример получился Благодарю за хороший пример для новой сборки

gfilatov2002: Подготовил первый RC для новой сборки 17.07 со следующим списком изменений [pre2] * New: Added the OOP classes for managing of the Minigui windows and controls as objects. It is an experimental feature which is guarded by the constant _OBJECT_ in the core and it's disabled by default. If you wish to try the OOP classes, you should add the following command on top in your main module: SET OOP [SUPPORT] ON ********************************************************** A new property called 'Object' was added to manipulate the objects. You can get this property at runtime: - function syntax: GetProperty ( Form, 'Object' ) --> oFormObject GetProperty ( Form, Control, 'Object' ) --> oControlObject - pseudo-OOP syntax: Form.Object --> oFormObject Form.Control.Object --> oControlObject Common syntax: Control_obj := This.Object, Form_obj := This.Object Windows only syntax: Form_obj := ThisWindow.Object Suggested and contributed by Sergej Kiselev. Revised by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\Tsb_UserKeysEvent) * Modified: ActiveX property 'Object' was renamed to 'XObject' for compatibility with the last Minigui changes. Note: This is an INCOMPATIBLE change. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demos in folder \samples\Basic\ActiveX) * New: Added the actual HBMK2 make scripts for building of the minigui and tsbrowse libraries. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see BuildLib.bat and *.hbp in folders \Source and \Source\TSBrowse) * Modified: The constant WIN32_LEAN_AND_MEAN for compiling of Minigui C-code was moved from a link script to the header file mgdefs.h. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Dll library source code (see in folder \Source\Dll): - updated for compatibility with the last Minigui changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.20.0dev (from 3.19.3). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-06-27 12:37). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'Using of App objects' sample. Contributed by SergKis (see in folder \samples\Advanced\APP_OBJECTS) * New: 'Harbour DataBases management as objects' samples: - opens the multiple browses of same data file in MDI-child windows; - MDI Browse with the fields from a related file; - how to create an index of a database with a progress meter; - how to build add, edit, delete and browse right into the customer object in MDI-child window. Inspired by the TTable class from the xHb contrib library. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\TDatabase) * New: 'Tray Countdown' sample. Based upon a C-code borrowed from OOHG. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\TrayCountdown) * Updated: 'Blinking Label' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\BLINK) * Updated: 'Print Pie Graph' sample: updated the data for June 2017. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Framework for SDI application' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\FrameWork) * Updated: 'Image List' sample by Janusz Pora. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ImageList) * Updated: 'Memory Info' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\MemInfo) * Updated: 'Sumatra PDF Viewer' utility: minor bugs fixed. Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\PdfView) [/pre2] Благодарю за оперативную помощь в подготовке этой сборки SergKis

SergKis: gfilatov2002 В класс TCnlData добавил METHOD SetSize( y, x, w, h ) INLINE _SetControlSizePos( ::cName, ::oWin:cName, y, x, w, h )

gfilatov2002: SergKis пишет: В класс TCnlData добавил Благодарю за помощь Добавил этот метод также...

SergKis: gfilatov2002 У себя сделал такие штуки (на Ваше усмотрение) [pre2] CLASS TWndData ... VAR cChr INIT ',' VAR nReBarHeight INIT 0 VAR oStatusBar AS OBJECT VAR oProp AS OBJECT ... ACCESS ClientHeight INLINE _GetClientRect ( ::nHandle )[ 4 ] - ::nReBarHeight - ::StbHeight() ... ASSIGN Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) ACCESS Stb INLINE ::oStatusBar METHOD StbSay ( cText, nItem ) INLINE iif( Empty(::oStatusBar), , ::oStatusBar:Say (cText, nItem ) ) METHOD StbIcon ( cIcon, nItem ) INLINE iif( Empty(::oStatusBar), , ::oStatusBar:Icon (cIcon, nItem ) ) METHOD StbAction( nItem, bBlock ) INLINE iif( Empty(::oStatusBar), , ::oStatusBar:Action(nItem, bBlock) ) METHOD StbWidth ( nItem, nWidth ) INLINE iif( Empty(::oStatusBar), , ::oStatusBar:Width (nItem, nWidth) ) METHOD StbHeight() INLINE iif( Empty(::oStatusBar), 0, ::oStatusBar:Height ) ACCESS ReBarHeight INLINE ::nReBarHeight ASSIGN ReBarHeight( h ) INLINE ::nReBarHeight := iif( HB_ISNUMERIC(h), h, 0 ) ACCESS IsWindow INLINE .T. ... METHOD Destroy() INLINE ( ::oStatusBar := ::nReBarHeight := Nil, ; ... CLASS TCnlData INHERIT TWndData ... ACCESS ClientHeight INLINE _GetClientRect( ::nHandle )[ 4 ] ... /////////////////////////////////////////////////////////////////////////////// CLASS TStbData INHERIT TCnlData /////////////////////////////////////////////////////////////////////////////// EXPORTED: METHOD New( oWnd ) INLINE ( ::Super:New( oWnd ), ::oWin:oStatusBar := iif( Empty(::oWin:oStatusBar), ; Self, ::oWin:oStatusBar ), Self ) CONSTRUCTOR METHOD Def( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::Super:Def( nIndex, cName, nHandle, nParent, cType, cVar ), ; ::Set(), hmg_SetWindowObject( ::nHandle, Self ), ; Self ) METHOD Say ( cText , nItem ) INLINE _SetItem( ::cName, ::oWin:cName, hb_defaultValue( nItem, 1 ), ; hb_defaultValue( cText, '' ) ) METHOD Icon ( cIcon , nItem ) INLINE SetStatusItemIcon( ::nHanle, hb_defaultValue( nItem, 1 ), cIcon ) METHOD Width ( nItem, nWidth ) INLINE iif( HB_ISNUMERIC(nWidth) .and. nWidth > 0, ; _SetStatusItemWidth( hb_defaultValue( nItem, 1 ), nWidth, ::oWin:nHandle ), ; _GetStatusItemWidth( ::oWin:nHandle, hb_defaultValue( nItem, 1 ) ) ) METHOD Action( nItem, bBlock ) INLINE _SetStatusItemAction( hb_defaultValue( nItem, 1 ), bBock, ; ::oWin:nHandle ) ENDCLASS ... FUNCTION oCnlData( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) ... IF cType == 'TBROWSE' ob := _HMG_aControlIds[ nIndex ] o := TTsbData():New( oWin, ob ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ELSEIF cType == 'MESSAGEBAR' o := TStbData():New( oWin ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ELSE o := TCnlData():New( oWin ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ENDIF ... h_windows.prg ... *-----------------------------------------------------------------------------* Function _EndSplitBox () *-----------------------------------------------------------------------------* Local i If _HMG_lOOPEnabled i := GetFormIndex ( iif( _HMG_BeginWindowMDIActive, _HMG_MainClientMDIName, _HMG_ActiveFormName ) ) If hmg_IsWindowObject ( _HMG_aFormHandles [ i ] ) hmg_GetWindowObject( _HMG_aFormHandles [ i ] ):ReBarHeight := GetWindowHeight( _HMG_aFormReBarHandle [ i ] ) EndIf EndIf _HMG_SplitLastControl := 'TOOLBAR' _HMG_ActiveSplitBox := .f. Return Nil ... [/pre2]

Alex_Cher: SergKis пишет: У себя сделал такие штуки Мужики, вы конечно классные профи в своем деле и я рад за вас и дай вам бог здоровья, но подскажите рядовому программеру как все это можно реально использовать в своей работе, где об этом можно почитать, ну пусть даже по англицки (лично я читаю по англицки только через гугол). Только не посылаете меня к примерам ... там до все нюансов все равно не докопаться ... .... может я и не прав, но тогда к чему все эти ваши терки.

SergKis: Alex_Cher пишет как все это можно реально использовать в своей работе Какой момент вас интересует ? Если последний со StatusBar и ClientHeight, то исп. так [pre2] DEFINE WINDOW &cWnd AT 0,0 WIDTH 650 + nWdt HEIGHT 500 ; ... PUBL oMain := ThisWindow.Object PRIV oWnd := oMain, oBrw1 ... DEFINE STATUSBAR STATUSITEM '' STATUSITEM '' WIDTH 300 END STATUSBAR // вместо This.StatusBar.Item(2) := "Right click ( TBrowse ) for context menu" // можно писать так oWnd:StbSay("Right click ( TBrowse ) for context menu", 2) // или oMain:StbSay("Right click ( TBrowse ) for context menu", 2) DEFINE SPLITBOX HANDLE hSplit DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 16,16 FLAT ... END TOOLBAR END SPLITBOX ... // вместо таких строк nY := GetWindowHeight(hSplit) nX := 10 nW := This.ClientWidth - nX * 2 - nWdt nH := This.ClientHeight - GetWindowHeight( This.StatusBar.Handle ) - nY - 1 // можно писать nY := oWnd:ReBarHeight nX := 10 nW := This.ClientWidth - nX * 2 - nWdt nH := oWnd:ClientHeight ... Если вопрос про события, то написав, к примеру к контролу cNam := 'ID' @ nY, nX LABEL &cNam VALUE '' WIDTH nLen HEIGHT oBrw1:nHeightCell CENTERALIGN WITH OBJECT oWnd:GetObj(cNam) :Cargo := 0 :Event( 1, {|oc,kd,id| kd := Eval( oBrw1:GetColumn('KODS'):bData ), ; // Get id := Eval( oBrw1:GetColumn('ID'):bData ), ; oc:Value := alltrim(cValToChar(id))+"-<"+ ; alltrim(cValToChar(kd))+">" } ) :Event( 2, {|oc | oc:Window:oCargo:Set(oc:Name, oc:Value) } ) // Put :Window:oCargo:Set(cNam, :Value ) // init value to oCargo END WITH вы собрали в одном месте механизмы заполнения значения ( Event(1) ) и сохранения в базе этого значения (Event(2)). Теперь, не важно на каком окне находится контрол, мы работаем с ним через очередь, посылая сообщения // заполнить value контрола oWnd:GetObj("ID"):PostMsg(1) // без ожидания oWnd:GetObj("ID"):SendMsg(1) // с ожиданием завершения // сохранить value контрола где то oWnd:GetObj("ID"):PostMsg(2) // без ожидания oWnd:GetObj("ID"):SendMsg(2) // с ожиданием завершения т.к. контролов много, можно собрать в пакет такие сообщения и зарегестрировать на окно как события WITH OBJECT oWnd // ---- Window events :Event( 1, {|ow| AEval( ow:GetObj4Type('LABEL,GETBOX'), {|oc| oc:SendMsg(1) }) } ) // Get :Event( 2, {|ow| AEval( ow:GetObj4Type('LABEL,GETBOX'), {|oc| oc:SendMsg(2) }) } ) // Put // ... END WITH // ---- Window events т.е. послав окну сообщение oWnd:PostMsg(1) или oWnd:SendMsg(1) выполнятся события Event(1) для всех LABEL+GETBOX окна. По кнопке OK можно сделать oWnd:PostMsg(2) или oWnd:SendMsg(2) сохранить данные контролов где то. На события можно повесить расчеты\формы\отправки писем ... Т.е. ваша прогр. начинает работать (как и система) через сообщения [/pre2]

SergKis: PS Посылать сообщения можно через псевдо ООП // заполнить value контрола (This.ID.Object):PostMsg(1) // без ожидания (This.ID.Object):SendMsg(1) // с ожиданием завершения // сохранить value контрола где то (This.ID.Object):PostMsg(2) // без ожидания (This.ID.Object):SendMsg(2) // с ожиданием завершения для окна (ThisWindow.Object):PostMsg(1) (ThisWindow.Object):PostMsg(2)

gfilatov2002: SergKis пишет: Какой момент вас интересует ? Благодарю за Ваши пояснения, которые очень полезны. Но возникают и другие вопросы: - почему Statusbar м Splitbox выделяются для присвоения им свойств на уровне класса TWndData Ведь эти элементы управления имеют свои собственные объекты, которые были созданы при их определении в функциях _BeginMessageBar(), _DefineItemMessage() и _DefineSplitChildWindow(). И, соответственно, эти объекты имеют требуемую информацию о размерах этих контролов и т.п. т.е. вместо присвоения oWnd:StbSay("Right click ( TBrowse ) for context menu", 2) д.б., например, так oWnd:oStb:Say("Right click ( TBrowse ) for context menu", 2) Или я что-то путаю

gfilatov2002: Alex_Cher пишет: .... может я и не прав Прав, конечно Alex_Cher пишет: где об этом можно почитать Документация Харбора - doc\xhb-diff.txt -doc\en\command.txt [pre2] $DESCRIPTION$ CLASS creates a class from which you can create objects. The CLASS command begins the class specification, in which the VAR elements (also known as instance variables) and METHODS of the class are named. The following scoping commands may also appear. They control the default scope of VAR and METHOD commands that follow them. <fixed> EXPORTED: VISIBLE: HIDDEN: PROTECTED: </fixed> The class specification ends with the END CLASS command. Classes can inherit from multiple <SuperClasses>, and the chain of inheritance can extend to many levels. A program uses a Class by calling the Class Constructor, usually the New() method, to create an object. That object is usually assigned to a variable, which is used to access the VAR elements and methods. Harbour's OOP syntax and implementation supports Scoping (Protect, Hidden and Readonly) and Delegating, and is largely compatible with Class(y)(tm), TopClass(tm) and Visual Objects(tm). [/pre2]

SergKis: gfilatov2002 пишет Или я что-то путаю Все правильно Вы пишете , разница в том, что на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка, т.е. есть\нет StatusBar - все работает. Запись oWnd:Stb:Say... предполагает точное наличие StatusBar. Потому и написал "на Ваше усмотрение". SplitBox высота исп., только для расчета ClientHeight, т.е. ToolBar на SplitBox и StatusBar вычитаются из высоты клиентской области окна. Возможно, надо сделать переменные :nTop, ::nRight, ::nBottom, :nLeft и управлять ими, для клиентской области - общий случай для окна.

SergKis: Alex_Cher пишет: где об этом можно почитать Еще http://www.kresin.ru/hrbfaq_3.html#Doc3

SergKis: gfilatov2002 пишет Ведь эти элементы управления имеют свои собственные объекты #xcommand DEFINE SPLITBOX ; ..., т.е. FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted ) ... не создает объект (и реальных размеров SplitBoxа еще не будет, появятся только в #xcommand END SPLITBOX), потому менял FUNCTION _EndSplitBox ()

gfilatov2002: SergKis пишет: на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка Понятно, тогда просто м.б. использовать проверку на уровне окна :::IsStb := _IsControlDefined( "StatusBar", ::cName ) ) и далее использовать эту переменную для проверки наличия статуса у окна SergKis пишет: FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted ) ... не создает объект Все верно, но она помещает требуемый для расчета ClientHeight хэндл в элемент массива родительского окна _HMG_aFormReBarHandle [ i ] := ControlHandle который Вы можете использовать в классе окна как ::nReBarHandle := _HMG_aFormReBarHandle [ ::Index ] без необходимости изменять функцию _EndSplitBox ()

SergKis: gfilatov2002 пишет который Вы можете использовать в классе окна как ::nReBarHandle := _HMG_aFormReBarHandle [ ::Index ] В _EndToolBar() происходит ResizeSplitBoxItem ( _HMG_aFormReBarHandle , nBand - 1, aSize[1], aSize[2], aSize[1] ) только после этого имеем реальные его размеры. Т.е. после END TOOLBAR. без необходимости изменять функцию _EndSplitBox () Тогда выходим на уровень prg, как сейчас (для себя я убрал во внутрь), т.к. на mdi заготовки окон могут быть, mdi child (StatusBar на Main), так и Modal со своим StatusBar или без него, тогда на Main. и далее использовать эту переменную для проверки наличия статуса у окна :oStatusBar и есть такая переменная (_IsControlDefined(...) в классе повторяет вычисления индексов, стараюсь избегать это, псевдо ООП для этого), т.е. iif( Empty(:Stb), ..., ...) заменяет _IsControlDefined(...).

Andrey: SergKis - лучше напиши демонстрашку маленькую, тогда понятней будет для чего всё это затевается ! Только с комментариями на русском !

SergKis: Andrey пишет лучше напиши демонстрашку маленькую, тогда понятней будет для чего всё это затевается Вроде для чего и примеры, разъяснения все время даю. Выйдет версия посмотри примеры и перечитай написанное для начала. Затевается для работы с окнами\контролами через посылку сообщений, как дополнение к тому что есть в hmg.

gfilatov2002: SergKis пишет: CLASS TStbData INHERIT TCnlData Добавил предложенный класс в ядро библиотеки (с исправлением обнаруженных опечаток) и проверил его работу на простом примере: [pre2]#include "minigui.ch" MEMVAR oWnd Function Main LOCAL nY, nH SET OOP ON DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 800 HEIGHT 600 ; TITLE 'MiniGUI SplitBox Demo' ; MAIN ; FONT 'Arial' SIZE 10 PUBLIC oWnd := ThisWindow.Object DEFINE MAIN MENU POPUP '&File' ITEM 'Exit' ACTION Form_1.Release END POPUP POPUP '&Help' ITEM 'About' ACTION MsgInfo (MiniGUIVersion(), "MiniGUI Demo") END POPUP END MENU DEFINE SPLITBOX DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 85,85 FLAT BUTTON Button_1 CAPTION '&More ToolBars...' PICTURE 'button1.bmp' ACTION MsgInfo('Click! 1') TOOLTIP 'ONE' BUTTON Button_2 CAPTION '&Button 2' PICTURE 'button2.bmp' ACTION MsgInfo('Click! 2') TOOLTIP 'TWO' BUTTON Button_3 CAPTION 'Button &3' PICTURE 'button3.bmp' ACTION MsgInfo('Click! 3') TOOLTIP 'THREE' END TOOLBAR END SPLITBOX DEFINE STATUSBAR STATUSITEM 'HMG Power Ready' STATUSITEM '' END STATUSBAR WITH OBJECT oWnd:Stb :Icon("test.ico") :Say(MiniGUIVersion(), 2) :Width(2, 300) :Action(2, {|| MsgInfo('Status Item Click!')}) END WITH nY := GetWindowHeight( _HMG_aFormReBarHandle [ oWnd:Index ] ) nH := This.ClientHeight - GetWindowHeight( oWnd:Stb:Handle ) - nY @nY + 5, 10 LABEL lblClient VALUE "Client Height = " + hb_ntos( nH ) + " pixels" AUTOSIZE END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil [/pre2] Этот пример отработал нормально. Благодарю за помощь P.S. Еще, по-видимому, надо добавить обработчик ошибок в родительский класс TWndData: ERROR HANDLER OnError( uParam1 )

SergKis: gfilatov2002 пишет nY := GetWindowHeight( _HMG_aFormReBarHandle [ oWnd:Index ] ) Это возможный вариант, но красивее тогда как было DEFINE SPLITBOX HANDLE hSplit ... nY := GetWindowHeight(hSplit) По поводу ERROR HANDLE ... пока не задумывался, но, наверно, надо.

SergKis: gfilatov2002 пишет nH := This.ClientHeight - GetWindowHeight( oWnd:Stb:Handle ) - nY Можно так nH := This.ClientHeight - oWnd:Stb:Height - nY

gfilatov2002: SergKis пишет: красивее тогда как было SergKis пишет: Можно так Благодарю за помощь! Поправил, конечно...

SergKis: gfilatov2002 пишет PUBLIC oWnd := ThisWindow.Object Пожелания (названия переменных условны) - для Main окна делать PUBLiC oMain := ThisWindow.Object - для окна узел (имеет подчиненные окна) PUBLIC oForm := ThisWindow.Object - для текущего окна PRIVATE oWnd := ThisWindow.Object Тогда, все с текущего окна хорошо переносится на др. окна и в некоторых случаях, подменив на время ссылку на объект в oWnd, можно выполнить что то общее с др. окна, при наличии нескольких окон одновременно, легко окнам общаться сообщениями, oMain всегда доступно, т.е. для примера PUBL oMain := ThisWindow.Object PRIV oWnd := oMain

SergKis: PS PUBLIC oForm := ThisWindow.Object можно делать и PRIVATE ..., к примеру PRIV oDokum := ThisWindow.Object PRIV oKlient := ThisWindow.Object ...

gfilatov2002: SergKis пишет: для примера PUBL oMain := ThisWindow.Object PRIV oWnd := oMain Благодарю за пояснение! Поправил пример с учетом этой логики

SergKis: gfilatov2002 Предложение по GetBox, добавить события LDblClick и WM_KEYDOWN VK_F... Изменения [pre2] c_getbox.c LRESULT CALLBACK OwnGetProc( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ) ... line 424 return CallWindowProc( OldWndProc, hwnd, Msg, wParam, lParam ); case WM_LBUTTONDBLCLK : case WM_KEYDOWN: case WM_KEYUP: if( ! pSymbol ) ... h_getbox.prg FUNCTION OGETEVENTS( hWnd, nMsg, wParam, lParam ) ... ENDCASE CASE nMsg == WM_LBUTTONDBLCLK IF wParam == MK_LBUTTON RETURN oGet:DoKeyEvent( nMsg ) ENDIF CASE nMsg == WM_KEYDOWN ... // у себя объединил раздельные IF ... ENDIF IF ... ENDIF ... в одну конструкцию IF .. ELSEIF ... ENDIF , т.е. ... lShift := CheckBit( GetKeyState( VK_SHIFT ) , 32768 ) lCtrl := CheckBit( GetKeyState( VK_CONTROL ) , 32768 ) IF lCtrl .AND. wParam == VK_INSERT CopyToClipboard( oGet:Buffer ) RETURN( 0 ) ELSEIF lShift .AND. wParam == VK_INSERT SendMessage( hWnd , WM_PASTE , 0 , 0 ) RETURN( 0 ) ELSEIF wParam == VK_DOWN IF !lCtrl .AND. !lShift SendMessage( hWnd , EM_SETSEL , nEnd , nEnd ) IF ValType( oGet:cargo ) == "D" .AND. oGet:BadDate RETURN( 0 ) ELSE _GetBoxSetNextFocus( .F. ) RETURN( 0 ) ENDIF ELSE IF lCtrl .AND. lAllowEdit IF oGet:type == "D" .OR. oGet:type == "N" oGet:VarPut( oGet:VarGet() - 1 ) oGet:UpdateBuffer() _DispGetBoxText( hWnd, oGet:Buffer ) oGet:changed := .T. ENDIF IF oGet:type == "L" oGet:VarPut( !oGet:VarGet() ) oGet:UpdateBuffer() _DispGetBoxText( hWnd, oGet:Buffer ) oGet:changed := .T. ENDIF ENDIF ENDIF RETURN( 0 ) ELSEIF wParam == VK_UP IF !lCtrl .AND. !lShift SendMessage( hWnd , EM_SETSEL , nEnd , nEnd ) IF ValType( oGet:cargo ) == "D" .AND. oGet:BadDate RETURN( 0 ) ELSE _GetBoxSetNextFocus( .T. ) RETURN( 0 ) ENDIF ELSE IF lCtrl .AND. lAllowEdit IF oGet:type == "D" .OR. oGet:type == "N" oGet:VarPut( oGet:VarGet() + 1 ) oGet:UpdateBuffer() _DispGetBoxText( hWnd, oGet:Buffer ) oGet:changed := .T. ENDIF IF oGet:type == "L" oGet:VarPut( ! oGet:VarGet() ) oGet:UpdateBuffer() _DispGetBoxText( hWnd, oGet:Buffer ) oGet:changed := .T. ENDIF ENDIF ENDIF RETURN( 0 ) ELSEIF wParam == VK_LEFT SendMessage( hWnd , EM_SETSEL , nEnd - 1 , nEnd - 1 ) _HMG_aControlMiscData1 [ i ][1] := 0 oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_RIGHT SendMessage( hWnd , EM_SETSEL , nStart + 1 , nStart + 1 ) _HMG_aControlMiscData1 [ i ][1] := 0 oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_HOME SendMessage( hWnd , EM_SETSEL , 0 , 0 ) oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_END // Patch By Pier July 2008 // Add By Pier patch for the incorrect end position START IF HiWord( SendMessage( hWnd , EM_GETSEL , 0 , 0 ) ) < Len( Trim( oGet:Buffer ) ) SendMessage( hWnd , EM_SETSEL , Len( Trim( oGet:Buffer ) ) , Len( Trim( oGet:Buffer ) ) ) ELSE SendMessage( hWnd , EM_SETSEL , Len( oGet:Buffer ) , Len( oGet:Buffer ) ) ENDIF // Add By Pier patch for the incorrect end position STOP oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_INSERT lInsert := ! lInsert _SetGetBoxCaret( hWnd ) ELSEIF wParam == VK_DELETE IF readonly .OR. ! lAllowEdit .OR. oGet:type == "L" RETURN( 0 ) ENDIF nStart := LoWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 oGet:pos := nEnd IF nStart # nEnd IF nEnd > Len( oGet:buffer ) oGet:Delete() ENDIF FOR ipp := nStart TO nEnd IF oGet:pos > nStart IF oGet:type == "N" .AND. SubStr( oGet:buffer, oGet:pos, 1 ) $ "(-" oGet:minus := .F. ENDIF oGet:BackSpace() ELSE EXIT ENDIF NEXT ELSE IF _IsEditable( oGet:pos , i ) IF oGet:type == "N" .AND. SubStr( oGet:buffer, oGet:pos, 1 ) $ "(-" oGet:minus := .F. ENDIF oGet:Delete() ENDIF ENDIF oGet:Assign() _DispGetBoxText( hWnd, oGet:buffer ) SendMessage( hWnd, EM_SETSEL, oGet:pos - 1, oGet:pos - 1 ) RETURN( 0 ) ELSE oGet:DoKeyEvent( wParam ) ENDIF CASE nMsg == WM_PASTE ... tget.prg ... #include "hblang.ch" #include "i_winuser.ch" #include "i_keybd.ch" /* TODO: :posInBuffer( <nRow>, <nCol> ) --> nPos ... CLASS Get EXPORTED: ... DATA aKeyEvent INIT {} ... METHOD OverStrike( cChar ) METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) METHOD DoKeyEvent ( nKey ) PROTECTED: ... METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) CLASS Get LOCAL n, cKey cKey := hb_ntos( iif( HB_ISNUMERIC(nKey), nKey, WM_LBUTTONDBLCLK ) ) cKey += iif( empty(lCtrl ), '', '#' ) cKey += iif( empty(lShift), '', '^' ) cKey += iif( empty(lAlt ), '', '@' ) If ( n := AScan( ::aKeyEvent, {|a| a[1] == cKey } ) ) > 0 ::aKeyEvent[ n ] := bKey Else AAdd( ::aKeyEvent, { cKey, bKey } ) EndIf RETURN Nil METHOD DoKeyEvent( nKey ) CLASS Get LOCAL n, r := 0, cKey := hb_ntos( nKey ) If len( ::aKeyEvent ) > 0 cKey += iif( _GetKeyState( VK_CONTROL ), '#', '' ) cKey += iif( _GetKeyState( VK_SHIFT ), '^', '' ) cKey += iif( _GetKeyState( VK_MENU ), '@', '' ) If ( n := AScan( ::aKeyEvent, {|a| a[1] == cKey } ) ) > 0 If HB_ISBLoCK( ::aKeyEvent[ n ][2] ) EVal( ::aKeyEvent[ n ][2], Self ) r := 1 EndIf EndIf EndIf RETURN r ... SAMPLES\BASIC\GetBox demo.prg ... *----------------------------- Function MAIN() *----------------------------- LOCAL oGet SET CENTURY ON ... DEFINE WINDOW Form_1 ; ... DEFINE GETBOX Text_1 // Alternate Syntax ROW 10 COL 10 HEIGHT 20 VALUE DATE() PICTURE '@K' TOOLTIP "Date Value: Must be greater or equal to "+DTOC(DATE()) VALID {|| Compare(this.value)} VALIDMESSAGE "Must be greater or equal to "+DTOC(DATE()) MESSAGE "Date Value" BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}} END GETBOX oGet := _HMG_aControlHeadClick [ This.Text_1.Index ] oGet:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar(o:VarGet()), This.Name ) }) @ 40,10 GETBOX Text_2 ; HEIGHT 20; VALUE 57639 ; ACTION MsgInfo( "Button Action"); TOOLTIP {"Numeric input. RANGE -100,200000 PICTURE @Z 99,999.99","Button ToolTip"}; PICTURE '@Z 99,999.99'; RANGE -100,200000; BOLD; MESSAGE "Numeric input"; VALIDMESSAGE "Value between -100 and 200000 " ; BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ; FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}} oGet := _HMG_aControlHeadClick [ This.Text_2.Index ] oGet:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar(o:VarGet()), This.Name ) }) ... [/pre2]

SergKis: PS пока переносил потерял[pre2] METHOD DoKeyEvent( nKey ) CLASS Get ... If ( n := AScan( ::aKeyEvent, {|a| a[1] == cKey } ) ) > 0 If HB_ISBLoCK( ::aKeyEvent[ n ][2] ) EVal( ::aKeyEvent[ n ][2], Self, nKey, cKey ) r := 1 EndIf EndIf [/pre2]

SergKis: PS нашел у себя старую ошибку (замену не делал, потому и не натыкался) [pre2] METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) CLASS Get ... If ( n := AScan( ::aKeyEvent, {|a| a[1] == cKey } ) ) > 0 ::aKeyEvent[ n ] := { cKey, bKey } Else AAdd( ::aKeyEvent, { cKey, bKey } ) EndIf[/pre2]

Andrey: SergKis пишет: цитата: Это надо при работе с ячейками и lEdit := .T. gfilatov2002 пишет: Понятно, я уже добавил этот переключатель Т.е. можно делать так при настройке тсб : [pre2]oBrw:lNoKeyChar := .T. // отключить edit от нажатия клавиш цифр\букв [/pre2] В какой версии этот переключатель есть ?

gfilatov2002: Andrey пишет: В какой версии этот переключатель В новой, которая выйдет на следующей неделе

gfilatov2002: SergKis пишет: Предложение по GetBox Благодарю за Ваше предложение - все работает Также интересует добавить выделение текста GetBox при нажатии и удержании клавиши Shift вместе со стрелками влево/вправо

SergKis: gfilatov2002 пишет Также интересует добавить выделение текста GetBox при нажатии и удержании клавиши Shift вместе со стрелками влево/вправо Еще интересует LDblClick на GetBox в состоянии ReadOnly, но я пока плохо знаю систему get в hb3.2, надо изучать (в hb2.0 иначе) все работает Надо иметь ввиду, что в блоке кода (в предложении) НЕ создается среда _HMG_This... контрола, т.к. в классе GET нет переменной Index, связывать с _DoControlEventProcedure ( bBlock, i, ... ) я не стал, т.к. сам использую блоки кода для сообщений.

Andrey: Перешёл на версию 17.06 (Update 2) Выдаёт теперь ошибку: Error: Unresolved external '_HB_FUN__SETGETUSERDATA' referenced from W:\HB_PROJECT\4PRJ\ Error: Unresolved external '_HB_FUN__SETCONTROLACTION' referenced from W:\HB_PROJECT\4PRJ\ Как исправить ?

gfilatov2002: Andrey пишет: Как исправить ? _SetGetUserData (cObject, cForm, cObject) // Cargo эквивалентно SetProperty (cForm, cObject, 'Cargo', cObject)

Andrey: А эту функцию - _SETCONTROLACTION как исправить ? _SetControlAction(cObj, cForm, bBlock , 'ONLOSTFOCUS' ) И вот это как исправить _SetGetUserData(cObjDop, cForm, .F. ) ? Правильно или нет - SetProperty (cForm, cObjDop, 'Cargo', .F.) ?

SergKis: gfilatov2002 Добавка к классам [pre2] /////////////////////////////////////////////////////////////////////////////// CLASS TGetData INHERIT TCnlData /////////////////////////////////////////////////////////////////////////////// PROTECTED: VAR oGetBox AS OBJECT EXPORTED: METHOD New( oWnd, oGet ) INLINE ( ::Super:New( oWnd ), ::oGetBox := oGet, Self ) CONSTRUCTOR METHOD Def( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::Super:Def( nIndex, cName, nHandle, nParent, cType, cVar ), ; ::Set(), hmg_SetWindowObject( ::nHandle, Self ), ; Self ) ACCESS Caption INLINE ::oWin:cName + "." + ::cName ACCESS Get INLINE ::oGetBox METHOD Destroy() INLINE ::oGetBox := ::Super:Destroy() ENDCLASS FUNCTION oCnlData( nIndex, cName, nHandle, nParent, cType, cVar, oWin ) ... IF cType == 'TBROWSE' ob := _HMG_aControlIds[ nIndex ] o := TTsbData():New( oWin, ob ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ELSEIF cType == 'GETBOX' ob := _HMG_aControlHeadClick[ nIndex ] o := TGetData():New( oWin, ob ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ELSEIF cType == 'MESSAGEBAR' o := TStbData():New( oWin ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ELSE o := TCnlData():New( oWin ):Def( nIndex, cName, nHandle, nParent, cType, cVar ) ENDIF ... [/pre2] Использование oGet := (This.Get_1.Object):Get (This.Get_1.Object):Get:SetKeyEvent(VK_F5, {|og| ... }) (This.Get_1.Object):Get:SetKeyEvent('LDblClick', {|og| ... }) в ACTION (This.Object):Get:VarGet() (This.Object):Get:VarPut(...) ...

gfilatov2002: SergKis пишет: Добавка к классам Принимается с благодарностью Выложу обновленные исходники со всеми последними изменениями для Вашего ознакомления по старому адресу чуть позже P.S. Обновил - можете скачать для проверки

SergKis: gfilatov2002 пишет Обновил - можете скачать для проверки Добавил [pre2] Tsb_UserKeysEvent\demo.prg ... This.FRM_1.Cargo := ' Form <1> created !' cNam := 'Get_1' @ nY, nX+This.FRM_1.Width+2 GETBOX &cNam WIDTH 150 ; VALUE 'Test oGet:SetKeyEvent(...)' ; FONT 'Arial' SIZE 9 ; TOOLTIP 'Press F5 or LDblClick' ; BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ; FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}} (This.&(cNam).Object):Get:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) (This.&(cNam).Object):Get:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) nY += This.FRM_1.Height + nHgt ... GetBox\demo.prg ... oGet:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) oGet:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) ... oGet:SetKeyEvent( VK_F5, {|o| MsgBox( 'VK_F5 : ' + cValToChar( o:VarGet() ), This.Name ) } ) oGet:SetKeyEvent( , {|o| MsgBox( 'LDblClick : ' + cValToChar( o:VarGet() ), This.Name ) } ) ... [/pre2] для наглядности

gfilatov2002: SergKis пишет: для наглядности Благодарю Добавил, конечно

SergKis: gfilatov2002 Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) Немного по GetBox[pre2] FUNCTION OGETEVENTS( hWnd, nMsg, wParam, lParam ) ... CASE wParam == 3 // CTRL+C Copy CopyToClipboard( subs(oGet:Buffer, nStart, nEnd - nStart) ) // CopyToClipboard( oGet:Buffer ) RETURN( 0 ) CASE wParam == 24 .AND. !readonly // CTRL+X Cut IF !lAllowEdit .OR. oGet:type == "L" RETURN( 0 ) ENDIF CopyToClipboard( subs(oGet:Buffer, nStart, nEnd - nStart) ) // CopyToClipboard( oGet:Buffer ) //Franz nStart := LoWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ... ELSEIF wParam == VK_RIGHT IF lShift nEnd := oGet:Pos SendMessage( hWnd , EM_SETSEL , nStart , nEnd ) ELSE SendMessage( hWnd , EM_SETSEL , nStart + 1 , nStart + 1 ) _HMG_aControlMiscData1 [ i ][1] := 0 ENDIF oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_HOME SendMessage( hWnd , EM_SETSEL , 0 , 0 ) oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 ELSEIF wParam == VK_END // Patch By Pier July 2008 // Add By Pier patch for the incorrect end position START // IF HiWord( SendMessage( hWnd , EM_GETSEL , 0 , 0 ) ) < Len( Trim( oGet:Buffer ) ) // SendMessage( hWnd , EM_SETSEL , Len( Trim( oGet:Buffer ) ) , Len( Trim( oGet:Buffer ) ) ) // ELSE // SendMessage( hWnd , EM_SETSEL , Len( oGet:Buffer ) , Len( oGet:Buffer ) ) // ENDIF // Add By Pier patch for the incorrect end position STOP // oGet:pos := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nEnd := Len( Trim(oGet:Buffer) ) nStart := iif( lShift, nStart, nEnd ) SendMessage( hWnd, EM_SETSEL, nStart, nEnd ) RETURN 1 ELSEIF wParam == VK_INSERT ... CASE nMsg == WM_PASTE IF readonly .OR. ! lAllowEdit RETURN( 0 ) ENDIF IF ( cText := RetrieveTextFromClipboard() ) <> NIL nStart := LoWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) + 1 nLen := Len( oGet:Buffer ) IF nStart # nEnd ... FOR i := nStart TO nEnd // clear selection by backspacing IF oGet:pos > nStart oGet:BackSpace() ELSE EXIT ENDIF NEXT ENDIF h := oGet:pos FOR i := 1 TO Len( cText ) wParam := Asc( SubStr( cText, i, 1 ) ) IF oGet:type == "N" .AND. wParam == 46 oGet:toDecPos() ELSE IF IsInsertActive() oGet:Insert( Chr( wParam ) ) ELSE oGet:Overstrike( Chr( wParam ) ) ENDIF ENDIF IF h + i > nLen EXIT ENDIF NEXT ... Это, конечно, не все режимы, остальные позже. [/pre2] Потестить надо, я покрутил, но ... Может задуматься об управлении Tone(...), у себя убрали совсем (только мешает). Можно в класс внести Get внести переменную и плясать от нее или как то иначе ...

gfilatov2002: Завершена подготовка новой сборки 17.07 для BCC 5.51 (Harbour и xHarbour) , которая будет опубликована завтра. Под заказ возможно сделать индивидуальные сборки для таких дополнительных С-компиляторов: - MinGW 7.1.0 32-bit и Harbour 3.4.0dev (наиболее востребованная); - MinGW 7.1.0 64-bit и Harbour 3.4.0dev; - MS VisualC 2015 32-bit и Harbour 3.2.0dev; - MS VisualC 2017 32-bit и Harbour 3.2.0dev; - BCC 10.1 32-bit и Harbour 3.2.0dev; - PellesC 8.0 32-bit и xHarbour 1.2.3 build 10194 (на любителя). Благодарю за Ваше внимание

gfilatov2002: SergKis пишет: Немного по GetBox Это уже изменения для следующей сборки, если таковая появится в обозримом будущем...

SergKis: gfilatov2002 Если добавить в TsBrowse [pre2] METHOD DrawSelect( xRow ) CLASS TSBrowse ... nBegin := Min( If( ::nColPos <= ::nFreeze, ( ::nColPos := ::nFreeze + 1, ::nColPos - ::nFreeze ), ; ::nColPos - ::nFreeze ), nLastCol ) If ::bOnDrawLine != Nil Eval( ::bOnDrawLine, Self ) EndIf For nI := nBegin To nLastCol ... [/pre2] то можно обходиться без SET RELATION [pre2] LOCAL aName := { "VOP", "SKL" , "KLI" , "DAT" , "DOK" , "GRU" , "KOD" , "NAM" } LOCAL aColumn := { "R_1", "R_2" , "R_3" , "R_4" , "R_5" , "R_6" , "R_7" , "U02->R_3" } LOCAL aHeader := { "Op.", "Sklad", "Klient", "Datums", "Dokum.", "Grupa", "Kods", "Nosaukums" } ... For nI := 1 To nK cFld := aColumn[ nI ] If ( i := AT("->", cFld) ) > 0 j := left(cFld, i - 1) cFld := subs(cFld, i + 2) Else j := cAls EndIf bFld := FieldWBlock( cFld, Select( j ) ) cHdr := aHeader[ nI ] If "\" $ cHdr; cHdr := StrTran(cHdr, "\", CRLF) EndIf cFoo := aFooter[ nI ] If "\" $ cFoo; cFoo := StrTran(cFoo, "\", CRLF) EndIf ADD TO oBrw ; DATA bFld ; HEADER cHdr ; FOOTER cFoo ; COLOR aColor [ nI ] ; ALIGN aAlign [ nI ] ; WIDTH aWidth [ nI ] ; PICTURE aPicture[ nI ] ; MOVE aMoveDir[ nI ] ; NAME aName [ nI ] Next ... :bOnDrawLine := {|ob| MyRelat(ob) } ... FUNC MyRelat( oBrw ) LOCAL cAls := oBrw:cAlias LOCAL cKod := (cAls)->( R_6+R_7 ) IF ! U02->( R_1+R_2 ) == cKod U02->( dbSeek(cKod) ) ENDIF RETURN Nil [/pre2]

gfilatov2002: SergKis пишет: Немного по GetBox Благодарю за помощь! Не удержался, и решил включить эти изменения в новую сборку (уже давно был запрос на такие возможности в GetBox)

gfilatov2002: Опубликована очередная сборка 17.07 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.07-setup.exe Благодарю за Ваше внимание и помощь в подготовке этой сборки

SergKis: gfilatov2002 Пропущено [pre2] h_tbrowse.prg Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,; ... _HMG_aControlMiscData2 [k] := '' IF _HMG_lOOPEnabled Eval ( _HMG_bOnControlInit, k, mVar ) ENDIF Return oBrw ... [/pre2]

Andrey: Пробую новую версию. Глобальный переключатель oBrw:lNoKeyChar := .T. // отключить edit от нажатия клавиш цифр\букв теперь есть ! Это классно. А нельзя ли сделать такой же переключатель - только выборочно по столбцам ? Типа oBrw:aColumns[nI]:lNoKeyChar := .F. Для ENTER же есть - oBrw:aColumns[nI]:lEdit := .F. Или как то блокировать редактирование полей справочника ? Т.е. в тестовом проекте (который я высылал Tsb_composite(1.6).7z), редактируется неизвестно что, после нажатия букв/цифр на колонке справочника. Хотя я там блокирую редактирование: [pre2] oBrw1:aColumns[9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), FALSE } [/pre2]

SergKis: Andrey такой переключатель у тебя в руках [pre2] If ::bUserKeys != Nil uReturn := Eval( ::bUserKeys, nKey, nFlags, Self ) If uReturn != Nil .and. ValType( uReturn ) == "N" .and. uReturn < 200 // interpreted as a virtual key code to nKey := uReturn // change the original key pressed ElseIf uReturn != Nil .and. ValType( uReturn ) == "L" .and. ! uReturn ::nUserKey := 255 // want to inhibit the KeyDown and KeyChar Methods for key pressed Return 0 EndIf EndIf т.е. надо выключить для 5, 7 cell (в :bUserKeys) IF oBrw:nCell == 5; RETURN .F. ELSEIF oBrw:nCell == 7; RETURN .F. ENDIF RETURN .T. [/pre2]

Andrey: SergKis пишет: такой переключатель у тебя в руках Я согласен что он в руках. Но хочется простоты, без обработки функции - :bKeyDown или :bUserKeys Просто на столбце задать запрет и всё. Если глянешь мой пример, то там нет в основной таблице: oBrw1:bKeyDown или oBrw1:bUserKeys. Для многих программ их и не надо.

SergKis: Andrey пишет Хотя я там блокирую редактирование: :bPrevEdit возвращая .F., блокирует edit в METHOD KeyDown(...), но не блокирует выполнение METHOD KeyChar(...), где вкл. edit от цифр\букв. попробуй поставь перед возвратом из :bPrevEdit oBrw:nUserKey := 255 // want to inhibit the KeyDown and KeyChar Methods for key pressed т.е. oBrw1:aColumns[9]:bPrevEdit := {|xv,ob| xv := ob, SelectStreet(oBrw1), TblFocus(), ob:nUserKey := 255, FALSE }

SergKis: Andrey пишет Для многих программ их и не надо. Ты хочешь управлять METHOD KeyChar(...) на самом деле и тогда, вероятно, надо делать, добавив переменную в класс DATA bKeyChar [pre2] METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse ... Default ::nUserKey := nKey IF ::bKeyChar != Nil .and. !Empty( EVal( ::bKeyChar, Key, Self, nFlag ) RETURN 0 ENDIF If ::nUserKey == 255 .or. ::lNoKeyChar // from KeyDown() method Return 0 EndIf [/pre2]

gfilatov2002: SergKis пишет: Пропущено Благодарю, уже поправил в архиве на сайте

Andrey: SergKis пишет: oBrw1:aColumns[9]:bPrevEdit := {|xv,ob| xv := ob, SelectStreet(oBrw1), TblFocus(), ob:nUserKey := 255, FALSE } Не работает ! Все равно редактирует поле справочника после выбора из справочника !

gfilatov2002: Сделал быстрое обновление новой сборки с учетом последних изменений. Список изменений см. ниже [pre2] * Modified: A dependance of Minigui core from the functions of the tsbrowse library was removed (introduced in the build 17.07). Reported by Marcelo A. L. Carli <malcarli@terra.com.br>. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.20.0rc3. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-07-27 18:57). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) [/pre2] Прямая ссылка на архив http://hmgextended.com/files/CONTRIB/hmg-17.07.7z

gfilatov2002: SergKis пишет: Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) Благодарю Добавил в класс такую строку ACCESS HasStatusBar INLINE !( Empty( ::oStatusBar ) ) Пример использования: [pre2] IF oWnd:HasStatusBar SetStatusbarProperties() ENDIF [/pre2]Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты...

Andrey: gfilatov2002 пишет: Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... Есть для Tsbrowsa ! Сделать блокирование столбцов на цифры/буквы, что бы можно было задавать отдельно на любой столбец ! Желательно отдельно - вот так: oBrw:aColumns[nI]:lNoKeyChar := .F. Тогда кода можно будет меньше делать, т.е. можно будет обходиться без :bUserKeys и :bKeyDown Для простых задач - самое нужное ! Для примера смотреть - Tsb_composite

SergKis: Andrey пишет oBrw:aColumns[nI]:lNoKeyChar := .F. Чем твоя запись отличается от такой ? oBrw:aColumns[nI]:bPrevEdit := {|xv,ob| xv := ob, ob:lNoKeyChar := .T., .T. } Можешь сразу поставить (что лучше) oBrw:lNoKeyChar := .F.\.T. на нужных колонках сделать .T.\.F. Обходимся без bUserKeys

SergKis: PS Можно в Cargo колонки записать состояние для :lNoKeyChar и oBrw:aColumns[nI]:bPrevEdit := {|xv,ob| xv := ob, ob:lNoKeyChar := ob:aColumns[ob:nCell]:Cargo, .T. }

SergKis: Andrey пишет oBrw:aColumns[nI]:lNoKeyChar := .F. В примере Tsb_composite, на 9,10 колонках в :bPrevEdit вызов списков, поэтому, даже введя такую переменную в колонку, не решим проблему вкл. Edit, т.к. по цифре\букве мы уже в методе :KeyDown и вызывается :Edit. В примере со списком в :bprevEdit, работает [pre2] oBrw1:aColumns[ 9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), _PushKey( VK_ESCAPE ), FALSE } oBrw1:aColumns[10]:bPrevEdit := {|| SelectLang(oBrw1), _PushKey( VK_ESCAPE ), FALSE } [/pre2]

Andrey: SergKis пишет: PS Можно в Cargo колонки записать состояние для :lNoKeyChar и oBrw:aColumns[nI]:bPrevEdit := {|xv,ob| xv := ob, ob:lNoKeyChar := ob:aColumns[ob:nCell]:Cargo, .T. } Так не работает ! SergKis пишет: В твоем случае решается oBrw1:aColumns[9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), _PushKey( VK_ESCAPE ), FALSE } oBrw1:aColumns[10]:bPrevEdit := {|| SelectLang(oBrw1), _PushKey( VK_ESCAPE ), FALSE } А до этого и не додумался ! Простое и классное решение ! Спасибо за помощь ! Можно это oBrw:aColumns[nI]:lNoKeyChar := .F. теперь и не делать !!!

Andrey: gfilatov2002 пишет: Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... Немного по дизайну. Надоел мне, да и юзерам тоже стандартный CHECKBOX .... Ну маленький он очень, пока мышкой попадёшь.... Можно ли сделать стандартны расширенный объект CHECKBOXEX в котором можно было бы задавать картинки для этого чекбокса. Не хочется связываться со своими самопальными элементами... Хочется стандартных элементов. Картинки можно взять из MiniGUI\SAMPLES\Advanced\Tsb_BitMaps\RES - check0.bmp и check1.bmp ( формат png тоже бы надо поддерживать )

SergKis: Andrey А CheckLabel не подходит ? BASIC\CheckLabel BASIC\CheckLabel_2

Andrey: SergKis пишет: А CheckLabel не подходит ? Пропустил его... То что нужно ! Предлагаю добавить в этот пример добавить ещё один CheckLabel с картинками SAMPLES\Advanced\Tsb_BitMaps\RES - check0.bmp и check1.bmp

Andrey: Григорий, можно получить сборку последней версии МиниГуи для MS VisualC 2015 ? Попробовать хочу на нём собирать проекты.

gfilatov2002: Andrey пишет: можно получить сборку последней версии МиниГуи для MS VisualC http://hmgextended.com/files/MISC/minigui-vc17.zip MS VisualC 2017 лежит по ссылке http://hmgextended.com/files/MISC/vc2017.zip

Andrey: Спасибо !

gfilatov2002: Подготовил второй RC для следующей сборки 17.08 Список изменений см. ниже [pre2] * Fixed: A wrong value of 'DisplayValue' property was returned when this value was modified routinely in a standard ComboBox control with the DISPLAYEDIT clause (introduced in the build 17.05). Reported by Dusko Radojcin. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: Added a default action for a double click of the left mouse button in a GetBox control (similar to a standard TextBox). Suggested by Dusko Radojcin. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\GetBox) * Enhanced: Added the new method Refresh() in the Harbour TGet class. Sample code: oGet:SetKeyEvent( VK_ADD, {|o| o:VarPut( o:VarGet() + 1 ), ; o:Refresh() } ) oGet:SetKeyEvent( VK_SUBTRACT, {|o| o:VarPut( o:VarGet() - 1 ), ; o:Refresh() } ) Requested by Dusko Radojcin. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: Added a 'module name' information in the ErrorLog file. Suggested by Jayadev <jayadev65@yahoo.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\ErrorLog) * Modified: Added usage of the internal check-function IsArrayRGB() in the appropriate places of Minigui core. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: The <versioninfo> section was added to the application resources. It is based on using of a new header mgver.h and standard C-compiler header winver.h. It was a postponed modification. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see minigui.rc in folder \Resources) * Updated: A Minigui project for hbmk2 utility was updated for cleaning of the warnings at the Visual C 2017 compiler. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see hmg.hbx in folder \include) * New: PScript wrapper library source code (see in folder \Source\PageScript). This library contains all the PageScript 32 functions and one class, named TPageScript. You may either choose to call PS functions or instantiate TPageScript and use its methods. Contribution of PageScript owner Richard Visscher <richard@irvis.com> (see demo in folder \samples\Advanced\PageScript) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - minor bug fix and code cleaning. (see h_tbrowse.prg in folder \Source\TSBrowse) * Updated: HbSQLite3 library source code: - a core C-code was borrowed from the Harbour fork 3.4.0; - update for using SQLITE3 version 3.20.0. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Source\HbSQLite3) * Updated: Harbour Compiler 3.2.0dev (SVN 2017-08-03 20:24). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: MPM utility: - added Harbour hbwin contrib library to a link script. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Utils\MPM) * New: 'Move and Resize Control With Cursor' sample. Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\MoveResizeControl) * Updated: 'Print Pie Graph' sample: updated the data for July 2017. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'HMG Achoice' sample: fixed getting of a text width. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ACHOICE_2) * Updated: 'Using of StatusBar object' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Advanced\APP_OBJECTS) * Updated: 'Sumatra PDF Viewer' utility: updated for an external calling. Requested by Jayadev <jayadev65@yahoo.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\PdfView) * Updated: 'DBFview v.0.78' sample: updated for xHarbour compatibility. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Applications\DBFview) [/pre2]Если у Вас есть интересные дополнения или пожелания, то пишите...

gfilatov2002: Опубликована очередная сборка 17.08 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.08-setup.exe Благодарю за Ваше внимание P.S. Очень жаль, что в подготовке этой сборки не участвовал Петр

Andrey: gfilatov2002 пишет: Опубликована очередная сборка 17.08 для BCC 5.51 для компиляторов Harbour и xHarbour Протестировал несколько систем на новой сборке. Полёт нормальный !

gfilatov2002: Завершена подготовка очередной сборки 17.09, которая будет опубликована завтра. Список изменений см. ниже [pre2] * Fixed: A print support in C-code is INCOMPATIBLE with using of the constant WIN32_LEAN_AND_MEAN in the header file mgdefs.h (introduced in the build 17.07). Bug was reported on brazilian forum MiniGUI. A solution is adding of handling for new constant NO_LEAN_AND_MEAN. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: 'Application' object supports the read/write property WindowStyle. Syntax: Application.WindowStyle [ := <nStyle> ] Sample code: IF ! IsWindowHasStyle( App.Handle, WS_SIZEBOX ) App.WindowStyle := WS_SIZEBOX ENDIF Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: 'System' object supports a playing of the following system sounds: Ok, Beep, Asterisk, Exclamation, Hand and Question. Syntax: System.OkSound System.HandSound System.QuestionSound System.ExclamationSound System.AsteriskSound System.BeepSound Contributed by Grigory Filatov <gfilatov@inbox.ru> * Modified: BROWSE: Added quick accepting of a returned value at an inplace editing in a ComboBox with opened dropdown list via <Enter> key. Based upon a contribution of Roberto Lopez <mail.box.hmg@gmail.com> (see column Married in demo.prg at folder \samples\Basic\BROWSE_1) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - New: Added the property HBITMAP in an IMAGE control. You can set/get this property at runtime via: - function syntax: SetProperty( Form, Image, 'HBitmap', hNewBitmap ) GetProperty ( Form, Image, 'HBitmap' ) - pseudo-OOP syntax: Form.Image.hBitmap := hNewBitmap Form.Image.hBitmap --> hBitmap (see demo in folder \samples\Applications\ClipbrdClear) - New: Added two auxiliary functions for Browse/Grid handling: - ListView_GetExtendedStyle( hWnd, nCheckStyle ) -> lBoolean - ListView_ChangeExtendedStyle( hWnd, [nAddStyle], [nRemoveStyle] ) (see browse6.prg in folder \samples\Basic\BROWSE_3 and demo in folder \samples\Advanced\ListViewEx) Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> * Updated: Revised a returned array in the internal C-function EnumFontsEx(). Based upon a contribution of Viktor Szakats. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\GetFonts) * Updated: 'Bos Taurus' Graphics Library (see source in folder \Source\BosTaurus): - a correction in the function BT_HMGSetImage(). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\BTGraph) * Updated: HMG_HPDF library (see source in folder \source\HMG_HPDF): - minor bug fix and code cleaning with using of Harbour switch -w3. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.21.0dev (from 3.20.1). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-09-14 23:00). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'Quick Browse Generator' utility. Based upon a contribution of HMG user Dragan Cizmarevic. Adapted for Minigui Extended by Pierpaolo Martinello (see multilingual ReadMe.txt in folder \Utils\QBGen) * New: 'Anywhere Search' sample: universal search in tree, listbox, combobox and grid controls. Requested by Jayadev <jayadev65/at/yahoo.com>. Based upon a contribution of S.Rathinagiri <srgiri/at/dataone.in>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\AnywhereSearch) * Updated: 'Print Pie Graph' sample: updated the data for August 2017. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Clipbrd Clear' sample: improved the internal Clipboard Viewer. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Applications\ClipbrdClear) * Updated: 'Sumatra PDF Viewer' utility: - added an ability to select a folder Main menu -> File -> Choose directory (also click on header of Files grid), - fixed the function ChangeWindowMessageFilter(). Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\PdfView) * Updated: 'WebCam preview and capture' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\WebCam_2) [/pre2] P.S. Увы, но в подготовке этой сборки не участвовал Петр Хорошая новость: в команду добавлен новый участник из Италии - Pierpaolo Martinello

gfilatov2002: Опубликована очередная сборка 17.09 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.09-setup.exe Благодарю за Ваше внимание

Andrey: Нашёл баг при сборке проекта. При названии папки, где в конце стоит точка ( типа - XLS_to_CSV.) Вылет при сборке такой: Я так и не понял при чем тут MINIPRINT ?

gfilatov2002: Сделал быстрое обновление новой сборки с учетом последних исправлений. Список изменений см. ниже [pre2]2017/09/28: HMG Extended Edition version 17.09 (Update 1). * Fixed: An application without a print feature was depended on the MiniPrint library anyway (introduced in the build 17.03). Reported on brazilian forum MiniGUI. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\HELLO_WORLD) * Fixed: A problem with a Modal dialog at using of the PropSheet library. Bug was reported by Pierpaolo Martinello. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\PropSheet) * Updated: 'Quick Browse Generator' utility: minor changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Utils\QBGen) [/pre2] Прямая ссылка на архив http://hmgextended.com/files/CONTRIB/hmg-17.09.7z

gfilatov2002: Выполнил адаптацию библиотеки к новому исправленному MinGW версии 7.20 в связке с Харбором 3.2dev Собранный Харбор брал с сайта http://whosaway.com Контрольные примеры отработали нормально, но удивил рост размера библиотеки на 35+ кБайт в сравнении с Харбором 3.4 Ваши комментарии приветствуются...

Dima: gfilatov2002 пишет: в сравнении с Харбором 3.4 А такой разве есть ?

gfilatov2002: Dima пишет: такой разве есть ? Ага. Это продвинутый форк Харбора, который можно посмотреть по адресу https://github.com/vszakats/harbour-core/releases



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