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

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

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

Ответов - 133, стр: 1 2 3 4 5 6 7 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

Andrey: Пример SAMPLES\BASIC\COLORED_TAB Добавляем в код строку: [pre2] DEFINE TAB Tab_1 ; OF Form_1 ; ...... FONT "Arial Black" SIZE 16 BOLD ; ....[/pre2] Потом при изменении в меню Style (Top pages/Bottom pages) при прорисовке TAB идёт полоса, т.е. наименований табов не видно ! Как там бы учесть новую высоту Tab зависимую от высоты шрифта ?

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

Haz: gfilatov2002 пишет: Всем, кому это интересно Григорий спасибо. С каждым релизом проект МГ, движется вперёд. И без лести скажу - в этом большая Ваша заслуга. Лет примерно 17 назад думал стоит ли дальше использовать МГ после того как Роберто объявил об отказе от bcc. Но появился Ваш МГ экстендет и это решило выбор на тот момент. Потом появился MG ext под друие компиляторы и это только подтверждение тому что выбор правильный

Dima: Haz пишет: И без лести скажу - в этом большая Ваша заслуга +1

gfilatov2002: Haz пишет: это только подтверждение тому что выбор правильный Благодарю за добрые слова! Увы, но новых идей, как и энтузиазма, с годами не прибавляется... Поэтому очень важна Ваша поддержка, которая определяет, будет ли выходить новая сборка библиотеки Хочу поблагодарить за такую поддержку двух человек на этом форуме: Андрея Верченко и Сашу Савова

gfilatov2002: Подготовил второй RC для следующей сборки 17.11 Список изменений см. ниже [pre2] * Enhanced: The Browse control supports the optional 'ColumnSort {}' clause similar to a Grid. This clause specifies that column's header allows to sort a data via a mouse click. Syntax: @ <row>,<col> BROWSE <name> [ OF <parent> ] ; [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] ; [ HEADERS <aHeaders> ] [ WIDTHS <aWidths> ] ; [ FIELDS <aFields> ] [ VALUE <value> ] [ COLUMNSORT <aSort> ] where the array aSort may have the following values for each column: .F. - no sorting; .T. - allow sorting. Note that it will be created an auxiliary compound index in the memory for an each field of a table which will replace the any other index of this table. Requested by Pete D. <pete_westg/at/yahoo.gr>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\BROWSE_SORT) * Enhanced: The AnimateBox control supports now the optional BACKCOLOR clause. Above clause should be used along with the TRANSPARENT clause. Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\ANIMATEDEMO) * Enhanced: The Timer control supports now the optional ONCE clause. If above clause is defined, when the timer procedure will be executed one time only. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\Timer) * Updated: Cleaning of a redundant code at the IMAGE control processing. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Revised usage of the TEMP files at the RICHEDIT control processing. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\Richedit) * Updated: Added helpful C-function IsAppHung( <hWnd> ) for hung detection of the applications (based upon the undocumented WinAPI function). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\ProcInfo) * Updated: Added processing of the 3rd parameter cResType to the C-function RCDataToFile() for xHarbour compiler. Syntax: RCDataToFile( <cResName>|<nResID>, <cFileName> [, <cResType> ] ) (see demo2.prg in folder \samples\Advanced\RCDataToFile) * Updated: WinReport library: - added new commands to support a font attibute in GROUP section; - updated WinReport CHM file. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see demo in folder \samples\Advanced\REPORT_INTERPRETER) * Updated: Harbour Compiler 3.2.0dev (SVN 2017-11-14 20:44). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'Show AVI files' samples. Contributed by Verchenko Andrey <verchenkoag@gmail.com> (see in folder \samples\Basic\ANIMATEDEMO_2) * New: 'Sort Columns With Header Click in a Browse' sample. Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\BROWSE_SORT_2) * New: 'View and save the images from a website' sample. Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ImageFromWeb) * Updated: 'Quick Browse Generator' utility: - added possibility of column deletion in a Grid context menu; - added an ability to save a report in the WinReport format; - added support for the main languages. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \Utils\QBGen) * Updated: 'My Dbf Browse' sample: added using of COLUMNSORT clause. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\BROWSE_8) * Updated: 'Image To DBF' sample: added using of Timer ONCE clause. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\basic\Image2Dbf) * Updated: 'Media Player control' sample: - New: added the useful function aSize := GetAviFileSize( <cFile> ). Based upon a contribution of Verchenko Andrey <verchenkoag@gmail.com> (see in folder \samples\Basic\PLAYER_1) * Updated: 'Print Pie Graph' sample: updated the data for October 2017. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Replacement for Clipper ALERT() function' sample: - the dialog size and controls placement are similar to Windows 7 look. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\WALERT_2) [/pre2] Если у Вас есть интересные дополнения или пожелания, то пишите...

Andrey: gfilatov2002 пишет: Если у Вас есть интересные дополнения или пожелания, то пишите... Есть предложение ! Расширить объект TEXTBOX форматом для INPUTMASK как в Харборе. [pre2]Например: cFormat := "!" + REPL("Х",35) @ ... TEXTBOX Text_1 ...... ; INPUTMASK cFormat ; .... [/pre2]

gfilatov2002: Andrey пишет: Расширить объект TEXTBOX форматом для INPUTMASK Именно по этой причине появился в MiniGUI Ex элемент управления GETBOX, который задумывался, как замена контролу TEXTBOX, и который поддерживает все Клипперовские форматы ввода (кстати, первоначально для GETBOX предлагалось использовать имя CLIPPERBOX )

