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

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

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

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

gfilatov2002: SergKis пишет: тогда в 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(...).



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