Andrey: Понял, Спасибо ! Глюк при выводе CHECKLABEL в цветном TAB ! При первоначальном показе формы другие CHECKLABEL2,3,4 и 5 прорисовываются на Вкладке "Page_1". Почему ? Пример отправил на почту. А ещё заодно, можно ли добавить в объект CHECKLABEL свойство как у CHECKBOX: [pre2]ON CHANGE ( lStaticF1p1 := GetProperty(ThisWindow.Name, This.Name, "Checked") )[/pre2] вместо сейчас используемого: [pre2]ONCLICK ( lStaticF1p1 := Form_1.Label_F1p1.Checked, Form_1.Label_F1p1.Checked := !lStaticF1p1 )[/pre2]

gfilatov2002: Andrey пишет: При первоначальном показе формы другие CHECKLABEL2,3,4 и 5 прорисовываются на Вкладке "Page_1" Добавь следующие две строки в конце процедуры OnInitForm Form_1.Tab_1.Hide Form_1.Tab_1.Show для перерисовки первой вкладки Также можно использовать для перерисовки Таба в этой процедуре следующую строку UpdateTab(Form_1.Tab_1.Index)

Andrey: gfilatov2002 пишет: Также можно использовать для перерисовки Таба в этой процедуре следующую строку Спасибо ! Помогло !

gfilatov2002: Опубликована очередная сборка 17.11 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.11-setup.exe Благодарю за Ваше внимание P.S. Имеются также готовые сборки для следующих пар (Си-компилятор+Харбор): - MinGW 7.2.0 32-bit and Harbour 3.2.0dev; - MinGW 7.2.0 64-bit and Harbour 3.4.0dev; - MS VisualC 2017 32-bit and Harbour 3.2.0dev. ссылки на которые будут доступны по Вашему запросу

Andrey: gfilatov2002 пишет: Если у Вас есть интересные дополнения или пожелания, то пишите... Научился собирать свою DLL-ку с картинками, иконками и т.д. Как из полученной DLL-ки показывать эти ресурсы на форме - не знаю ! Хотелось бы иметь демо-пример, как это делать ? Свою сборку выслал на почту.

Dima: Andrey Так примеры же есть

SergKis: Dima пишет Андрей имеет ввиду, что сейчас ресурсы назначены на exe, переменная extern HINSTANCE g_hInstance; от нее пляшем. Он хочет уст. в g_hInstance новый handle hDll, сохранив старое значение. Поработав с рес. dll, потом вернуть старое значение от exe и ... Если я правильно понимяю

Dima: SergKis пишет: Если я правильно понимяю Фиг его знает о чем он Я про этот пример C:\MiniGUI\SAMPLES\BASIC\Icons\demo2.prg

SergKis: Dima пишет Я про этот пример LoadIcon(...) имеет параметр для hDll, а bmp и т.д. работают от g_hInstance, к примеру[pre2] HB_FUNC( LOADBITMAP ) { HBITMAP hBitmap; hBitmap = ( HBITMAP ) LoadImage( g_hInstance, hb_parc( 1 ), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR ); ... [/pre2] т.е. все image идут от g_hInstance

Andrey: Dima пишет: Фиг его знает о чем он Я про этот пример C:\MiniGUI\SAMPLES\BASIC\Icons\demo2.prg Там только иконка. А как работать с картинками, звуком, CUSTOM из внешней DLL-ки - примеров нет.

SergKis: Andrey пишет А как работать с картинками, звуком, CUSTOM из внешней DLL-ки - примеров нет. Нет команды SET RESOURCE TO [<cDllName>] // подключить\отключить dll нет и примеров

Dima: SergKis пишет: Нет команды SET RESOURCE TO По идее её можно слямздить в FW из source\winapi\resource.c В ней есть SETRESOURCES и FREERESOURCES из которых состоят команды в FW [pre2] #xcommand SET RESOURCES TO <cName1> [,<cName2>] ; => ; [ SetResources( <cName2> ); ] SetResources( <cName1> ) #xcommand SET RESOURCES TO => FreeResources() [/pre2]

gfilatov2002: SergKis пишет: Нет команды SET RESOURCE TO [<cDllName>] // подключить\отключить dll Благодарю за наводку Добавил такую команду в новую сборку. Она позволяет сейчас вывести на форму следующие ресурсы из DLL: - картинка - картинка на кнопку BUTTONEX - иконка - анимация из AVI-файла Dima пишет: [pre2] #xcommand SET RESOURCES TO <cName1> [,<cName2>] ; => ; [ SetResources( <cName2> ); ] SetResources( <cName1> ) #xcommand SET RESOURCES TO => FreeResources()[/pre2] Так и сделал...

Andrey: gfilatov2002 пишет: Она позволяет сейчас вывести на форму следующие ресурсы из DLL: А еще нужен звук и CUSTOM для выгрузки в файл...

gfilatov2002: Andrey пишет: нужен звук и CUSTOM для выгрузки в файл Пример со звуком и выгрузкой в файл отправил по почте...

Andrey: gfilatov2002 пишет: Пример со звуком и выгрузкой в файл отправил по почте... Классно получилось !!! Не ожидал, что так быстро получиться. А можно ресурсы загружать в переменные, а потом передавать их в другие функции и там на форму выводить ?

SergKis: gfilatov2002 Предложение [pre2] *-----------------------------------------------------------------------------* FUNCTION _GetValue ( ControlName, ParentForm, Index ) *-----------------------------------------------------------------------------* ... CASE T == "MASKEDTEXT" ... CASE T == "CHECKLABEL" retval := GetChkLabel( c ) CASE T == "TEXT" .OR. T == "BTNTEXT" .OR. T == "EDIT" .OR. "LABEL" $ T .OR. T == "HYPERLINK" .OR. T == "CHARMASKTEXT" .OR. T == "RICHEDIT" ... *-----------------------------------------------------------------------------* FUNCTION _SetValue ( ControlName, ParentForm, Value, index ) *-----------------------------------------------------------------------------* ... ELSEIF T == "CHECKLABEL" IF Value == NIL Value := ! GetChkLabel ( c ) ENDIF SetChkLabel ( c , Value ) ELSEIF !( "LABEL" $ T ) .AND. T != "RICHEDIT" ... *-----------------------------------------------------------------------------* FUNCTION GetControlValue ( ControlName , ParentForm ) *-----------------------------------------------------------------------------* LOCAL i IF ( i := GetControlIndex ( ControlName , ParentForm ) ) == 0 RETURN Nil ENDIF IF _HMG_aControlType [ i ] == "CHECKLABEL" RETURN GetChkLabel( _HMG_aControlHandles [ i ] ) ENDIF RETURN ( _HMG_aControlValue [ i ] ) тогда включить *-----------------------------------------------------------------------------* FUNCTION _DefineChkLabel ( ControlName, ParentFormName, x, y, Caption, w, h, ; ... _HMG_aControlMiscData2 [k] := '' IF _HMG_lOOPEnabled Eval ( _HMG_bOnControlInit, k, mVar ) ENDIF IF blink == .T. .AND. .NOT. lDialogInMemory ... [/pre2]

SergKis: PS. Возможно пойдет и такое[pre2] *-----------------------------------------------------------------------------* FUNCTION _DefineChkLabel ( ControlName, ParentFormName, x, y, Caption, w, h, ; ... DEFAULT ProcedureName TO {|| _SetValue( ControlName, ParentFormName, NIL ) } [/pre2]

gfilatov2002: SergKis пишет: Предложение Благодарю за помощь! Принято в полном объеме

gfilatov2002: Подготовил очередную бетку для следующей сборки 17.12 Список изменений см. ниже [pre2] * New: Added a possibility to load the resources from an external DLL. We may select an active resources DLL via the new command SET RESOURCES TO <cDLL> and get freed unneeded resources DLL with SET RESOURCES TO. Sample code: SET RESOURCES TO "resources.dll" DEFINE WINDOW Win_1 WINDOWTYPE CHILD ; CLIENTAREA 400, 300 TITLE 'Test' ... END WINDOW ACTIVATE WINDOW Win_1 SET RESOURCES TO It is possible now to load the following resources from DLL: the dialogs, menu with accelerators, icons, images, animates, cursors and sounds. Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\Resources_DLL) * Enhanced: CHECKLABEL control supports the optional 'Value' property as synonym for the 'Checked' property. You can set/get 'Value' property at runtime as usually. Added a default action for 'On Click' event: it will switch a value similar to the CheckBox control. Suggested and contributed by Sergej Kiselev. Revised by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\CheckLabel_2) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - Enhanced: function ExitProcess() accepts a parameter nErrorLevel as exit code of an application, i.e. ExitProcess( nErrorLevel ). Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.22.0dev (from 3.21.0). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-11-22 11:33). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'Simple implementation of a Rating control' sample: - use the pressed <Shift> key at a mouse click for enter a half star. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\RATING) * New: 'Place a QRCODE to PDF file' sample. Based upon a contribution of HMG user Edward. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Advanced\HMG_Zebra) * Updated: 'View and save the images from a website' sample: - added detection of images in <a> tags; - added context menu in image list. Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ImageFromWeb) [/pre2] Благодарю за Ваше внимание и поддержку

gfilatov2002: Всем, кому это интересно Подготовил второй RC для следующей сборки 17.12 со следующим списком изменений (см. ниже) [pre2] * New: Added a possibility to load the resources from an external DLL. We may select an active resources DLL via the new command SET RESOURCES TO <cDLL> and get freed unneeded resources DLL with SET RESOURCES TO. Sample code: SET RESOURCES TO "resources.dll" DEFINE WINDOW Win_1 WINDOWTYPE CHILD ; CLIENTAREA 400, 300 TITLE 'Test' ... END WINDOW ACTIVATE WINDOW Win_1 SET RESOURCES TO It is possible now to load the following resources from DLL: the dialogs, menu with accelerators, icons, images, animates, cursors and sounds. Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\Resources_DLL) * New: Function GetUserTempFolder() returns an User Profile Temp Folder path. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\MAINDEMO (SYNTAX I)) * Enhanced: CHECKLABEL control supports the optional 'Value' property as synonym for the 'Checked' property. You can set/get 'Value' property at runtime as usually. Added a default action for 'On Click' event: it will switch a value similar to the CheckBox control. Suggested and contributed by Sergej Kiselev. Revised by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\CheckLabel_2) * Enhanced: The 'Alignment' property is supported for the LABEL control. You can set/get this property at runtime: - function syntax: SetProperty ( Form, Label, 'Alignment', cAlignment ) GetProperty ( Form, Label, 'Alignment' ) --> cAlignment - pseudo-OOP syntax: Form.Label.Alignment := cAlignment Form.Label.Alignment --> cAlignment where cAlignment may be 'LEFT', 'RIGHT', 'CENTER' or 'VCENTER'. It was a postponed user's request. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\LABEL_4) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - Enhanced: function ExitProcess() accepts a parameter nErrorLevel as exit code of an application, i.e. ExitProcess( nErrorLevel ). Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.22.0dev (from 3.21.0). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2017-11-22 11:33). Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * New: 'Simple implementation of a Rating control' sample: - use the pressed <Shift> key at a mouse click for enter a half star. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\RATING) * New: 'Place a QRCODE to PDF file' sample. Based upon a contribution of HMG user Edward. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Advanced\HMG_Zebra) * Updated: 'Print Pie Graph' sample: updated the data for November 2017. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: 'Alpha Blend usage' sample: - updated for compatibility with the latest Minigui changes. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo2.prg in folder \samples\Advanced\AlphaBlend_2) * Updated: 'View and save the images from a website' sample: - added detection of images in <a> tags; - added context menu in image list. Based upon a contribution of HMG user KDJ. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\ImageFromWeb) * Updated: 'TSBrowse: The discovery of different databases on a single form' sample. Based upon a contribution of Sergej Kiselev. Contributed by Verchenko Andrey <verchenkoag@gmail.com> (see in folder \samples\Advanced\Tsb_4bases) [/pre2] Благодарю за Ваше внимание всех, кто оказывал поддержку этому проекту

Andrey: Григорий, а вот в соседней ветке Vlad04 интересуется как получить результат со справочника ! Я высылал тебе пример Tsb_composite - в нём есть такое ! Вдобавок ко всему можно прикрутить свой справочник городов и улиц, там тоже показано как делать. Т.е. добавить колонку справочника города, а в справочник улиц передавать фильтр по городу - KCITY==код и будет сразу работать. Если надо, то ещё раз вышлю архив примера.

SergKis: Попробовал в mdi перевести несколько примеров ... Облом. Не работает. Может кому интересно (может я где не прав). Пример: http://my-files.ru/fzs4u1

alexandr11: gfilatov2002 пишет: Опубликована очередная сборка 17.11 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу Григорий, мне приглянулся hbtip.lib из этой сборки можно где-то взять его сырцы? боюсь, что сырцы harbour с github слишком для меня "сырые"

gfilatov2002: alexandr11 пишет: можно где-то взять его сырцы? Библиотека hbtip строится при сборке Харбора из сырцов на github как и другие contrib библиотеки из следующего списка hbct hbhpdf hbmisc hbmzip hbnf hbcomio hbfoxpro hbgzio hbmemio hbnetio hbpipeio hbtcpio hbtip hbwin hbzebra rddbm xhb alexandr11 пишет: сырцы harbour с github слишком для меня "сырые" Я так понимаю, что Вам нужен батник для сборки этой библиотеки

gfilatov2002: SergKis пишет: Не работает Очень нравятся Ваши примеры. Пересобрал этот пример с библиотекой из текущей сборки 17.12 - вроде, нет проблем. А что точно не работает в Вашем примере

alexandr11: gfilatov2002 пишет: Я так понимаю, что Вам нужен батник для сборки этой библиотеки хотелось бы получить батник + именно те сырцы, чтобы пересобрать ее для себя если, конечно, это возможно... я с успехом цепляю эту библиотеку к своему проекту, но мне хотелось бы внести в нее изменения... а если я собираю hbtip.lib из последнего harbour night, то все выходит гораздо хуже... возможно, я просто не так ее собираю

SergKis: gfilatov2002 пишет А что точно не работает в Вашем примере Dokum1 не работает EDITABLE в колонках, т.е. не меняется значения в колонке пробелом Dokum3 корректировка записи включена (загружены все 3-и окна dokum), нажатие на 1-ом поле Enter вызывает переключение фокуса окна на календарь. Label надписей у textbox не реагирует на BackColor, устанавливаю как у окна gProp(BColor)

gfilatov2002: alexandr11 пишет: хотелось бы получить батник Это можно @echo off SET HMGPATH=c:\minigui SET PATH=%HMGPATH%\harbour\bin;c:\bcc55\bin;%PATH% hbmk2 hbtip.hbp >> build.log и файл проекта ниже -hblib -inc -ohbtip -workdir=obj -w3 -es2 -ko encurlc.c mime.c misc.c cgi.prg client.prg credent.prg encb64.prg encoder.prg encqp.prg encurl.prg ftpcli.prg httpcli.prg log.prg mail.prg popcli.prg sendmail.prg sessid.prg smtpcli.prg thtml.prg url.prg alexandr11 пишет: именно те сырцы Сырцы надо брать на github, я ничего не изменял. Для успешной сборки библиотеки добавил в каталог 2 файла: - hbssl.ch - hbssl.hbx Лог-файл сборки - ниже [pre2]hbmk2: Compiling Harbour sources... hbmk2: Compiling... obj\cgi.c: obj\client.c: obj\credent.c: obj\encb64.c: obj\encoder.c: obj\encqp.c: obj\encurl.c: obj\ftpcli.c: obj\httpcli.c: obj\log.c: obj\mail.c: obj\popcli.c: obj\sendmail.c: obj\sessid.c: obj\smtpcli.c: obj\thtml.c: obj\url.c: encurlc.c: mime.c: misc.c: hbmk2: Creating static library... hbtip.lib TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation /P32 hbtip.lib -+ obj\cgi.obj -+ obj\client.obj -+ obj\credent.obj -+ obj\encb64.obj -+ obj\encoder.obj -+ obj\encqp.obj -+ obj\encurl.obj -+ obj\ftpcli.obj -+ obj\httpcli.obj -+ obj\log.obj -+ obj\mail.obj -+ obj\popcli.obj -+ obj\sendmail.obj -+ obj\sessid.obj -+ obj\smtpcli.obj -+ obj\thtml.obj -+ obj\url.obj -+ obj\encurlc.obj -+ obj\mime.obj -+ obj\misc.obj[/pre2] Пробуйте

alexandr11: gfilatov2002 пишет: Пробуйте Григорий, большое спасибо!

alexandr11: gfilatov2002 пишет: Пробуйте Григорий, а где credent.prg взять?

gfilatov2002: alexandr11 пишет: где credent.prg взять? Это заготовка класса, которую потом убрали из библиотеки [pre2]#include "hbclass.ch" /* * Credentials class * A way to give basic credentials */ CREATE CLASS TIPCredentials VAR cMethod VAR cUserid VAR cPassword ENDCLASS[/pre2]

gfilatov2002: SergKis пишет: не работает EDITABLE в колонках, т.е. не меняется значения в колонке пробелом Dokum3 корректировка записи включена (загружены все 3-и окна dokum), нажатие на 1-ом поле Enter вызывает переключение фокуса окна на календарь. Label надписей у textbox не реагирует на BackColor, устанавливаю как у окна gProp(BColor) Да, есть такие ошибки Это подтверждает, что mdi-интерфейс еще не готов к серьезной работе Возможно, Вы можете помочь довести его до рабочего состояния

SergKis: gfilatov2002 пишет помочь довести его до рабочего состояния Не отказываюсь, но сил хватает посмотреть просмотреть Change.txt и некоторые примеры, к сожалению. Немного почистил пример и добавил управление на 4-ом item StatusBar: http://TransFiles.ru/4wcis Что бы было.

gfilatov2002: SergKis пишет: сил хватает просмотреть Change.txt и некоторые примеры Благодарю за внимание

Andrey: gfilatov2002 пишет: Пересобрал этот пример с библиотекой из текущей сборки 17.12 - вроде, нет проблем. Я что то пропустил... Библиотека сборки 17.12 уже опубликована или ещё нет ? Нашёл непонятку в сборке 17.11 - перестала работать команда: [pre2]DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE cResFon, где cResFon - PNG картинка.[/pre2] Раньше работала, а с какой версии перестала, уже и не найти.

SergKis: gfilatov2002 Глянул, c_WindowsMdi.c нашей версии, есть разница. Текст, как есть [pre2] /*---------------------------------------------------------------------------- MINIGUI - Harbour Win32 GUI library source code Copyright 2002-2010 Roberto Lopez <harbourminigui@gmail.com> http://harbourminigui.googlepages.com/ MDI window source code (C)2005 Janusz Pora <januszpora@onet.eu> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). As a special exception, you have permission for additional uses of the text contained in this release of Harbour Minigui. The exception is that, if you link the Harbour Minigui library with other files to produce an executable, this does not by itself cause the resulting executable to be covered by the GNU General Public License. Your use of that executable is in no way restricted on account of linking the Harbour-Minigui library code into it. Parts of this project are based upon: "Harbour GUI framework for Win32" Copyright 2001 Alexander S.Kresin <alex@belacy.belgorod.su> Copyright 2001 Antonio Linares <alinares@fivetech.com> www - http://harbour-project.org "Harbour Project" Copyright 1999-2012, http://harbour-project.org/ "WHAT32" Copyright 2002 AJ Wos <andrwos@aust1.net> "HWGUI" Copyright 2001-2009 Alexander S.Kresin <alex@belacy.belgorod.su> ---------------------------------------------------------------------------*/ #define WINVER 0x0500 /* #define _WIN32_IE 0x0500 #ifdef __POCC__ #define _WIN32_WINNT 0x0500 #else // #define _WIN32_WINNT 0x0400 #define _WIN32_WINNT 0x0501 #endif */ #include "c_ver.h" #define WM_TASKBAR WM_USER + 1043 #include <windows.h> #include <TChar.h> #include "hbapi.h" #include "hbvm.h" #include <commctrl.h> #include "c_winbk9.h" #ifdef __XHARBOUR__ #define HB_PARNI( n, x ) hb_parni( n, x ) #define HB_STORNL( n, x, y ) hb_stornl( n, x, y ) #else #define HB_PARNI( n, x ) hb_parvni( n, x ) #define HB_STORNL( n, x, y ) hb_storvnl( n, x, y ) #endif LRESULT CALLBACK MdiWndProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK MdiChildWndProc ( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); static HWND hwndMDIClient; HB_FUNC( REGISTERMDIWINDOW ) { WNDCLASS WndClass; HBRUSH hbrush = 0; INITCOMMONCONTROLSEX cc; cc.dwSize = sizeof( INITCOMMONCONTROLSEX ); cc.dwICC = ICC_DATE_CLASSES | ICC_COOL_CLASSES | ICC_LISTVIEW_CLASSES | ICC_NATIVEFNTCTL_CLASS | ICC_PAGESCROLLER_CLASS | ICC_PROGRESS_CLASS | ICC_STANDARD_CLASSES | ICC_TAB_CLASSES | ICC_TREEVIEW_CLASSES | ICC_USEREX_CLASSES; ; InitCommonControlsEx( &cc ); memset( &WndClass, 0, sizeof( WNDCLASS ) ); WndClass.style = CS_DBLCLKS; // CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; WndClass.lpfnWndProc = MdiWndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = GetModuleHandle( NULL ); WndClass.hIcon = LoadIcon( GetModuleHandle(NULL), hb_parc_t(1) ); if( WndClass.hIcon == NULL ) WndClass.hIcon = ( HICON ) LoadImage( 0, hb_parc_t(1), IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ); if( WndClass.hIcon == NULL ) WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); WndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); if( HB_PARNI(3, 1) == -1 ) WndClass.hbrBackground = ( HBRUSH ) ( COLOR_WINDOW + 1 ); else { hbrush = CreateSolidBrush( RGB(HB_PARNI(3, 1), HB_PARNI(3, 2), HB_PARNI(3, 3) ) ); WndClass.hbrBackground = hbrush; } WndClass.lpszMenuName = NULL; WndClass.lpszClassName = hb_parc_t( 2 ); if( !RegisterClass(&WndClass) ) { MessageBox( 0, _TEXT("Window MDI Registration Failed!"), _TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL ); ExitProcess( 0 ); } WndClass.style = 0; WndClass.lpfnWndProc = ( WNDPROC ) MdiChildWndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 20; WndClass.hInstance = GetModuleHandle( NULL );; // Owner of this class WndClass.hIcon = LoadIcon( GetModuleHandle(NULL), hb_parc_t(1) ); if( WndClass.hIcon == NULL ) WndClass.hIcon = ( HICON ) LoadImage( 0, hb_parc_t(1), IMAGE_ICON, 0, 0, LR_LOADFROMFILE + LR_DEFAULTSIZE ); if( WndClass.hIcon == NULL ) WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); WndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); if( HB_PARNI(3, 1) == -1 ) WndClass.hbrBackground = ( HBRUSH ) ( COLOR_WINDOW + 1 ); else WndClass.hbrBackground = hbrush; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = _TEXT("MdiChildWndClass"); if( !RegisterClass( ( LPWNDCLASS ) &WndClass) ) { MessageBox( 0, _TEXT("Window MdiChild Registration Failed!"), _TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL ); ExitProcess( 0 ); } hb_retnl( ( LONG ) hbrush ); } LRESULT CALLBACK MdiWndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { static PHB_SYMB pSymbol = NULL; long int r; // ------------------- Win32 ------------------------------------ // Запрос из другого прцесса. Дай полный Номер ! if( message==WM_WIN32_POST_FAQ ) return OnEventWM_GetBase_NNN(); // Разбор сигнала из другой программы и послать PostMSG if( message==WM_COPYDATA) return OnEventWM_CopyData( lParam ); // ------------------- Win32 ------------------------------------ if( !pSymbol ) pSymbol = hb_dynsymSymbol( hb_dynsymGet("EVENTS") ); if( pSymbol ) { hb_vmPushSymbol( pSymbol ); hb_vmPushNil(); hb_vmPushLong( ( LONG ) hWnd ); hb_vmPushLong( message ); hb_vmPushLong( wParam ); hb_vmPushLong( lParam ); hb_vmDo( 4 ); } r = hb_parnl( -1 ); if( r == 0 ) return DefFrameProc(hWnd, hwndMDIClient, message, wParam, lParam); return ((r==2)? 0 : r); } LRESULT CALLBACK MdiChildWndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { static PHB_SYMB pSymbol = NULL; long int r; // ------------------- Win32 ------------------------------------ // Запрос из другого прцесса. Дай полный Номер ! if( message==WM_WIN32_POST_FAQ ) return OnEventWM_GetBase_NNN(); // Разбор сигнала из другой программы и послать PostMSG if( message==WM_COPYDATA) return OnEventWM_CopyData( lParam ); // ------------------- Win32 ------------------------------------ if( !pSymbol ) pSymbol = hb_dynsymSymbol( hb_dynsymGet("MDIEVENTS") ); if( pSymbol ) { hb_vmPushSymbol( pSymbol ); hb_vmPushNil(); hb_vmPushLong( ( LONG ) hWnd ); hb_vmPushLong( message ); hb_vmPushLong( wParam ); hb_vmPushLong( lParam ); hb_vmDo( 4 ); } r = hb_parnl( -1 ); if( r == 0 ) return DefMDIChildProc( hWnd, message, wParam, lParam ); return r; } HB_FUNC( INITMDIWINDOW ) { HWND hwnd; int Style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER | WS_SYSMENU | WS_THICKFRAME; int ExStyle; if( hb_parl(16) ) ExStyle = WS_EX_CONTEXTHELP; else { ExStyle = 0; if( !hb_parl(6) ) Style = Style | WS_MINIMIZEBOX; if( !hb_parl(7) ) Style = Style | WS_MAXIMIZEBOX; } if( !hb_parl(8) ) Style = Style | WS_SIZEBOX; if( !hb_parl(9) ) Style = Style | WS_SYSMENU; if( !hb_parl(10) ) Style = Style | WS_CAPTION; if( hb_parl(11) ) ExStyle = ExStyle | WS_EX_TOPMOST; if( hb_parl(14) ) Style = Style | WS_VSCROLL; if( hb_parl(15) ) Style = Style | WS_HSCROLL; hwnd = CreateWindowEx ( ExStyle, hb_parc_t(12), hb_parc2_t(1), Style, hb_parni(2), hb_parni(3), hb_parni(4), hb_parni(5), ( HWND ) hb_parnl(13), ( HMENU ) NULL, GetModuleHandle(NULL), NULL ); if( hwnd == NULL ) { MessageBox( 0, _TEXT("MDI Window Creation Failed!"), _TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL ); return; } hb_retnl( ( LONG ) hwnd ); } HB_FUNC( INITMDICLIENTWINDOW ) { HWND hwndparent; int icount; CLIENTCREATESTRUCT ccs; memset( &ccs, 0, sizeof( ccs ) ); hwndparent = ( HWND ) hb_parnl( 1 ); icount = GetMenuItemCount( GetMenu(hwndparent) ); // Find window menu where children will be listed ccs.hWindowMenu = GetSubMenu( GetMenu(hwndparent), icount - 2 ); ccs.idFirstChild = 1000; // 0; // Create the MDI client filling the client area hwndMDIClient = CreateWindow ( _TEXT("mdiclient"), NULL, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE, 0, 0, 0, 0, hwndparent, ( HMENU ) 0xCAC, GetModuleHandle(NULL), ( LPSTR ) &ccs ); ShowWindow( hwndMDIClient, SW_SHOW ); hb_retnl( ( LONG ) hwndMDIClient ); } HB_FUNC( INITMDICHILDWINDOW ) { HWND hwndChild; MDICREATESTRUCT mcs; TCHAR rgch[ 150 ]; static int cUntitled; int Style = 0; if( hb_parl(9) ) // Заголовок rgch[ 0 ] = 0; else { if( hb_parc_t(2) == NULL ) wsprintf( rgch, _TEXT("Untitled%d"), cUntitled++ ); else { lstrcpyn( rgch, hb_parc_t(2), 149 ); rgch[ 149 ] = 0; } } if( !hb_parl(7) ) Style = Style | WS_MINIMIZE; // BOX; if( !hb_parl(8) ) Style = Style | WS_MAXIMIZE; // BOX; if( hb_parl(10) ) Style = Style | WS_VSCROLL; if( hb_parl(11) ) Style = Style | WS_HSCROLL; // Create the MDI child window mcs.szClass = _TEXT("MdiChildWndClass"); // window class name mcs.szTitle = rgch; // window title mcs.hOwner = GetModuleHandle( NULL ); // owner mcs.x = hb_parni( 3 ); // x position mcs.y = hb_parni( 4 ); // y position mcs.cx = hb_parni( 5 ); // width mcs.cy = hb_parni( 6 ); // height mcs.style = Style; // window style mcs.lParam = 0; // lparam hwndChild = ( HWND ) SendMessage( ( HWND ) hb_parnl(1), WM_MDICREATE, 0, ( LPARAM ) ( LPMDICREATESTRUCT ) &mcs ); // if( hwndChild != NULL ) // ShowWindow( hwndChild, SW_SHOW ); // SW_SHOWMAXIMIZED // if( hwndChild != NULL ) // ShowWindow( hwndChild, SW_HIDE ); // SW_SHOWMAXIMIZED hb_retnl( ( LONG ) hwndChild ); } HB_FUNC( SHOWMDICHILDWINDOW ) { HWND hwndChild = ( HWND ) hb_parnl( 1 ); if( IsWindow( hwndChild ) ) ShowWindow( hwndChild, SW_SHOW ); } HB_FUNC( HIDEMDICHILDWINDOW ) { HWND hwndChild = ( HWND ) hb_parnl( 1 ); if( IsWindow( hwndChild ) ) ShowWindow( hwndChild, SW_HIDE ); } #define SHIFTED 0x8000 #define NEED_CTRL(S) ((S & WS_TABSTOP)==WS_TABSTOP)&&((S & WS_VISIBLE)==WS_VISIBLE)&&((S & WS_DISABLED)!=WS_DISABLED) HWND _GetFirstCtrl(HWND hControl ){ LONG nStyle; HWND h = GetParent( hControl ); h = GetWindow( h, GW_HWNDFIRST ); while( IsWindow( h ) ){ nStyle = GetWindowLong( h, GWL_STYLE); if( NEED_CTRL( nStyle ) ) return h; h = GetWindow( h, GW_HWNDNEXT ); } return NULL; } HWND _GetNextCtrl(HWND hChild, int Sh ){ HWND h, hFocus; LONG nStyle; DWORD flag, lFocus; BOOL lSh; if(Sh < 0 ) lSh = (GetKeyState( VK_SHIFT) & SHIFTED) != 0; else lSh = Sh > 0; hFocus = GetFocus(); flag = (lSh) ? GW_HWNDPREV : GW_HWNDNEXT ; h = GetWindow(hChild, GW_CHILD); // Текущее дочернее h = GetWindow(h, (lSh) ? GW_HWNDLAST : GW_HWNDFIRST ); lFocus = 0; while( IsWindow(h) && ! lFocus ){ // Ищем сл. в зависимости от флага - flag if( hFocus==h ) lFocus++; h = GetWindow( h, flag); } if( lFocus ){ // Если найдено то while( IsWindow(h) ){ nStyle = GetWindowLong(h, GWL_STYLE); if( NEED_CTRL( nStyle ) ) return h; h = GetWindow( h, flag); } } h = GetWindow(hChild, GW_CHILD); // Текущее дочернее h = GetWindow(h, (lSh) ? GW_HWNDLAST : GW_HWNDFIRST ); while( IsWindow(h) ){ nStyle = GetWindowLong(h, GWL_STYLE); if( NEED_CTRL( nStyle ) ) return h; h = GetWindow( h, flag); } return NULL; } HB_FUNC( _DOMDIMESSAGELOOP ) { MSG Msg; HWND h, hWndChild; BOOL lLoop; while( GetMessage(&Msg, NULL, 0, 0) ) { if( !TranslateMDISysAccel(hwndMDIClient, &Msg) ) { lLoop = TRUE; // Стандартно обработать if( Msg.message==WM_KEYDOWN && Msg.wParam==VK_TAB ) { if( GetWindowLong( Msg.hwnd, GWL_USERDATA) != MET_FOR_GETBOX) { hWndChild = ( HWND ) SendMessage( hwndMDIClient, WM_MDIGETACTIVE, 0, 0); h = _GetNextCtrl( hWndChild, -1); if( h!=NULL && IsWindow(h) ){ SetFocus( h ); lLoop = FALSE; } } } if(lLoop){ h = GetActiveWindow(); if( ! IsWindow( h ) || ! IsDialogMessage( h, &Msg) ) { TranslateMessage( &Msg ); // Translates virtual key codes DispatchMessage( &Msg ); // Dispatches message to window } } } } return; } /* GetNextDlgTabITemMDI( hWnd ) // , GetFocus() , lPrevious ) */ HB_FUNC( GETNEXTDLGTABITEMMDI ) // ( hWnd, GetFocus() , lPrevious ) { HWND h, hWndChild = ( HWND ) hb_parnl( 1 ); BOOL lShift = hb_parl(2); h = _GetNextCtrl( hWndChild, ((lShift) ? 1 : 0) ); // if( h!=NULL && IsWindow(h) ) SetFocus( h ); hb_retnl( ( LONG ) h ); } HB_FUNC( GETFIRSTDLGTABITEMMDI ) // ( hWnd, GetFocus() , lPrevious ) { HWND h, hWndChild = ( HWND ) hb_parnl( 1 ); // BOOL lShift = hb_parl(2); h = _GetFirstCtrl( hWndChild ); // , ((lShift) ? 1 : 0) ); // if( h!=NULL && IsWindow(h) ) SetFocus( h ); hb_retnl( ( LONG ) h ); } HB_FUNC( TRANSLATEMDISYSACCEL ) { hb_retl( TranslateMDISysAccel( ( HWND ) hb_parnl(1), ( MSG * ) hb_parc_t(2) ) ); } HB_FUNC( ARRANGEICONICWINDOWS ) { hb_retni( ArrangeIconicWindows( ( HWND ) hb_parnl(1) ) ); } HB_FUNC( DEFMDICHILDPROC ) { hb_retnl( DefMDIChildProc( ( HWND ) hb_parnl(1), hb_parnl(2), hb_parnl(3), hb_parnl(4) ) ); } HB_FUNC( DEFFRAMEPROC ) { hb_retnl( DefFrameProc( ( HWND ) hb_parnl(1), ( HWND ) hb_parnl(2), hb_parnl(3), hb_parnl(4), hb_parnl(5) ) ); } HB_FUNC( GETCLIENTRECT ) { RECT rect; hb_retl( GetClientRect( ( HWND ) hb_parnl(1), &rect) ); HB_STORNL( rect.left, 2, 1 ); HB_STORNL( rect.top, 2, 2 ); HB_STORNL( rect.right, 2, 3 ); HB_STORNL( rect.bottom, 2, 4 ); } HB_FUNC( SIZECLIENTWINDOW ) { RECT rc, rcClient; GetClientRect( ( HWND ) hb_parnl(1), &rcClient ); if( hb_parnl(2) ) { GetWindowRect( ( HWND ) hb_parnl(2), &rc ); ScreenToClient( ( HWND ) hb_parnl(1), ( LPPOINT ) &rc.left ); rcClient.bottom = rc.top; } rcClient.top = hb_parnl( 4 ); MoveWindow( ( HWND ) hb_parnl(3), rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, TRUE ); } [/pre2]

SergKis: PS. На MdiChild окнах исп. GetBox, TextBox по прежнему сбивает фокус - не побороли.

gfilatov2002: Andrey пишет: Нашёл непонятку в сборке 17.11 - перестала работать команда: DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE cResFon, где cResFon - PNG картинка. Попробуй записать эту команду таким образом DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE &cResFon У меня работает нормально с PNG картинкой

Andrey: gfilatov2002 пишет: &cResFon Да, так заработало ! Спасибо !

gfilatov2002: Andrey пишет: Библиотека сборки 17.12 уже опубликована или ещё нет ? По секрету, она будет опубликована в понедельник

Andrey: gfilatov2002 пишет: По секрету, она будет опубликована в понедельник Здорово ! Ждем ! А можно в следующей версии сделать изменение для Checklabel ? Сейчас Checklabel не работает с PNG-картинкой, хочется чтобы заработал. А у BMP-слишком белый фон лезет, на разных цветах. Пример отослал на почту.

Vlad04: Andrey Пример отослал на почту Мог бы примеры и выкладывать для общего обозрения

Andrey: Vlad04 пишет: Мог бы примеры и выкладывать для общего обозрения Зачем выкладывать нерабочий пример ? Там PNG-картинка не работает. Как Григорий его подправит, тогда можно и выложить. А законченные примеры смотри, я их выкладываю: http://abonent4.ru/minigui/ http://abonent4.ru/fastreport/ http://abonent4.ru/letodb/

gfilatov2002: Опубликована очередная сборка 17.12 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-17.12-setup.exe Имеются в наличии также готовые сборки для следующих пар (Си-компилятор+Харбор): - MinGW 7.2.0 32-bit для Harbour 3.2.0dev; - MinGW 7.2.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.2.0dev. ссылки на которые будут доступны по Вашему запросу Поздравляю всех с наступающим Днем святого Николая



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