Автор | Сообщение |
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №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
|
| moderator
|
Пост N: 1140
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.07.17 21:03. Заголовок: SergKis пишет: тогд..
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
|
| постоянный участник
|
Пост N: 1587
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.07.17 11:47. Заголовок: gfilatov2002 Был не..
gfilatov2002 Был не прав применив CLASSDATA, т.к. хотел другого. Поправил Скрытый текст
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 Работает как надо. Пробовал пересобрать Вашу сборку ... не сошлось что то.
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1141
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.07.17 12:58. Заголовок: SergKis пишет: Рабо..
SergKis пишет: Подтверждаю, что после этих исправлений все работает нормально SergKis пишет: цитата: | Пробовал пересобрать Вашу сборку |
| Выложил очередную бетку с учетом Ваших изменений по старому адресу. Благодарю за оперативную помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1589
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.07.17 21:42. Заголовок: gfilatov2002 Такой ..
gfilatov2002 Такой пример получился с исп. MESSAGEONLY ... Скрытый текст
/* * 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
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1590
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.07.17 21:49. Заголовок: PS пропустил ошибку ..
PS пропустил ошибку ACCESS WmApp INLINE ( WM_USER + 100 ) надо ACCESS WmApp INLINE ( WM_USER + ::nApp )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1142
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.07.17 16:16. Заголовок: SergKis пишет: прим..
SergKis пишет: Благодарю за хороший пример для новой сборки
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1143
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.07.17 11:49. Заголовок: Подготовил первый RC..
Подготовил первый RC для новой сборки 17.07 со следующим списком изменений Скрытый текст
* 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)
| Благодарю за оперативную помощь в подготовке этой сборки SergKis
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1591
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.07.17 13:56. Заголовок: gfilatov2002 В клас..
gfilatov2002 В класс TCnlData добавил METHOD SetSize( y, x, w, h ) INLINE _SetControlSizePos( ::cName, ::oWin:cName, y, x, w, h )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1144
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.07.17 15:33. Заголовок: SergKis пишет: В кл..
SergKis пишет: Благодарю за помощь Добавил этот метод также...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1592
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.07.17 16:22. Заголовок: gfilatov2002 У себя..
gfilatov2002 У себя сделал такие штуки (на Ваше усмотрение) Скрытый текст
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 ...
|
| |
|
Alex_Cher
|
| |
Пост N: 47
Зарегистрирован: 18.06.15
|
|
Отправлено: 20.07.17 07:37. Заголовок: SergKis пишет: У се..
SergKis пишет: цитата: | У себя сделал такие штуки |
| Мужики, вы конечно классные профи в своем деле и я рад за вас и дай вам бог здоровья, но подскажите рядовому программеру как все это можно реально использовать в своей работе, где об этом можно почитать, ну пусть даже по англицки (лично я читаю по англицки только через гугол). Только не посылаете меня к примерам ... там до все нюансов все равно не докопаться ... .... может я и не прав, но тогда к чему все эти ваши терки.
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 1593
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 08:38. Заголовок: Alex_Cher пишет как ..
Alex_Cher пишет цитата: | как все это можно реально использовать в своей работе |
| Какой момент вас интересует ? Если последний со StatusBar и ClientHeight, то исп. так 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) сохранить данные контролов где то. На события можно повесить расчеты\формы\отправки писем ... Т.е. ваша прогр. начинает работать (как и система) через сообщения
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1594
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 08:53. Заголовок: PS Посылать сообщени..
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
|
| moderator
|
Пост N: 1145
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.17 10:24. Заголовок: SergKis пишет: Како..
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
|
| moderator
|
Пост N: 1146
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.17 10:31. Заголовок: Alex_Cher пишет: ....
Alex_Cher пишет: Прав, конечно Alex_Cher пишет: цитата: | где об этом можно почитать |
| Документация Харбора - doc\xhb-diff.txt -doc\en\command.txt цитата: | $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). |
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1595
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 11:42. Заголовок: gfilatov2002 пишет И..
gfilatov2002 пишет Все правильно Вы пишете , разница в том, что на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка, т.е. есть\нет StatusBar - все работает. Запись oWnd:Stb:Say... предполагает точное наличие StatusBar. Потому и написал "на Ваше усмотрение". SplitBox высота исп., только для расчета ClientHeight, т.е. ToolBar на SplitBox и StatusBar вычитаются из высоты клиентской области окна. Возможно, надо сделать переменные :nTop, ::nRight, ::nBottom, :nLeft и управлять ими, для клиентской области - общий случай для окна.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1596
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 11:46. Заголовок: Alex_Cher пишет: где..
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1597
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 12:01. Заголовок: gfilatov2002 пишет В..
gfilatov2002 пишет цитата: | Ведь эти элементы управления имеют свои собственные объекты |
| #xcommand DEFINE SPLITBOX ; ..., т.е. FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted ) ... не создает объект (и реальных размеров SplitBoxа еще не будет, появятся только в #xcommand END SPLITBOX), потому менял FUNCTION _EndSplitBox ()
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1147
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.17 12:15. Заголовок: SergKis пишет: на у..
SergKis пишет: цитата: | на уровне окна идет проверка, есть StatusBar, работаем, нет - пустышка |
| Понятно, тогда просто м.б. использовать проверку на уровне окна цитата: | :::IsStb := _IsControlDefined( "StatusBar", ::cName ) ) |
| и далее использовать эту переменную для проверки наличия статуса у окна SergKis пишет: цитата: | FUNCTION _DefineSplitBox ( ParentForm, bottom, inverted ) ... не создает объект |
| Все верно, но она помещает требуемый для расчета ClientHeight хэндл в элемент массива родительского окна цитата: | _HMG_aFormReBarHandle [ i ] := ControlHandle |
| который Вы можете использовать в классе окна как ::nReBarHandle := _HMG_aFormReBarHandle [ ::Index ] без необходимости изменять функцию _EndSplitBox ()
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1598
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 12:46. Заголовок: gfilatov2002 пишет к..
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
|
| постоянный участник
|
Пост N: 5434
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.17 15:28. Заголовок: SergKis - лучше напи..
SergKis - лучше напиши демонстрашку маленькую, тогда понятней будет для чего всё это затевается ! Только с комментариями на русском !
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 1599
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 16:14. Заголовок: Andrey пишет лучше н..
Andrey пишет цитата: | лучше напиши демонстрашку маленькую, тогда понятней будет для чего всё это затевается |
| Вроде для чего и примеры, разъяснения все время даю. Выйдет версия посмотри примеры и перечитай написанное для начала. Затевается для работы с окнами\контролами через посылку сообщений, как дополнение к тому что есть в hmg.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1148
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.17 22:15. Заголовок: SergKis пишет: CLAS..
SergKis пишет: цитата: | CLASS TStbData INHERIT TCnlData |
| Добавил предложенный класс в ядро библиотеки (с исправлением обнаруженных опечаток) и проверил его работу на простом примере: Скрытый текст
#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
| Этот пример отработал нормально. Благодарю за помощь P.S. Еще, по-видимому, надо добавить обработчик ошибок в родительский класс TWndData: цитата: | ERROR HANDLER OnError( uParam1 ) |
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1600
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 23:22. Заголовок: gfilatov2002 пишет n..
gfilatov2002 пишет цитата: | nY := GetWindowHeight( _HMG_aFormReBarHandle [ oWnd:Index ] ) |
| Это возможный вариант, но красивее тогда как было DEFINE SPLITBOX HANDLE hSplit ... nY := GetWindowHeight(hSplit) По поводу ERROR HANDLE ... пока не задумывался, но, наверно, надо.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1601
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.07.17 23:28. Заголовок: gfilatov2002 пишет n..
gfilatov2002 пишет цитата: | nH := This.ClientHeight - GetWindowHeight( oWnd:Stb:Handle ) - nY |
| Можно так nH := This.ClientHeight - oWnd:Stb:Height - nY
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1149
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.07.17 10:09. Заголовок: SergKis пишет: крас..
SergKis пишет: SergKis пишет: Благодарю за помощь! Поправил, конечно...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1602
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.07.17 10:38. Заголовок: gfilatov2002 пишет P..
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
|
| постоянный участник
|
Пост N: 1603
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.07.17 10:50. Заголовок: PS PUBLIC oForm := T..
PS PUBLIC oForm := ThisWindow.Object можно делать и PRIVATE ..., к примеру PRIV oDokum := ThisWindow.Object PRIV oKlient := ThisWindow.Object ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1150
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.07.17 11:09. Заголовок: SergKis пишет: для..
SergKis пишет: цитата: | для примера PUBL oMain := ThisWindow.Object PRIV oWnd := oMain |
| Благодарю за пояснение! Поправил пример с учетом этой логики
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1606
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.07.17 18:20. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение по GetBox, добавить события LDblClick и WM_KEYDOWN VK_F... Изменения Скрытый текст
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 ) }) ...
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1607
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.07.17 18:23. Заголовок: PS пока переносил по..
PS пока переносил потерял 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
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 1608
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.07.17 18:32. Заголовок: PS нашел у себя стар..
PS нашел у себя старую ошибку (замену не делал, потому и не натыкался) 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
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5435
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.07.17 21:39. Заголовок: SergKis пишет: цита..
SergKis пишет: цитата: Это надо при работе с ячейками и lEdit := .T. gfilatov2002 пишет: цитата: | Понятно, я уже добавил этот переключатель |
| Т.е. можно делать так при настройке тсб : oBrw:lNoKeyChar := .T. // отключить edit от нажатия клавиш цифр\букв В какой версии этот переключатель есть ?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1151
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.07.17 13:00. Заголовок: Andrey пишет: В как..
Andrey пишет: цитата: | В какой версии этот переключатель |
| В новой, которая выйдет на следующей неделе
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1152
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.07.17 13:04. Заголовок: SergKis пишет: Пред..
SergKis пишет: Благодарю за Ваше предложение - все работает Также интересует добавить выделение текста GetBox при нажатии и удержании клавиши Shift вместе со стрелками влево/вправо
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1609
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.07.17 14:30. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет цитата: | Также интересует добавить выделение текста GetBox при нажатии и удержании клавиши Shift вместе со стрелками влево/вправо |
| Еще интересует LDblClick на GetBox в состоянии ReadOnly, но я пока плохо знаю систему get в hb3.2, надо изучать (в hb2.0 иначе) Надо иметь ввиду, что в блоке кода (в предложении) НЕ создается среда _HMG_This... контрола, т.к. в классе GET нет переменной Index, связывать с _DoControlEventProcedure ( bBlock, i, ... ) я не стал, т.к. сам использую блоки кода для сообщений.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5438
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.17 16:29. Заголовок: Перешёл на версию 17..
Перешёл на версию 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
|
| moderator
|
Пост N: 1153
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.07.17 16:40. Заголовок: Andrey пишет: Как и..
Andrey пишет: цитата: | _SetGetUserData (cObject, cForm, cObject) // Cargo |
| эквивалентно цитата: | SetProperty (cForm, cObject, 'Cargo', cObject) |
|
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5439
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.07.17 16:41. Заголовок: А эту функцию - _SET..
А эту функцию - _SETCONTROLACTION как исправить ? _SetControlAction(cObj, cForm, bBlock , 'ONLOSTFOCUS' ) И вот это как исправить _SetGetUserData(cObjDop, cForm, .F. ) ? Правильно или нет - SetProperty (cForm, cObjDop, 'Cargo', .F.) ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1611
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.07.17 09:08. Заголовок: gfilatov2002 Добавк..
gfilatov2002 Добавка к классам Скрытый текст
/////////////////////////////////////////////////////////////////////////////// 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 ...
| Использование 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
|
| moderator
|
Пост N: 1154
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.07.17 09:41. Заголовок: SergKis пишет: Доба..
SergKis пишет: Принимается с благодарностью Выложу обновленные исходники со всеми последними изменениями для Вашего ознакомления по старому адресу чуть позже P.S. Обновил - можете скачать для проверки
| |
|
|
SergKis
|
| постоянный участник
|
Пост N: 1612
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.07.17 11:39. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет цитата: | Обновил - можете скачать для проверки |
| Добавил Скрытый текст
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 ) } ) ...
| для наглядности
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1155
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.07.17 12:10. Заголовок: SergKis пишет: для ..
SergKis пишет: Благодарю Добавил, конечно
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1616
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.07.17 11:31. Заголовок: gfilatov2002 Вы был..
gfilatov2002 Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) Немного по GetBox Скрытый текст
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 ... Это, конечно, не все режимы, остальные позже.
| Потестить надо, я покрутил, но ... Может задуматься об управлении Tone(...), у себя убрали совсем (только мешает). Можно в класс внести Get внести переменную и плясать от нее или как то иначе ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1159
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.07.17 11:48. Заголовок: Завершена подготовка..
Завершена подготовка новой сборки 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
|
| moderator
|
Пост N: 1160
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.07.17 11:51. Заголовок: SergKis пишет: Немн..
SergKis пишет: Это уже изменения для следующей сборки, если таковая появится в обозримом будущем...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1617
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.07.17 16:39. Заголовок: gfilatov2002 Если д..
gfilatov2002 Если добавить в TsBrowse 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 ... то можно обходиться без SET RELATION Скрытый текст
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
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1161
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.07.17 22:37. Заголовок: SergKis пишет: Немн..
SergKis пишет: Благодарю за помощь! Не удержался, и решил включить эти изменения в новую сборку (уже давно был запрос на такие возможности в GetBox)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1162
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.07.17 10:32. Заголовок: Опубликована очередн..
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1618
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.07.17 16:14. Заголовок: gfilatov2002 Пропущ..
gfilatov2002 Пропущено 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 ...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5449
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.17 16:16. Заголовок: Пробую новую версию...
Пробую новую версию. Глобальный переключатель oBrw:lNoKeyChar := .T. // отключить edit от нажатия клавиш цифр\букв теперь есть ! Это классно. А нельзя ли сделать такой же переключатель - только выборочно по столбцам ? Типа oBrw:aColumns[nI]:lNoKeyChar := .F. Для ENTER же есть - oBrw:aColumns[nI]:lEdit := .F. Или как то блокировать редактирование полей справочника ? Т.е. в тестовом проекте (который я высылал Tsb_composite(1.6).7z), редактируется неизвестно что, после нажатия букв/цифр на колонке справочника. Хотя я там блокирую редактирование: oBrw1:aColumns[9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), FALSE }
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1619
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.07.17 16:33. Заголовок: Andrey такой перекл..
Andrey такой переключатель у тебя в руках Скрытый текст
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.
|
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5450
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.17 16:40. Заголовок: SergKis пишет: тако..
SergKis пишет: цитата: | такой переключатель у тебя в руках |
| Я согласен что он в руках. Но хочется простоты, без обработки функции - :bKeyDown или :bUserKeys Просто на столбце задать запрет и всё. Если глянешь мой пример, то там нет в основной таблице: oBrw1:bKeyDown или oBrw1:bUserKeys. Для многих программ их и не надо.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1620
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.07.17 16:44. Заголовок: Andrey пишет Хотя я ..
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
|
| постоянный участник
|
Пост N: 1621
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.07.17 16:55. Заголовок: Andrey пишет Для мно..
Andrey пишет цитата: | Для многих программ их и не надо. |
| Ты хочешь управлять METHOD KeyChar(...) на самом деле и тогда, вероятно, надо делать, добавив переменную в класс DATA bKeyChar 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
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1163
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.07.17 16:59. Заголовок: SergKis пишет: Проп..
SergKis пишет: Благодарю, уже поправил в архиве на сайте
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5451
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.17 17:02. Заголовок: SergKis пишет: oBrw..
SergKis пишет: цитата: | oBrw1:aColumns[9]:bPrevEdit := {|xv,ob| xv := ob, SelectStreet(oBrw1), TblFocus(), ob:nUserKey := 255, FALSE } |
| Не работает ! Все равно редактирует поле справочника после выбора из справочника !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1164
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.07.17 11:19. Заголовок: Сделал быстрое обнов..
Сделал быстрое обновление новой сборки с учетом последних изменений. Список изменений см. ниже Скрытый текст
* 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)
| Прямая ссылка на архив http://hmgextended.com/files/CONTRIB/hmg-17.07.7z
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1165
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.08.17 11:49. Заголовок: SergKis пишет: Вы б..
SergKis пишет: цитата: | Вы были правы, надо добавить в класс TWndData ACCESS IsStatusBar INLINE ! Empty(::oStatusBar) |
| Благодарю Добавил в класс такую строку цитата: | ACCESS HasStatusBar INLINE !( Empty( ::oStatusBar ) ) |
|
Пример использования: IF oWnd:HasStatusBar SetStatusbarProperties() ENDIF Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5457
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.08.17 12:51. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... |
| Есть для Tsbrowsa ! Сделать блокирование столбцов на цифры/буквы, что бы можно было задавать отдельно на любой столбец ! Желательно отдельно - вот так: oBrw:aColumns[nI]:lNoKeyChar := .F. Тогда кода можно будет меньше делать, т.е. можно будет обходиться без :bUserKeys и :bKeyDown Для простых задач - самое нужное ! Для примера смотреть - Tsb_composite
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1625
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.08.17 13:13. Заголовок: Andrey пишет oBrw:aC..
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
|
| постоянный участник
|
Пост N: 1626
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.08.17 13:17. Заголовок: PS Можно в Cargo кол..
PS Можно в Cargo колонки записать состояние для :lNoKeyChar и oBrw:aColumns[nI]:bPrevEdit := {|xv,ob| xv := ob, ob:lNoKeyChar := ob:aColumns[ob:nCell]:Cargo, .T. }
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1627
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.08.17 15:14. Заголовок: Andrey пишет oBrw:aC..
Andrey пишет цитата: | oBrw:aColumns[nI]:lNoKeyChar := .F. |
| В примере Tsb_composite, на 9,10 колонках в :bPrevEdit вызов списков, поэтому, даже введя такую переменную в колонку, не решим проблему вкл. Edit, т.к. по цифре\букве мы уже в методе :KeyDown и вызывается :Edit. В примере со списком в :bprevEdit, работает oBrw1:aColumns[ 9]:bPrevEdit := {|| SelectStreet(oBrw1), TblFocus(), _PushKey( VK_ESCAPE ), FALSE } oBrw1:aColumns[10]:bPrevEdit := {|| SelectLang(oBrw1), _PushKey( VK_ESCAPE ), FALSE }
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5462
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.08.17 15:14. Заголовок: SergKis пишет: PS М..
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
|
| постоянный участник
|
Пост N: 5463
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.08.17 17:38. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... |
| Немного по дизайну. Надоел мне, да и юзерам тоже стандартный CHECKBOX .... Ну маленький он очень, пока мышкой попадёшь.... Можно ли сделать стандартны расширенный объект CHECKBOXEX в котором можно было бы задавать картинки для этого чекбокса. Не хочется связываться со своими самопальными элементами... Хочется стандартных элементов. Картинки можно взять из MiniGUI\SAMPLES\Advanced\Tsb_BitMaps\RES - check0.bmp и check1.bmp ( формат png тоже бы надо поддерживать )
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1628
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.08.17 17:54. Заголовок: Andrey А CheckLabel..
Andrey А CheckLabel не подходит ? BASIC\CheckLabel BASIC\CheckLabel_2
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5464
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.08.17 18:05. Заголовок: SergKis пишет: А Ch..
SergKis пишет: цитата: | А CheckLabel не подходит ? |
| Пропустил его... То что нужно ! Предлагаю добавить в этот пример добавить ещё один CheckLabel с картинками SAMPLES\Advanced\Tsb_BitMaps\RES - check0.bmp и check1.bmp
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5469
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.08.17 18:16. Заголовок: Григорий, можно полу..
Григорий, можно получить сборку последней версии МиниГуи для MS VisualC 2015 ? Попробовать хочу на нём собирать проекты.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1166
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.08.17 20:38. Заголовок: Andrey пишет: можно..
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5470
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.08.17 21:44. Заголовок: Спасибо ! :sm36: ..
Спасибо !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1170
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.08.17 12:24. Заголовок: Всем кому это интересно
Подготовил второй RC для следующей сборки 17.08 Список изменений см. ниже Скрытый текст
* 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)
|
Если у Вас есть интересные дополнения или пожелания, то пишите...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1177
Зарегистрирован: 11.02.10
|
|
Отправлено: 31.08.17 10:25. Заголовок: Опубликована очередн..
Опубликована очередная сборка 17.08 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу http://hmgextended.com/files/CONTRIB/hmg-17.08-setup.exe Благодарю за Ваше внимание P.S. Очень жаль, что в подготовке этой сборки не участвовал Петр
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5501
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.09.17 18:45. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Опубликована очередная сборка 17.08 для BCC 5.51 для компиляторов Harbour и xHarbour |
| Протестировал несколько систем на новой сборке. Полёт нормальный !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1181
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.09.17 13:21. Заголовок: Завершена подготовка..
Завершена подготовка очередной сборки 17.09, которая будет опубликована завтра. Список изменений см. ниже Скрытый текст
* 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)
| P.S. Увы, но в подготовке этой сборки не участвовал Петр Хорошая новость: в команду добавлен новый участник из Италии - Pierpaolo Martinello
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1182
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.09.17 10:04. Заголовок: Опубликована очередн..
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5541
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.09.17 15:14. Заголовок: Нашёл баг при сборке..
Нашёл баг при сборке проекта. При названии папки, где в конце стоит точка ( типа - XLS_to_CSV.) Вылет при сборке такой: Я так и не понял при чем тут MINIPRINT ?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1183
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.09.17 11:55. Заголовок: Сделал быстрое обнов..
Сделал быстрое обновление новой сборки с учетом последних исправлений. Список изменений см. ниже Скрытый текст
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)
| Прямая ссылка на архив http://hmgextended.com/files/CONTRIB/hmg-17.09.7z
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1184
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.17 14:27. Заголовок: Выполнил адаптацию б..
Выполнил адаптацию библиотеки к новому исправленному MinGW версии 7.20 в связке с Харбором 3.2dev Собранный Харбор брал с сайта http://whosaway.com Контрольные примеры отработали нормально, но удивил рост размера библиотеки на 35+ кБайт в сравнении с Харбором 3.4 Ваши комментарии приветствуются...
| |
|
Dima
|
| |
Пост N: 6605
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.10.17 15:10. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | в сравнении с Харбором 3.4 |
| А такой разве есть ?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1185
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.17 16:03. Заголовок: Dima пишет: такой р..
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5583
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.10.17 15:16. Заголовок: Пример SAMPLES\B..
Пример SAMPLES\BASIC\COLORED_TAB Добавляем в код строку: DEFINE TAB Tab_1 ; OF Form_1 ; ...... FONT "Arial Black" SIZE 16 BOLD ; .... Потом при изменении в меню Style (Top pages/Bottom pages) при прорисовке TAB идёт полоса, т.е. наименований табов не видно ! Как там бы учесть новую высоту Tab зависимую от высоты шрифта ?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1187
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.10.17 12:23. Заголовок: Всем, кому это интер..
| |
|
Haz
|
| |
Пост N: 1130
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.11.17 22:14. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Григорий спасибо. С каждым релизом проект МГ, движется вперёд. И без лести скажу - в этом большая Ваша заслуга. Лет примерно 17 назад думал стоит ли дальше использовать МГ после того как Роберто объявил об отказе от bcc. Но появился Ваш МГ экстендет и это решило выбор на тот момент. Потом появился MG ext под друие компиляторы и это только подтверждение тому что выбор правильный
| |
|
Dima
|
| |
Пост N: 6618
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.11.17 22:36. Заголовок: Haz пишет: И без ле..
Haz пишет: цитата: | И без лести скажу - в этом большая Ваша заслуга |
| +1
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1188
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.11.17 22:46. Заголовок: Haz пишет: это толь..
Haz пишет: цитата: | это только подтверждение тому что выбор правильный |
| Благодарю за добрые слова! Увы, но новых идей, как и энтузиазма, с годами не прибавляется... Поэтому очень важна Ваша поддержка, которая определяет, будет ли выходить новая сборка библиотеки Хочу поблагодарить за такую поддержку двух человек на этом форуме: Андрея Верченко и Сашу Савова
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1189
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.11.17 15:34. Заголовок: Подготовил второй RC..
Подготовил второй RC для следующей сборки 17.11 Список изменений см. ниже Скрытый текст
* 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)
| Если у Вас есть интересные дополнения или пожелания, то пишите...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5602
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.11.17 19:49. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Если у Вас есть интересные дополнения или пожелания, то пишите... |
| Есть предложение ! Расширить объект TEXTBOX форматом для INPUTMASK как в Харборе. Например: cFormat := "!" + REPL("Х",35) @ ... TEXTBOX Text_1 ...... ; INPUTMASK cFormat ; ....
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1190
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.11.17 21:32. Заголовок: Andrey пишет: Расши..
Andrey пишет: цитата: | Расширить объект TEXTBOX форматом для INPUTMASK |
| Именно по этой причине появился в MiniGUI Ex элемент управления GETBOX, который задумывался, как замена контролу TEXTBOX, и который поддерживает все Клипперовские форматы ввода (кстати, первоначально для GETBOX предлагалось использовать имя CLIPPERBOX )
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5603
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.17 11:14. Заголовок: Понял, Спасибо ! :s..
Понял, Спасибо ! Глюк при выводе CHECKLABEL в цветном TAB ! При первоначальном показе формы другие CHECKLABEL2,3,4 и 5 прорисовываются на Вкладке "Page_1". Почему ? Пример отправил на почту. А ещё заодно, можно ли добавить в объект CHECKLABEL свойство как у CHECKBOX: ON CHANGE ( lStaticF1p1 := GetProperty(ThisWindow.Name, This.Name, "Checked") ) вместо сейчас используемого: ONCLICK ( lStaticF1p1 := Form_1.Label_F1p1.Checked, Form_1.Label_F1p1.Checked := !lStaticF1p1 )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1191
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.11.17 11:53. Заголовок: Andrey пишет: При п..
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
|
| постоянный участник
|
Пост N: 5604
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.11.17 12:36. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Также можно использовать для перерисовки Таба в этой процедуре следующую строку |
| Спасибо ! Помогло !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1192
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.11.17 10:41. Заголовок: Опубликована очередн..
Опубликована очередная сборка 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
|
| постоянный участник
|
Пост N: 5605
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.11.17 16:53. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Если у Вас есть интересные дополнения или пожелания, то пишите... |
| Научился собирать свою DLL-ку с картинками, иконками и т.д. Как из полученной DLL-ки показывать эти ресурсы на форме - не знаю ! Хотелось бы иметь демо-пример, как это делать ? Свою сборку выслал на почту.
| |
|
Dima
|
| |
Пост N: 6638
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.11.17 17:14. Заголовок: Andrey Так примеры ..
Andrey Так примеры же есть
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1652
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.11.17 18:21. Заголовок: Dima пишет Андрей и..
Dima пишет [quote]` Андрей имеет ввиду, что сейчас ресурсы назначены на exe, переменная extern HINSTANCE g_hInstance; от нее пляшем. Он хочет уст. в g_hInstance новый handle hDll, сохранив старое значение. Поработав с рес. dll, потом вернуть старое значение от exe и ... Если я правильно понимяю
| |
|
Dima
|
| |
Пост N: 6639
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.11.17 18:45. Заголовок: SergKis пишет: Если..
SergKis пишет: Фиг его знает о чем он Я про этот пример C:\MiniGUI\SAMPLES\BASIC\Icons\demo2.prg
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1653
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.11.17 22:21. Заголовок: Dima пишет Я про это..
Dima пишет LoadIcon(...) имеет параметр для hDll, а bmp и т.д. работают от g_hInstance, к примеру HB_FUNC( LOADBITMAP ) { HBITMAP hBitmap; hBitmap = ( HBITMAP ) LoadImage( g_hInstance, hb_parc( 1 ), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR ); ... т.е. все image идут от g_hInstance
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5606
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.11.17 10:51. Заголовок: Dima пишет: Фиг его..
Dima пишет: цитата: | Фиг его знает о чем он Я про этот пример C:\MiniGUI\SAMPLES\BASIC\Icons\demo2.prg |
| Там только иконка. А как работать с картинками, звуком, CUSTOM из внешней DLL-ки - примеров нет.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1654
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.11.17 12:50. Заголовок: Andrey пишет А как р..
Andrey пишет цитата: | А как работать с картинками, звуком, CUSTOM из внешней DLL-ки - примеров нет. |
| Нет команды SET RESOURCE TO [<cDllName>] // подключить\отключить dll нет и примеров
| |
|
Dima
|
| |
Пост N: 6640
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.11.17 14:27. Заголовок: SergKis пишет: Нет ..
SergKis пишет: цитата: | Нет команды SET RESOURCE TO |
| По идее её можно слямздить в FW из source\winapi\resource.c В ней есть SETRESOURCES и FREERESOURCES из которых состоят команды в FW #xcommand SET RESOURCES TO <cName1> [,<cName2>] ; => ; [ SetResources( <cName2> ); ] SetResources( <cName1> ) #xcommand SET RESOURCES TO => FreeResources()
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1193
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.11.17 14:52. Заголовок: SergKis пишет: Нет ..
SergKis пишет: цитата: | Нет команды SET RESOURCE TO [<cDllName>] // подключить\отключить dll |
| Благодарю за наводку Добавил такую команду в новую сборку. Она позволяет сейчас вывести на форму следующие ресурсы из DLL: - картинка - картинка на кнопку BUTTONEX - иконка - анимация из AVI-файла Dima пишет: #xcommand SET RESOURCES TO <cName1> [,<cName2>] ; => ; [ SetResources( <cName2> ); ] SetResources( <cName1> ) #xcommand SET RESOURCES TO => FreeResources() Так и сделал...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5607
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.11.17 15:20. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Она позволяет сейчас вывести на форму следующие ресурсы из DLL: |
| А еще нужен звук и CUSTOM для выгрузки в файл...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1194
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.11.17 15:37. Заголовок: Andrey пишет: нужен..
Andrey пишет: цитата: | нужен звук и CUSTOM для выгрузки в файл |
| Пример со звуком и выгрузкой в файл отправил по почте...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5608
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.11.17 17:20. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Пример со звуком и выгрузкой в файл отправил по почте... |
| Классно получилось !!! Не ожидал, что так быстро получиться. А можно ресурсы загружать в переменные, а потом передавать их в другие функции и там на форму выводить ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1655
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.11.17 09:11. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение *-----------------------------------------------------------------------------* 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 ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1656
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.11.17 09:35. Заголовок: PS. Возможно пойдет ..
PS. Возможно пойдет и такое *-----------------------------------------------------------------------------* FUNCTION _DefineChkLabel ( ControlName, ParentFormName, x, y, Caption, w, h, ; ... DEFAULT ProcedureName TO {|| _SetValue( ControlName, ParentFormName, NIL ) }
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1195
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.11.17 12:30. Заголовок: SergKis пишет: Пред..
SergKis пишет: Благодарю за помощь! Принято в полном объеме
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1196
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.11.17 14:33. Заголовок: Подготовил очередную..
Подготовил очередную бетку для следующей сборки 17.12 Список изменений см. ниже Скрытый текст
* 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)
| Благодарю за Ваше внимание и поддержку
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1201
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.12.17 11:51. Заголовок: Всем, кому это интер..
Всем, кому это интересно Подготовил второй RC для следующей сборки 17.12 со следующим списком изменений (см. ниже) Скрытый текст
* 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)
| Благодарю за Ваше внимание всех, кто оказывал поддержку этому проекту
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5618
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.12.17 12:57. Заголовок: Григорий, а вот в со..
Григорий, а вот в соседней ветке Vlad04 интересуется как получить результат со справочника ! Я высылал тебе пример Tsb_composite - в нём есть такое ! Вдобавок ко всему можно прикрутить свой справочник городов и улиц, там тоже показано как делать. Т.е. добавить колонку справочника города, а в справочник улиц передавать фильтр по городу - KCITY==код и будет сразу работать. Если надо, то ещё раз вышлю архив примера.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1664
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.12.17 22:39. Заголовок: Попробовал в mdi пер..
Попробовал в mdi перевести несколько примеров ... Облом. Не работает. Может кому интересно (может я где не прав). Пример: http://my-files.ru/fzs4u1
| |
|
alexandr11
|
| |
Пост N: 29
Зарегистрирован: 17.12.14
|
|
Отправлено: 15.12.17 13:03. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Опубликована очередная сборка 17.11 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор лежит по адресу |
| Григорий, мне приглянулся hbtip.lib из этой сборки можно где-то взять его сырцы? боюсь, что сырцы harbour с github слишком для меня "сырые"
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1203
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 13:20. Заголовок: alexandr11 пишет: м..
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
|
| moderator
|
Пост N: 1204
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 13:24. Заголовок: SergKis пишет: Не р..
SergKis пишет: Очень нравятся Ваши примеры. Пересобрал этот пример с библиотекой из текущей сборки 17.12 - вроде, нет проблем. А что точно не работает в Вашем примере
| |
|
alexandr11
|
| |
Пост N: 30
Зарегистрирован: 17.12.14
|
|
Отправлено: 15.12.17 13:36. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Я так понимаю, что Вам нужен батник для сборки этой библиотеки |
| хотелось бы получить батник + именно те сырцы, чтобы пересобрать ее для себя если, конечно, это возможно... я с успехом цепляю эту библиотеку к своему проекту, но мне хотелось бы внести в нее изменения... а если я собираю hbtip.lib из последнего harbour night, то все выходит гораздо хуже... возможно, я просто не так ее собираю
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1665
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.12.17 14:01. Заголовок: gfilatov2002 пишет А..
gfilatov2002 пишет цитата: | А что точно не работает в Вашем примере |
| Dokum1 не работает EDITABLE в колонках, т.е. не меняется значения в колонке пробелом Dokum3 корректировка записи включена (загружены все 3-и окна dokum), нажатие на 1-ом поле Enter вызывает переключение фокуса окна на календарь. Label надписей у textbox не реагирует на BackColor, устанавливаю как у окна gProp(BColor)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1205
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 14:49. Заголовок: alexandr11 пишет: х..
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 Лог-файл сборки - ниже 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 Пробуйте
| |
|
alexandr11
|
| |
Пост N: 31
Зарегистрирован: 17.12.14
|
|
Отправлено: 15.12.17 14:52. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Григорий, большое спасибо!
| |
|
alexandr11
|
| |
Пост N: 32
Зарегистрирован: 17.12.14
|
|
Отправлено: 15.12.17 15:29. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Григорий, а где credent.prg взять?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1206
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 16:11. Заголовок: alexandr11 пишет: г..
alexandr11 пишет: Это заготовка класса, которую потом убрали из библиотеки цитата: | #include "hbclass.ch" /* * Credentials class * A way to give basic credentials */ CREATE CLASS TIPCredentials VAR cMethod VAR cUserid VAR cPassword ENDCLASS |
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1207
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 16:16. Заголовок: SergKis пишет: не р..
SergKis пишет: цитата: | не работает EDITABLE в колонках, т.е. не меняется значения в колонке пробелом Dokum3 корректировка записи включена (загружены все 3-и окна dokum), нажатие на 1-ом поле Enter вызывает переключение фокуса окна на календарь. Label надписей у textbox не реагирует на BackColor, устанавливаю как у окна gProp(BColor) |
| Да, есть такие ошибки Это подтверждает, что mdi-интерфейс еще не готов к серьезной работе Возможно, Вы можете помочь довести его до рабочего состояния
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1666
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.12.17 22:04. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет цитата: | помочь довести его до рабочего состояния |
| Не отказываюсь, но сил хватает посмотреть просмотреть Change.txt и некоторые примеры, к сожалению. Немного почистил пример и добавил управление на 4-ом item StatusBar: http://TransFiles.ru/4wcis Что бы было.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1208
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.17 22:50. Заголовок: SergKis пишет: сил ..
SergKis пишет: цитата: | сил хватает просмотреть Change.txt и некоторые примеры |
| Благодарю за внимание
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5630
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.12.17 02:24. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Пересобрал этот пример с библиотекой из текущей сборки 17.12 - вроде, нет проблем. |
| Я что то пропустил... Библиотека сборки 17.12 уже опубликована или ещё нет ? Нашёл непонятку в сборке 17.11 - перестала работать команда: DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE cResFon, где cResFon - PNG картинка. Раньше работала, а с какой версии перестала, уже и не найти.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1667
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.12.17 09:14. Заголовок: gfilatov2002 Глянул..
gfilatov2002 Глянул, c_WindowsMdi.c нашей версии, есть разница. Текст, как есть Скрытый текст
/*---------------------------------------------------------------------------- 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 ); }
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1668
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.12.17 10:03. Заголовок: PS. На MdiChild окна..
PS. На MdiChild окнах исп. GetBox, TextBox по прежнему сбивает фокус - не побороли.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1209
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.12.17 10:57. Заголовок: Andrey пишет: Нашёл..
Andrey пишет: цитата: | Нашёл непонятку в сборке 17.11 - перестала работать команда: DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE cResFon, где cResFon - PNG картинка. |
| Попробуй записать эту команду таким образом цитата: | DEFINE BKGBRUSH newBrush PATTERN IN &cFormName PICTURE &cResFon |
| У меня работает нормально с PNG картинкой
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5632
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.12.17 13:35. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Да, так заработало ! Спасибо !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1210
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.12.17 15:57. Заголовок: Andrey пишет: Библи..
Andrey пишет: цитата: | Библиотека сборки 17.12 уже опубликована или ещё нет ? |
| По секрету, она будет опубликована в понедельник
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5634
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.12.17 08:23. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | По секрету, она будет опубликована в понедельник |
| Здорово ! Ждем ! А можно в следующей версии сделать изменение для Checklabel ? Сейчас Checklabel не работает с PNG-картинкой, хочется чтобы заработал. А у BMP-слишком белый фон лезет, на разных цветах. Пример отослал на почту.
| |
|
Vlad04
|
| постоянный участник
|
Пост N: 744
Зарегистрирован: 13.10.05
|
|
Отправлено: 17.12.17 09:14. Заголовок: Andrey Пример отосл..
Andrey Мог бы примеры и выкладывать для общего обозрения
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5635
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.12.17 12:05. Заголовок: Vlad04 пишет: Мог б..
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1211
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.12.17 11:44. Заголовок: Опубликована очередн..
Опубликована очередная сборка 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. ссылки на которые будут доступны по Вашему запросу Поздравляю всех с наступающим Днем святого Николая
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5641
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.12.17 17:17. Заголовок: Vlad04 пишет: Мог б..
Vlad04 пишет: цитата: | Мог бы примеры и выкладывать для общего обозрения |
| Выкладываю - https://cloud.mail.ru/public/LaU2/K68x1AHwF Григорий ! Спасибо за новую версию ! Вижу новую доработку для TAB - function syntax: SetProperty ( Form, Tab, 'Enabled', nPage, .T.|.F. ) GetProperty ( Form, Tab, 'Enabled', nPage ) - pseudo-OOP syntax: Form.Tab.Enabled( nPage ) := .T.|.F. Form.Tab.Enabled( nPage ) --> lStatus А можно сделать вкладку Show/Hide по номеру ? Типа: Form.Tab.Visible( nPage ) := .T.|.F. Часто нужно скрывать/разрешать показ вкладок от желания пользователя.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1212
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.12.17 11:09. Заголовок: Andrey пишет: А мож..
Andrey пишет: цитата: | А можно сделать вкладку Show/Hide по номеру ? |
| Да, это легко решается на пользовательском уровне (см. рабочий пример ниже). Скрытый текст
#include "minigui.ch" Function Main Local p1 := p2 := p3 := .T. DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE 'Harbour MiniGUI Demo' ; MAIN ; ON SIZE SizeTest() DEFINE MAIN MENU DEFINE POPUP 'Style' MENUITEM 'Visible Page 1' ACTION ( p1 := !p1, Form_1.p1.Checked := p1, SetTab_1() ) NAME p1 CHECKED MENUITEM 'Visible Page 2' ACTION ( p2 := !p2, Form_1.p2.Checked := p2, SetTab_1() ) NAME p2 CHECKED MENUITEM 'Visible Page 3' ACTION ( p3 := !p3, Form_1.p3.Checked := p3, SetTab_1() ) NAME p3 CHECKED SEPARATOR MENUITEM 'Exit' ACTION ThisWindow.Release END POPUP END MENU SetTab_1() END WINDOW Form_1.Center Form_1.Activate Return Nil Procedure SizeTest() Form_1.Tab_1.Width := Form_1.Width - 30 Form_1.Tab_1.Height := Form_1.Height - 100 Return #define COLOR_BTNFACE 15 Procedure SetTab_1( lBottomStyle ) Local nColor := GetSysColor( COLOR_BTNFACE ) Local aColor := {GetRed( nColor ), GetGreen( nColor ), GetBlue( nColor )} Default lBottomStyle := .f. IF IsControlDefined(Tab_1, Form_1) Form_1.Tab_1.Release ENDIF DEFINE TAB Tab_1 ; OF Form_1 ; AT 10,10 ; WIDTH 600 ; HEIGHT 400 ; VALUE 1 ; BACKCOLOR aColor ; HOTTRACK ; HTFORECOLOR BLUE ; HTINACTIVECOLOR GRAY ; ;// ON CHANGE MsgInfo( 'Page is changed!' ) IF Form_1.p1.Checked PAGE 'Page &1' IMAGE 'Exit.Bmp' TOOLTIP 'TabPage 1' @ 100,100 BUTTON Button_1 CAPTION "Test" WIDTH 50 HEIGHT 50 ACTION MsgInfo('Test!') END PAGE ENDIF IF Form_1.p2.Checked PAGE 'Page &2' IMAGE 'Info.Bmp' TOOLTIP 'TabPage 2' END PAGE ENDIF IF Form_1.p3.Checked PAGE 'Page &3' IMAGE 'Check.Bmp' END PAGE ENDIF END TAB Return
| Надеюсь, что идея понятна
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5642
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.12.17 12:09. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Надеюсь, что идея понятна |
| СПАСИБО ! Буду применять у себя ! Попробовал... Фигня получается... Для одноцветного Tab работает, а для многоцветного нет. Пример отправил на почту.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1226
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.01.18 15:32. Заголовок: Продолжаем хорошие новости
Завершена подготовка первого RC для новой сборки 18.01 со следующими изменениями: - исправление обнаруженных ошибок и неточностей кода в ядре библиотеки; - добавлена поддержка картинок из внешней DLL для всех элементов управления (в текущей версии подделживается только ButtonEx); - добавлена в ядро новая функция GetDeskTopArea(), которая возвращает координаты рабочего стола без учета размеров панели задач; - добавлен новый метод ReDraw для всех окон и контролов; - исправления в билиотеках PScript, TSBrowse и WinReport; - новые примеры и обновления старых примеров (как обычно). Поздравляю всех с наступающим православным Рождеством!
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1690
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.01.18 19:57. Заголовок: gfilatov2002 Столкн..
gfilatov2002 Столкнулся с :lEnabled в тсб, метод :Enabled(...) в моей версии с цветами странное поведение: при :Enabled(.F.) сохраняет цвета и остается только Header и Footer (тела строк нет - белое), должно было быть серым (?) при :Enabled(.T) возвращает цвета нормально после :Refresh() и картинка со строками ок. отложил метод пока, использую только :lEnabled := .T.\.F., практически все хорошо, кроме :KeyDown, перемещает курсор, предлагаю (т.к. тексты версий совпадают в этом): METHOD KeyChar( nKey, nFlags ) CLASS TSBrowse ... If ! ::lKeyChar Return 0 ElseIf ! ::lEnabled Return 0 ElseIf ::nUserKey == 255 // from KeyDown() method Return 0 EndIf ... METHOD KeyDown( nKey, nFlags ) CLASS TSBrowse ... If ! ::lEnabled Return 0 Endif Default nFireKey := VK_F2 ... Присоединяюсь к поздравлению !
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1227
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.01.18 20:27. Заголовок: SergKis пишет: пред..
SergKis пишет: Принимается Благодарю за помощь
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5677
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.18 21:47. Заголовок: Всех с наступающим Р..
Всех с наступающим Рождеством ! Как там насчёт сделать вкладку Show/Hide по номеру ? А то пример стоит, не получается. Andrey пишет (Пост N: 5642): цитата: | Попробовал... Фигня получается... Для одноцветного Tab работает, а для многоцветного нет. Пример отправил на почту. |
| В примере, если закрыть вкладку 1 (Visible Page 1) и выйти из программы (сохраняются параметры), то после повторного запуска получается ошибка. Невозможно отобразить элементы на 1-ой вкладке: Error MGERROR/0 Control: Label_F1p1 Of Form_1 Not defined. Program terminated Это то понятно... Но как правильно сделать не знаю. Была бы скрытая вкладка, то такого бы не было - это раз ! И второе - цвета с не показываемой вкладки переходят на следующую вкладку ! С этим как бороться ? Если примера нет, могу выслать повторно. Я думаю этот пример желательно разместить в библиотеке. Хоть будет один сложный пример для всех желающих. Т.е. наглядное пособие сложного решения.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1691
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.01.18 11:39. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет Не отключенным оказалось WM_MOUSEWHEEL, можно делать METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse ... ElseIf nMsg == WM_MOUSEWHEEL If ::hWnd != 0 .and. ! ::lDontChange .and. :lEnabled nDelta := Bin2I( I2Bin( HiWord( nWParam ) ) ) / 120 ::MouseWheel( nMsg, nDelta, LoWord( nLParam ), HiWord( nLParam ) ) EndIf Return 0 ... посмотрев, думаю лучше будет METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse Local nDelta, ix Default ::lNoPaint := .F., ; //V90 ::lDontChange := .F. //V90 If ! ::lEnabled Return 0 EndIf If hb_IsBlock( ::bEvents ) ... но может упускаю что то ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1692
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.01.18 14:13. Заголовок: SergKis пишет но мож..
SergKis пишет цитата: | но может упускаю что то ? |
| В таком виде работу метода :Enabled. Поковырял, получилось так METHOD DrawLine( xRow ) CLASS TSBrowse ... // IF !::lEnabled // RETURN SELF // endif ... METHOD DrawSelect( xRow, lFoot ) CLASS TSBrowse ... // IF !::lEnabled // RETURN SELF // endif ... METHOD Enabled( lEnab ) CLASS TSBrowse ... IF ValType( lEnab ) == "L" ... ENDIF ::Refresh() ENDIF RETURN 0 ... METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TSBrowse ... // If ! ::lEnabled // Return 0 // EndIf ... ElseIf nMsg == WM_VSCROLL If ::lDontchange Return Nil EndIf if nLParam == 0 .and. ::Enabled Return ::VScroll( Loword( nWParam ), HiWord( nWParam ) ) endif Elseif nMsg == WM_HSCROLL If ! ::lEnabled Return 0 ElseIf ::lDontchange //V90 Return Nil //V90 EndIf //V90 Return ::HScroll( Loword( nWParam ), HiWord( nWParam ) ) ... ElseIf nMsg == WM_LBUTTONDBLCLK .and. _GetKeyState( VK_SHIFT ) If ! ::lEnabled Return 0 ElseIf ::lCanSelect .and. !::lEditable ::Selection() Endif ElseIf nMsg == WM_MOUSEWHEEL If ::hWnd != 0 .and. ::lEnabled .and. ! ::lDontChange nDelta := Bin2I( I2Bin( HiWord( nWParam ) ) ) / 120 ... METHOD KeyUp( nKey, nFlags ) CLASS TSBrowse If ! ::lEnabled Return 0 EndIf ... METHOD Selection() CLASS TSBrowse ... Заработал метод :Enabled(.F.\.T.) с раскраской (над цветами, возможно, еще надо поработать)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1228
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.01.18 16:54. Заголовок: SergKis пишет: Зара..
SergKis пишет: цитата: | Заработал метод :Enabled(.F.\.T.) с раскраской |
| Благодарю за помощь: все правки приняты
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1696
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.01.18 13:16. Заголовок: gfilatov2002 Еще пр..
gfilatov2002 Еще правки: METHOD Enabled( lEnab ) CLASS TSBrowse ... ::lEnabled := .F. ::SetColor( { 2 }, { CLR_HGRAY } ) ::SetColor( { 3, 4 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 9, 10 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 16, 17 }, { CLR_GRAY, CLR_HGRAY } ) ::SetColor( { 18, 19 }, { CLR_GRAY, CLR_HGRAY } ) ELSE ... CLASS TWndData ... VAR oName AS OBJECT VAR oHand AS OBJECT VAR lAction INIT .T. EXPORTED: ... ASSIGN Cargo( xVal ) INLINE _WindowCargo( Self, xVal ) ACCESS Action INLINE ::lAction ASSIGN Action( lAction ) INLINE ::lAction := ! empty(lAction) ACCESS StatusBar INLINE ::oStatusBar ... METHOD UserKeys( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ::oUserKeys:Set( Key, Block ), ; iif( ::lAction, ::oUserKeys:Do ( Key, Block, p2, p3 ), Nil ) ) METHOD Event ( Key, Block, p2, p3 ) INLINE iif( HB_ISBLOCK( Block ), ::oEvent:Set( Key, Block ), ; iif( ::lAction, ::oEvent:Do ( Key, Block, p2, p3 ), Nil ) ) METHOD PostMsg( nKey, nHandle ) INLINE iif( ::lAction, ; PostMessage(::nHandle, ::WM_nMsgW, nKey, hb_defaultValue(nHandle, 0)), Nil ) METHOD SendMsg( nKey, nHandle ) INLINE iif( ::lAction, ; SendMessage(::nHandle, ::WM_nMsgW, nKey, hb_defaultValue(nHandle, 0)), Nil ) METHOD Release() INLINE iif( ::IsWindow, iif( ::lAction, PostMessage(::nHandle, WM_CLOSE, 0, 0), Nil ), Nil ) ... как это работает в готовом реал. примере (на своей lib) http://my-files.ru/dkcnbc жмем F9 ToServ и блокируется работа всех кнопок и дверь выхода с окна с раскраской Похожий пример потом можно сгородить
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1697
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.01.18 13:30. Заголовок: PS Виноват, надо в a..
PS Виноват, надо в article.ini PathUmz=C:\UCHET\MATERIAL\SPR указать, создать и переписать из DATA U02.dbf Прога под конкретного клиента, по изменению Артикула в базе.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1698
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.01.18 14:11. Заголовок: PS по текстам так вы..
PS по текстам так выглядит Скрытый текст
FUNCTION MAIN( Base ) // MAIN function ... DEFINE WINDOW wMain ; AT 0, 0 ; WIDTH nWidth ; HEIGHT nHeight ; MINWIDTH nWdth ; MINHEIGHT nHeig ; MAXWIDTH nWdth ; MAXHEIGHT nHeig ; TITLE oApp:Title + ". " ; ICON oApp:Icon ; MAIN MDI TOPMOST ; ON INIT wMainInit() ; ON RELEASE wMainClose() ; ON INTERACTIVECLOSE wMainIsClose() ; BACKCOLOR oApp:BColor PUBL oMain := ThisWindow.Object WITH OBJECT ThisWindow.Object // ---- Window events :Event( 101, {|ow,ky| Artikul_Child (ow, ky) } ) :Event( 102, {|ow,ky| ow:Release() } ) END WITH // ---- Window events ... * ----------------------------------------------------------------------------------- * STATIC FUNC wMainInit() * ----------------------------------------------------------------------------------- * This.Topmost := .F. (ThisWindow.Object):PostMsg(101) RETURN NIL * ------------------------------------------------------------------------------------ * FUNC Artikul_Child( oWn, nKy ) * ------------------------------------------------------------------------------------ * ... DEFINE WINDOW &cWnd ; TITLE ' '+cCapt+' ' ; MDICHILD FOCUSED NOMINIMIZE ; ON RELEASE ( iif( select(cAls) > 0, (cAls)->( dbCloseArea() ), Nil ) ) cThisForm := cWnd oThisForm := Thiswindow.Object DEFINE SPLITBOX HANDLE hSpl DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 24,24 FLAT BUTTON BEDIT PICTURE 'Edit' ACTION (ThisWindow.Object):PostMsg(4) ; TOOLTIP ' ' + gTxt(RedLine) + '. ' + gTxt(Art) +'.' + space(8) + 'F4' ; SEPARATOR BUTTON BENTR PICTURE 'Vibor' ACTION (ThisWindow.Object):PostMsg(5) ; TOOLTIP ' ' + gTxt(Nam) + ' => ' + gTxt(Art) + space(8) + 'F5' ; SEPARATOR BUTTON BEMP1 PICTURE 'br_empty' ACTION NIL ; SEPARATOR BUTTON BKODS PICTURE 'p_ind' ACTION (ThisWindow.Object):PostMsg(6) ; TOOLTIP ' ' + gTxt(Sort ) + space(8) + 'F6' ; SEPARATOR BUTTON BFIND PICTURE 'p_find' ACTION (ThisWindow.Object):PostMsg(7) ; TOOLTIP ' ' + gTxt(Find ) + space(8) + 'F7' ; SEPARATOR BUTTON BEMP2 PICTURE 'br_empty' ACTION NIL ; SEPARATOR BUTTON BSERV PICTURE 'srv_to' ACTION (ThisWindow.Object):PostMsg(9) ; TOOLTIP ' ' + gTxt(ToServ) + space(8) + 'F9' ; SEPARATOR END TOOLBAR DEFINE TOOLBAR ToolBar_2 BUTTONSIZE 24,24 FLAT BUTTON BEXIT PICTURE 'exit' ACTION (ThisWindow.Object):PostMsg(10) ; TOOLTIP ' ' + gTxt(Exit) END TOOLBAR END SPLITBOX nW := ThisWindow.ClientWidth nY := GetWindowHeight(hSpl) nX := 0 nH := ThisWindow.ClientHeight - nY DEFINE TBRW &cBrw TO oTbr AT nY,nX WIDTH nW HEIGHT nH ALIAS cAls CELL :aColSel := aColumn :hFontHead := aFont[ 1 ] :hFontFoot := aFont[ 2 ] :LoadFields(.T.) :nWheelLines := 1 :nClrLine := COLOR_GRID :nHeightCell += nDcell :nHeightHead += nDcell :nHeightFoot := :nHeightCell :lNoGrayBar := .F. :lDrawFooters := .T. :lFooting := .T. :lNoVScroll := .F. :lNoHScroll := .T. :nFireKey := VK_F4 // default Edit :nLineStyle := LINES_ALL // LINES_NONE LINES_ALL LINES_VERT LINES_HORZ LINES_3D LINES_DOTTED :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {Rgb( 66, 255, 236), Rgb(209, 227, 248)}, ; {Rgb(220, 220, 220), Rgb(220, 220, 220)} ) } } ) For nI := 1 To nK oCol := :aColumns [ nI ] oCol:cName := aName [ nI ] oCol:cField := aColumn [ nI ] oCol:cHeading := aHeader [ nI ] oCol:nWidth := aWidth [ nI ] oCol:lEdit := aEdit [ nI ] oCol:nAlign := aAlign [ nI ] oCol:nFAlign := aFAlign [ nI ] oCol:lFixLite := aFixLite [ nI ] oCol:lOnGotFocusSelect := aOnGotFocusSelect[ nI ] oCol:lEmptyValToChar := aEmptyValToChar [ nI ] oCol:nEditMove := aEditMove [ nI ] If ! empty(aPicture [ nI ]) oCol:cPicture := aPicture [ nI ] EndIf If ! empty(aOrder[ nI ]) oCol:cOrder := aOrder [ nI ] EndIf If oCol:cName == "NMP" oCol:cFooting := { |nc,obr| nc := (obr:cAlias)->( OrdKeyNo() ), ; iif( empty(nc), '', hb_ntos(nc) ) } ElseIf oCol:cName == "EAN" oCol:cFooting := { |nc,obr| nc := (obr:cAlias)->( OrdKeyCount() ), ; ' '+iif( empty(nc), '', hb_ntos(nc) ) } EndIf If ! empty(aBlockData[ nI ]) If HB_ISCHAR(aBlockData[ nI ]) oCol:bData := AliasBlock(aBlockData[ nI ], cAls, .T.) Else oCol:bData := aBlockData[ nI ] EndIf EndIf If ! empty(aFields [ nI ]) oCol:cField := aFields [ nI ] EndIf Next :nFreeze := :nColumn('EAN') :lLockFreeze := .T. :nCell := :nColumn('NAM') :aSortBmp := { LoadImage("br_up"), LoadImage("br_dn") } :bChange := {|obr| obr:DrawFooters() } :bLDblClick := {|p1,p2,p3,obr| p1:=p2:=p3:=Nil, Do_Obj(obr:hWndParent):PostMsg(4) } :SetIndexCols( :nColumn('KOD'), :nColumn('NAM') ) :SetOrder( :nColumn('NAM') ) if :nLen > :nRowCount() :ResetVScroll( .T. ) :oHScroll:SetRange(0,0) EndIf :UserKeys(VK_F5 , {|obr,nky,cky| cky := (obr:cAlias)->( mGet('R_3') ), ; (obr:cAlias)->( mPut('R_34', cky) ), ; obr:DrawSelect() }) :UserKeys(VK_F6 , {|obr,nky,cky| Order_Set (obr,nky,cky) }) :UserKeys(VK_F7 , {|obr | Press_Key (obr ) }) :UserKeys(VK_F9 , {|obr | Modify_Srv(obr ) }) :UserKeys(VK_RETURN, {|obr | Do_Obj(obr:hWndParent):PostMsg(4) }) :UserKeys( , {|obr,nky,cky| Press_Key(obr,nky,cky)}) :GoPos(1, :nFreeze + 1) END TBRW oTbr:SetNoHoles() oTbr:SetFocus() cPic := StrTran( oTbr:GetColumn('KOD'):cPicture, '@K ', '' ) oCel := oTbr:GetCellInfo( 1, oTbr:nColumn('KOD') ) nY := This.ClientHeight - oTbr:nHeightFoot nX := 2 nW := oCel:nWidth - 5 nH := oTbr:nHeightCell @ nY, nX GETBOX KOD OBJ oGet HEIGHT nH WIDTH nW VALUE space(len(cPic)) ; BACKCOLOR oApp:BColorGet PICTURE cPic ; ON CHANGE Seek__Set(oTbr) ; INVISIBLE NOTABSTOP oGet:lOnGotFocusSelect := .F. oGet:OnEscape := {|og| og:GetObj():Hide(), oTbr:SetFocus(), .T. } oGet:OnEnter := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnDown := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnUp := {|og| og:GetObj():Hide(), oTbr:SetFocus() } cPic := StrTran( oTbr:GetColumn('NAM'):cPicture, '@K ', '' ) oCel := oTbr:GetCellInfo( 1, oTbr:nColumn('NAM') ) nX := oCel:nCol + 2 nW := oCel:nWidth - 10 @ nY, nX GETBOX NAM OBJ oGet HEIGHT nH WIDTH nW VALUE space(len(cPic)) ; BACKCOLOR oApp:BColorGet PICTURE cPic ; ON CHANGE Seek__Set(oTbr) ; INVISIBLE NOTABSTOP oGet:lOnGotFocusSelect := .F. oGet:OnEscape := {|og| og:GetObj():Hide(), oTbr:SetFocus(), .T. } oGet:OnEnter := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnDown := {|og| og:GetObj():Hide(), oTbr:SetFocus() } oGet:OnUp := {|og| og:GetObj():Hide(), oTbr:SetFocus() } WITH OBJECT This.Object // ---- Window events :Event( 4, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F4, 0 ) } ) :Event( 5, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F5, 0 ) } ) :Event( 6, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F6, 0 ) } ) :Event( 7, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F7, 0 ) } ) :Event( 9, {|| oTbr:PostMsg( WM_KEYDOWN, VK_F9, 0 ) } ) :Event(10, {|ow| ow:Release(), oMain:PostMsg(102) } ) END WITH // ---- Window events END WINDOW RETURN Nil ... * ------------------------------------------------------------------------------------ * STATIC FUNC Modify_Srv( oBrw ) * ------------------------------------------------------------------------------------ * LOCAL i, n LOCAL oWnd := Do_Obj(oBrw:hWndParent) LOCAL cWnd := oBrw:cParentWnd LOCAL cBrw := oBrw:cControlName If oWnd:Action oBrw:Enabled(.F.) oWnd:Action := .F. DoEvents() oMain:StatusBar:Say(gTxt(Wait)) For i := 1 To 20 oMain:StatusBar:Say(hb_ntos(i), 2) For n := 1 To 10 wApi_Sleep(100) DoEvents() Next Next oMain:StatusBar:Say('', 2) oMain:StatusBar:Say('') oBrw:Enabled(.T.) oWnd:Action := .T. DoEvents() EndIf oBrw:SetFocus() RETURN Nil ...
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1699
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.01.18 01:03. Заголовок: gfilatov2002 Что то..
gfilatov2002 Что то в TsBrowse не оказалось Cargo, может стоит добавить, для удобства ? oBrw:Cargo := 123 nVal := oBrw:Cargo
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1229
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.01.18 12:21. Заголовок: SergKis пишет: може..
SergKis пишет: Добавил, конечно, как и все Ваши предыдущие предложения. Благодарю за Ваше внимание
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5687
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.01.18 10:13. Заголовок: Присоединяюсь к доба..
Присоединяюсь к добавлениям ... Если конечно это не сложно и не помешает логике. ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Col") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Width") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height") Добавить ? oBrw:nRowWnd ? oBrw:nColWnd ? oBrw:nWidthWnd ? oBrw:nHeightWnd
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1700
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.01.18 10:40. Заголовок: Andrey This.Row Thi..
Andrey This.Row This.Col This.Width This.Height ThisWindow.Row ThisWindow.Col ThisWindow.Width ThisWindow.Height Form_1.Row Form_1.Col Form_1.Width Form_1.Height GetWindowRow(oBrw:hWndParent) GetWindowCol(oBrw:hWndParent) GetWindowWidth(oBrw:hWndParent) GetWindowHeight(oBrw:hWndParent) SET OOP ON oWnd := Do_Obj(oBrw:hWndParent) oWnd:Row oWnd:Col oWnd:Width oWnd:Height oTsb := Do_Obj(oBrw:hWnd) oTsb:Window:Row oTsb:Window:Col oTsb:Window:Width oTsb:Window:Height маловато будет ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1701
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.01.18 12:01. Заголовок: PS в дополнение созд..
PS в дополнение создать среду _HMG_This... для блока кода (при работе с тсб, к примеру) 1. для окна xRet := Do_WindowEventProcedure ( bBlock, GetFormIndex('Form_1'), p1, p2, p3, p4 ) 2. для контрола xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex('Имя_контрола', 'Form_1'), p1, p2, p3, p4 ) среда _HMG_This... для блока кода создается, потом восстанавливается предыдущая в продолжение SET OOP ON (без среды This) FUNC My( obj, par1, par2, par3 ) ... RETURN { par1,par2,par3, obj:IsWindow } 1. aRet := Do_Obj(oBrw:hWndParent, {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') или aRet := Do_Obj(GetFormHandle('Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') получим ? aRet[4] // .T. 2. aRet := Do_Obj(oBrw:hWnd, {|ob,p1,p2,p3| My(ob,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') или aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') получим ? aRet[4] // .F. в первом случае блок получит объект окна во втором объект Tsb\ контрола
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5688
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.01.18 12:16. Заголовок: SergKis пишет: мало..
SergKis пишет: В самый раз !
| |
|
Vlad04
|
| постоянный участник
|
Пост N: 754
Зарегистрирован: 13.10.05
|
|
Отправлено: 10.01.18 17:56. Заголовок: Примеры кода ... a..
Примеры кода цитата: | ... aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), или aRet := Do_Obj(GetControlHandle('Имя_контрола', 'Form_1'), {|ow,p1,p2,p3| My(ow,p1,p2,p3) }, 'AAA', 'BBB', 'CCC') ... |
| и др. Это , конечно, круто, но совсем не наглядно. На мой взгляд, все сложности и хитрости должны быть за "бортом" прикладных программ - где-то в исходниках библиотеки, dLL и т.п. Мне больше по душе : This.Row This.Col This.Width This.Height This.Value This.Name .. А все остальные действия должны быть типа 2+3 и т.п
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1702
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.01.18 19:37. Заголовок: Это , конечно, крут..
цитата: | Это , конечно, круто, но совсем не наглядно... Мне больше по душе |
| Где среда This создается - удобно, где ее нет, this уже не работает, в той же тсб. Есть ф-ии для добывания объктов o := _WindowObj(FormName\FormHandle) o := _ControlObj(ControlHandle[\ControlName, FormName]) вместо них использую получить любой объект по handle o := Do_Obj(Handle[, block,....]) в основном, исп. без блока, но при наличии массива Handle AEval(aHandle, {|nh| Do_Obj(nh, {|obj| MyFun(obj) }) }) даже очень ничего, т.е. AEval(_HMG_aFormHandles, {|nh,nn| Do_Obj(nh, {|obj| MyFun(obj, nn) }) }) обработаем все окна, причем в MyFun(oWnd) работать с объектом окна, т.е. oWnd:Type oWnd:Name oWnd:Index oWnd:Row oWnd:Col oWnd:Width oWnd:Height oWnd:ClientWidth oWnd:ClientHeight oWnd:Value ... crazy пример, перебор всех контролов всех окон AEval(_HMG_aControlHandles, {|nh,nn| Do_Obj(nh, {|obj| MyFun(obj, nn) }) }) MyFun(oCtl) будет работать с обектами контролов oCtl:Type oCtl:Name oCtl:Index oCtl:Row oCtl:Col oCtl:Width oCtl:Height oCtl:ClientWidth oCtl:ClientHeight oCtl:Value ... не все контролы вкл. в SET OOP ON, где то будет Nil возврат.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5689
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.01.18 22:22. Заголовок: Andrey пишет: Присо..
Andrey пишет: цитата: | Присоединяюсь к добавлениям ... Если конечно это не сложно и не помешает логике. ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Col") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Width") ? GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Height") Добавить ? oBrw:nRowWnd ? oBrw:nColWnd ? oBrw:nWidthWnd ? oBrw:nHeightWnd |
| SergKis пишет: цитата: | Где среда This создается - удобно, где ее нет, this уже не работает, в той же тсб. Есть ф-ии для добывания объктов |
| Так я и хочу короткого написания функций oBrw:nRowWnd вместо GetProperty(oBrw:cParentWnd, oBrw:cControlName, "Row") . Может и неправильно написал, надо наверное так: ? oBrw:nRowBrw ? oBrw:nColBrw ? oBrw:nWidthBrw ? oBrw:nHeightBrw
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1703
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.01.18 22:36. Заголовок: Andrey пишет Так я и..
Andrey пишет цитата: | Так я и хочу короткого написания функций |
| Есть (METHOD New смотри) координаты, я понимаю oBrw:nTop oBrw:nLeft oBrw:nBottom oBrw:Right
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5690
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.01.18 22:49. Заголовок: SergKis пишет: Есть..
SergKis пишет: цитата: | Есть (METHOD New смотри) координаты, я понимаю |
| Пропустил ! Спасибо ! То что нужно.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1704
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.01.18 22:50. Заголовок: PS создавай this сре..
PS создавай this среду в своей функции, запускай через блок кода для тсб xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex(oBrw:cControlName, oBrw:cParentWnd), p1, p2, p3, p4 )
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5691
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.01.18 22:55. Заголовок: SergKis пишет: созд..
SergKis пишет: цитата: | создавай this среду в своей функции, запускай через блок кода для тсб xRet := Do_ControlEventProcedure ( bBlock, GetControlIndex(oBrw:cControlName, oBrw:cParentWnd), p1, p2, p3, p4 ) |
| Не всё сразу. Надо с более простым решением разобраться.
| |
|
Vlad04
|
| постоянный участник
|
Пост N: 755
Зарегистрирован: 13.10.05
|
|
Отправлено: 12.01.18 14:09. Заголовок: SergKis пример, пе..
SergKis цитата: | пример, перебор всех контролов всех окон |
| Для чего ? Не могу даже представить , для чего мне бы это потребовалось. Окно - это визуальное представление данных, а данные в таблицах, которые везде видны, ну и переменных памяти. Обычно работа идет с одним активным основным окном и с несколькими вспомогательными.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1705
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.01.18 14:21. Заголовок: Vlad04 SergKis пише..
Vlad04 SergKis пишет цитата: | crazy пример, перебор всех контролов всех окон |
| Выбрать контролы одного окна, тоже надо перебрать _HMG_aControlHandles и по handle окна это сделать.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5692
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.01.18 15:52. Заголовок: SergKis пишет: по т..
SergKis пишет: Мне очень понравился стиль написания программы. Жалко что не было такого раньше.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5698
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.18 16:45. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Если есть еще пожелания/предложения для следующей сборки, то они с удовольствием будут приняты... |
| У меня возник вопрос: А как можно задать фонт для титула таблицы для Excel2() ? Мне ответили - пока никак, надо развивать Exel2. Есть пожелание для небольшого развития METHOD Excel2( cFile, lActivate, hProgress, cTitle, lSave, bPrintRow ) CLASS TSBrowse 1) Добавить возможность задания фонта для титула таблицы, это то что над шапкой таблицы. А то выходит очень маленьким фонтом. А в идеале бы хотелось чтобы туда можно было передавать хотя бы 3 фонта в массиве (титул,шапка,ячейки), для независимого построения листа экселя ! Таким образом можно будет подобрать приличный вид листа экселя. Всё равно же при задании большого фонта в таблице высота ячейки не меняется. 2) Да и еще бы использовать то что предложил SergKis в Пост N: 1706.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1708
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.01.18 18:40. Заголовок: С пожеланием Ардрея,..
С пожеланием Ардрея, получилось так : METHOD Excel2( cFile, lActivate, hProgress, xTitle, lSave ) CLASS TSBrowse ... nOldCol := ::nCell Local nCntCols := ::nColCount(), oCol, ; aFntLine := array(nCntCols), ; aFntHead := array(nCntCols), ; aFntFoot := array(nCntCols), ; hFntTitl, cTitle Default nInstance := 0 If HB_ISARRAY(xTitle) .and. Len(xTitle) > 1 cTitle := xTitle[1] hFntTitl := xTitle[2] EndIf Default cFile := "Book1.xls", ; lActivate := .T., ; lSave := .F., ; cTitle := "", ; hFntTitl := hFont CursorWait() For i := 1 To nCntCols oCol := ::aColumns[ i ] aFntLine[ i ] := oCol:hFont aFntHead[ i ] := oCol:hFontHead aFntFoot[ i ] := oCol:hFontFoot If HB_ISBLOCK(oCol:hFont) oCol:hFont := hFont EndIf If HB_ISBLOCK(oCol:hFontHead) oCol:hFontHead := hFont EndIf If HB_ISBLOCK(oCol:hFontFoot) oCol:hFontFoot := hFont EndIf Next ::lNoPaint := .F. ... For nCol := 1 To Len( ::aColumns ) If Empty( ::aColumns[ nCol ]:hFont ) .and. Empty( ::aColumns[ nCol ]:hFontHead ) Loop EndIf hFont := ::aColumns[ nCol ]:hFont If hFont != Nil aFontTmp := GetFontParam(hFont) IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0 AAdd( aFont, aFontTmp ) endif EndIf If hFont != Nil .and. hFntTitl != hFont hFont := hFntTitl aFontTmp := GetFontParam(hFont) IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0 AAdd( aFont, aFontTmp ) endif EndIf hFont := ::aColumns[ nCol ]:hFontHead If hFont != Nil aFontTmp := GetFontParam(hFont) IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0 AAdd( aFont, aFontTmp ) endif EndIf hFont := ::aColumns[ nCol ]:hFontFoot If hFont != Nil aFontTmp := GetFontParam(hFont) IF AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) == 0 AAdd( aFont, aFontTmp ) endif EndIf Next If Len( aFont ) > 4 ASize( aFont, 4 ) EndIf ... For nRow := 1 To ( ::nLen ) If nRow == 1 If ! Empty( cTitle ) cTitle := StrTran( cTitle, CRLF, Chr( 10 ) ) nAlign := If( Chr( 10 ) $ cTitle, 5, 1 ) hFont := hFntTitl aFontTmp := GetFontParam( hFont ) nFont := AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) FWrite( nHandle, BiffRec( 4, cTitle, 0, 0,, nAlign,, Max( 0, nFont - 1 ) ) ) nLine := 3 EndIf For nCol := 1 To Len( ::aColumns ) uData := If( ValType( ::aColumns[ nCol ]:cHeading ) == "B", ; Eval( ::aColumns[ nCol ]:cHeading, nCol, Self ), ; ::aColumns[ nCol ]:cHeading ) ... Next If ::lDrawFooters For nCol := 1 To Len( ::aColumns ) uData := If( ValType( ::aColumns[ nCol ]:cFooting ) == "B", ; Eval( ::aColumns[ nCol ]:cFooting, nCol, Self ), ; ::aColumns[ nCol ]:cFooting ) If ValType( uData ) != "C" uData := " " EndIf uData := Trim( StrTran( uData, CRLF, Chr( 10 ) ) ) nAlign := Min( LoWord( ::aColumns[ nCol ]:nFAlign ), 2 ) nAlign := If( Chr( 10 ) $ uData, 4, nAlign ) hFont := ::aColumns[ nCol ]:hFontFoot aFontTmp := GetFontParam( hFont ) nFont := AScan( aFont, {|e| e[ 1 ] == aFontTmp[ 1 ] .and. e[ 2 ] == aFontTmp[ 2 ] .and. ; e[ 3 ] == aFontTmp[ 3 ] .and. e[ 4 ] == aFontTmp[ 4 ] .and. ; e[ 5 ] == aFontTmp[ 5 ] .and. e[ 6 ] == aFontTmp[ 6 ] } ) FWrite( nHandle, BiffRec( 4, uData, nLine - 1, nCol - 1, .T., nAlign + 1,, ; Max( 0, nFont - 1 ) ) ) If hProgress != Nil If nCount % nEvery == 0 SendMessage(hProgress, PBM_SETPOS, nCount, 0) EndIf nCount ++ EndIf Next ++nLine EndIf FWrite( nHandle, BiffRec( 10 ) ) FClose( nHandle ) For i := 1 To nCntCols oCol := ::aColumns[ i ] oCol:hFont := aFntLine [ i ] oCol:hFontHead := aFntHead [ i ] oCol:hFontFoot := aFntFoot [ i ] Next If hProgress != Nil SendMessage(hProgress, PBM_SETPOS, nTotal, 0) EndIf ... т.е. титул задавать массивом {"TEST TITLE EXCEL.", GetFontHandle('Font_5') }
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5699
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.18 18:47. Заголовок: SergKis пишет: METH..
SergKis пишет: цитата: | METHOD Excel2( cFile, lActivate, hProgress, xTitle, lSave ) |
| 1) Чтобы у всех не свалились программы, наверное нужно сделать проверку на массив. Если не массив, то работать нужно по старому, а если массив то по новому ! 2) И как сделать показ своей функции ? Допустим показа простого кол-ва: nCol / Len( ::aColSizes ) Блин, на старых компах так медленно идёт загрузка 5 тыс. записей...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1709
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.01.18 19:29. Заголовок: Andrey пишет Если не..
Andrey пишет цитата: | Если не массив, то работать нужно по старому, а если массив то по новому ! |
| Ты прав, пропустил If HB_ISARRAY(xTitle) .and. Len(xTitle) > 1 cTitle := xTitle[1] hFntTitl := xTitle[2] Else cTitle := xTitle EndIf убрал у себя cTitle := AllTrim(cTitle) это всегда можно сделать снаружи
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5700
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.18 19:32. Заголовок: SergKis пишет: это ..
SergKis пишет: цитата: | это всегда можно сделать снаружи |
| Нет не всегда. Я очень не люблю когда рабочии системы - пересобираешь новой версией и они начинают валиться ! А как сделать показ своей функции ? Допустим показа простого кол-ва: nCol / Len( ::aColSizes ) Я вызываю свою фоновую функцию WaitThreadSay(cVal) // вывод доп.информации Если это сложно, то фиг с ним, не надо.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1230
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.01.18 11:53. Заголовок: SergKis пишет: С по..
SergKis пишет: цитата: | С пожеланием Ардрея, получилось так |
| Добавил эти правки в RC 2 новой сборки. Благодарю за помощь P.S. В связи с необходимостью лечения позвоночника (остеохондроз и прочее) вынужден сократить время посещения форума и работы над новой сборкой, которая запланирована к выходу на следующей неделе...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1710
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.01.18 18:23. Заголовок: gfilatov2002 еще не..
gfilatov2002 еще немного правок в excel2 ... For nCol := 1 To Len( ::aColumns ) If ::aColumns[ nCol ]:lBitMap Loop ElseIf Empty( ::aColumns[ nCol ]:hFont ) .and. Empty( ::aColumns[ nCol ]:hFontHead ) Loop EndIf hFont := ::aColumns[ nCol ]:hFont ... For nRow := 1 To ( ::nLen ) If nRow == 1 ... For nCol := 1 To Len( ::aColumns ) If ::aColumns[ nCol ]:lBitMap Loop EndIf uData := If( ValType( ::aColumns[ nCol ]:cHeading ) == "B", ; ... EndIf ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1231
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.01.18 21:56. Заголовок: SergKis пишет: еще ..
SergKis пишет: цитата: | еще немного правок в excel2 |
| OK, спасибо
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1711
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.01.18 15:44. Заголовок: gfilatov2002 еще пр..
gfilatov2002 еще правки METHOD LButtonDown( nRowPix, nColPix, nKeyFlags ) CLASS TSBrowse ... oCol, ix If ! ::lEnabled Return 0 EndIf Default ::lDontChange := .F. ... METHOD LButtonUp( nRowPix, nColPix, nFlags ) CLASS TSBrowse Local nClickRow, nDestCol If ! ::lEnabled Return 0 EndIf If nKeyPressed != Nil ::DrawPressed( nKeyPressed, .F. ) EndIf ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1232
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.01.18 18:40. Заголовок: SergKis пишет: еще ..
SergKis пишет: Сделал Благодарю за помощь
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1233
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.01.18 12:14. Заголовок: Завершена подготовка..
Завершена подготовка очередной сборки 18.01, которая будет опубликована послезавтра. В связи с необходимостью длительного лечения позвоночника (год и более) выпуск новых сборок будет приостановлен...
| |
|
Alw Spencer
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.01.18 14:34. Заголовок: gfilatov2002 Но мы..
gfilatov2002 Но мы Вас ещё ведь услышим? Или лечение не позволит попасть на форум?
| |
|
Vlad04
|
| постоянный участник
|
Пост N: 757
Зарегистрирован: 13.10.05
|
|
Отправлено: 22.01.18 14:55. Заголовок: длительного лечения ..
цитата: | длительного лечения позвоночника |
| Будьте осторожны ! Никаких операций! Будьте здоровы.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1712
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.01.18 15:24. Заголовок: Мой опыт борьбы (бол..
Мой опыт борьбы (более 15 лет) с неисправностью позвоночника (без травм, из за сдвига дисков, от сидения - работа такая), одна нога почти на 10 см. была короче другой. По каким только врачам, институтам не ходил, толку 0. Пока 3 женщины с лечебной физкультуры не стали делать растяжку мышц, сухожилий, дело чуть сдвинулось и по их наводке, попал к мануалисту, занимающемуся со спортсменами, кикбоксеры, бойцы без правил, ... Год ходил каждую неделю, потом раз в 2, месяц (мышцы, сухожилия обладают памятью). Он поставил меня на ноги. Сейчас продолжаю ходить по самочувствию. А с операциями, Vlad04 прав, надо очень осторожно. Насмотрелся я в реабилитационных центрах на людей после них .... Удачи в лечении.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1234
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.01.18 15:38. Заголовок: SergKis пишет: Удач..
SergKis пишет: Благодарю за добрые слова! Пока прописали "скорую помощь" - занятия на профилакторе Евминова Alw Spencer пишет: Обязательно Просто сокращаетя до минимума время сидения перед монитором...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1235
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.01.18 11:02. Заголовок: Опубликована новая с..
Опубликована новая сборка 18.01 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.01-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. ссылки на которые будут доступны по Вашему запросу До новых встреч!
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5702
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.01.18 17:18. Заголовок: Собрал на новой верс..
Собрал на новой версии несколько своих проектов ! Полёт нормальный !!! Ждем новых встреч !!! Обратите внимание на новый пример: MiniGUI\SAMPLES\Advanced\Tsb_array_3
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1752
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.02.18 12:17. Заголовок: gfilatov2002 Немног..
gfilatov2002 Немного правок CLASS TWndData ... METHOD Release() INLINE iif( ::IsWindow, iif( ::lAction, PostMessage(::nHandle, WM_CLOSE, 0, 0), Nil ), Nil ) METHOD Restore() INLINE ShowWindow( ::nHandle, SW_RESTORE ) METHOD Show() INLINE _ShowWindow( ::cName ) METHOD Hide() INLINE _HideWindow( ::cName ) _METHOD DoEvent( Key, nHandle ) ... CLASS TCnlData INHERIT TWndData ... METHOD PostMsg( nKey ) INLINE iif( ::oWin:Action, PostMessage( ::oWin:nHandle, ::WM_nMsgC, nKey, ::nHandle ), ) METHOD SendMsg( nKey ) INLINE iif( ::oWin:Action, SendMessage( ::oWin:nHandle, ::WM_nMsgC, nKey, ::nHandle ), ) ... ... METHOD Restore() INLINE ::Show() METHOD Show() INLINE _ShowControl( ::cName, ::oWin:cName ) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1239
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.02.18 20:30. Заголовок: SergKis пишет: Немн..
SergKis пишет: Принимается. Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1756
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.02.18 09:19. Заголовок: gfilatov2002 В прод..
gfilatov2002 В продолжение CLASS TStbData INHERIT TCnlData ... METHOD Enable ( lEnab ) INLINE ::oTBrowse:lEnabled := iif( HB_ISLOGICAL(lEnab), lEnab, ::oTBrowse:lEnabled ) METHOD Enabled ( lEnab ) INLINE ::oTBrowse:Enabled( lEnab ) METHOD Restore() INLINE ::oTBrowse:Show() METHOD Show() INLINE ::oTBrowse:Show() METHOD Hide() INLINE ::oTBrowse:Hide() METHOD SetFocus() INLINE ::oTBrowse:SetFocus() ... *-----------------------------------------------------------------------------* Function _GetValue ( ControlName, ParentForm , Index ) *-----------------------------------------------------------------------------* ... do case #ifdef _TSBROWSE_ case T == "TBROWSE" oGet := _HMG_aControlIds[ ix ] retval := EVal( oGet:GetColumn( oGet:nCell ):bData ) #endif #ifdef _DBFBROWSE_ ... *-----------------------------------------------------------------------------* Function _SetValue ( ControlName, ParentForm, Value , Index, lSetGet ) *-----------------------------------------------------------------------------* ... do case #ifdef _TSBROWSE_ case T == "TBROWSE" oGet := _HMG_aControlIds[ ix ] EVal( oGet:GetColumn( oGet:nCell ):bData, Value ) #endif #ifdef _DBFBROWSE_ ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1757
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.02.18 09:22. Заголовок: PS Не углядел лишний..
PS Не углядел лишний параметр из своей либы (убрать) Function _SetValue ( ControlName, ParentForm, Value , Index, lSetGet )
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1758
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.02.18 09:26. Заголовок: PPS и класс не TStbD..
PPS и класс не TStbData, а TTsbData CLASS TTsbData INHERIT TCnlData
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1240
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.02.18 21:35. Заголовок: SergKis пишет: В пр..
SergKis пишет: Дополнил. Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1759
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.02.18 00:01. Заголовок: Григорий, прошу прощ..
Григорий, прошу прощения, пропустил наследованные методы в TTsbata Disable(), Refresh() вместо METHOD Enable ( lEnab ) INLINE ::oTBrowse:lEnabled := iif( HB_ISLOGICAL(lEnab), lEnab, ::oTBrowse:lEnabled ) сделать METHOD Enable () INLINE ::oTBrowse:lEnabled := .T. добавить METHOD Disable() INLINE ::oTBrowse:lEnabled := .F. METHOD Refresh( lPaint ) INLINE ::oTBrowse:Refresh(lPaint)
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1760
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.02.18 09:42. Заголовок: gfilatov2002 И еще ..
gfilatov2002 И еще CLASS TWndData ... METHOD Hide() INLINE _HideWindow ( ::cName ) METHOD SetSize( y, x, w, h ) INLINE _SetWindowSizePos( ::cName, y, x, w, h ) в TCnlData есть такой метод в TSBROWSE добавил METHOD GetValue( xCol ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; EVal( ::GetColumn(xCol):bData ) ) METHOD SetValue( xCol, xVal ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; EVal( ::GetColumn(xCol):bData, xVal ) ) надоело писать Eval
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1761
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.02.18 09:50. Заголовок: PS Может методы назв..
PS Может методы назвать надо было короче Get и Put, взял по аналогии с _GetValue и _SetValue
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5729
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.02.18 11:41. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может методы назвать надо было короче Get и Put, взял по аналогии с _GetValue и _SetValue |
| Лучше GetColumn() и PutColumn(xCol)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1241
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.02.18 12:18. Заголовок: SergKis пишет: проп..
SergKis пишет: цитата: | пропустил наследованные методы в TTsbata Disable(), Refresh() |
| Исправил и добавил все предложенные методы. SergKis пишет: цитата: | Может методы назвать надо было короче |
| Полностью полагаюсь на Ваш вкус в этом вопросе. Благодарю за Ваше внимание
| |
|
Avf
|
| |
Пост N: 28
Зарегистрирован: 19.10.05
|
|
Отправлено: 19.02.18 13:01. Заголовок: После перехода с вер..
После перехода с версии 17.11 на 17.12 ( и 18.01 ) изменилось поведение CHECKLABEL ( пример c:\MiniGUI\SAMPLES\BASIC\CheckLabel\ ) @ 200,30 CHECKLABEL Label_1 ; WIDTH 200 HEIGHT 24 ; VALUE 'Check Label_1 standard' ; CHECKED ; FONT 'Arial' SIZE 9 BACKCOLOR YELLOW ; ON MOUSEHOVER Rc_Cursor( "MINIGUI_FINGER" ) ; ONCLICK (MsgInfo(HB_VALTOSTR(Form_Main.Label_1.Value)), lChecked := Form_Main.Label_1.Checked, Form_Main.Label_1.Checked := !lChecked ) ранее выдавало значение Form_Main.Label_1.Value = 'Check Label_1 standard', а теперь Form_Main.Label_1.Value = Form_Main.Label_1.Checked Ну соответственно новое значение Form_Main.Label_1.Value не присваивается.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1242
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.02.18 13:16. Заголовок: Avf пишет: а теперь..
Avf пишет: цитата: | а теперь Form_Main.Label_1.Value = Form_Main.Label_1.Checked |
| Все верно цитата: | * 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. |
| Avf пишет: цитата: | новое значение Form_Main.Label_1.Value не присваивается |
| Пробуйте цитата: | ONCLICK (Form_Main.Label_1.Caption:='New Value', lChecked := Form_Main.Label_1.Checked, Form_Main.Label_1.Checked := !lChecked ) |
|
| |
|
Avf
|
| |
Пост N: 29
Зарегистрирован: 19.10.05
|
|
Отправлено: 19.02.18 13:46. Заголовок: Спасибо, не посмотр..
Спасибо, не посмотрел изменения.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1764
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.02.18 17:14. Заголовок: gfilatov2002 Обнару..
gfilatov2002 Обнаружил, что GetControlHandle(...) возвращает массив Handle, вернее This.Spinner_Year.Handle, т.е. GetProperty(cForm, 'Spinner_Year', 'Handle') Тут сделано так: *-----------------------------------------------------------------------------* FUNC Do_OnCtlInit( i, cVar ) *-----------------------------------------------------------------------------* LOCAL nCtlIndex := i LOCAL cCtlName := _HMG_aControlNames[ i ] LOCAL nHandle := iif( ISARRAY( _HMG_aControlHandles[ i ] ), ; _HMG_aControlHandles[ i ][ 1 ], _HMG_aControlHandles[ i ] ) LOCAL nParent := _HMG_aControlParentHandles[ i ] ... что то, нет ясности, где править GetControlHandle(...) или GetProperty(...) ?
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1765
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.02.18 17:22. Заголовок: PS Это меня заклинил..
PS Это меня заклинило\глюкнуло. Надо знать про массив и где нужно делать руками This.Spinner_Year.Handle[1]
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1766
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.02.18 14:59. Заголовок: gfilatov2002 Возмож..
gfilatov2002 Возможно, будет интересен пример SET OOP ON с event-ами. http://my-files.ru/ii331e Работа с event-ами позволяет создавать This среду для контролов (для тсб тоже). К примеру события 101, 102 вызываются и из меню 1.1, 1.2 ( This - окно ), а с кнопок Button_1, Button_2 This среда контролов.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1245
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.02.18 16:14. Заголовок: SergKis пишет: Возм..
SergKis пишет: цитата: | Возможно, будет интересен пример SET OOP ON с event-ами. |
| Да, этот пример будет интересен, как и все Ваши примеры использования ООП в Минигуи Благодарю за внимание
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1769
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.02.18 10:15. Заголовок: gfilatov2002 Лишние..
gfilatov2002 Лишние скобки надо убрать METHOD Eval( Block ) CLASS TKeyData ... IF b; Eval( Block, hb_HValueAt( ::aKey, i ), hb_HKeyAt( ::aKey, i ), i ) ELSEIF l; AAdd( a, { hb_HValueAt( ::aKey, i ) } ) ELSE ; AAdd( a, { hb_HValueAt( ::aKey, i ), hb_HKeyAt( ::aKey, i ), i } ) ... METHOD Eval( Block ) CLASS TThrData ... If ::lMT m := ::SGD( 4, i ) IF b; Eval( Block, m[ 2 ], m[ 1 ], i ) ELSEIF l; AAdd( a, { m[ 2 ] } ) ELSE ; AAdd( a, { m[ 2 ], m[ 1 ], i } ) ENDIF ELSE IF b; Eval( Block, hb_HValueAt( ::aKey, i ), hb_HKeyAt( ::aKey, i ), i ) ELSEIF l; AAdd( a, { hb_HValueAt( ::aKey, i ) } ) ELSE ; AAdd( a, { hb_HValueAt( ::aKey, i ), hb_HKeyAt( ::aKey, i ), i } ) ENDIF ENDIF ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1246
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.02.18 11:22. Заголовок: SergKis пишет: Лишн..
SergKis пишет: цитата: | Лишние скобки надо убрать |
| Убрал, конечно. Благодарю за помощь
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1248
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.02.18 10:53. Заголовок: Опубликована новая с..
Опубликована новая сборка 18.02 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.02-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. ссылки на которые будут доступны по Вашему запросу
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1250
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.03.18 11:16. Заголовок: Всем кому это интере..
Всем кому это интересно Подготовил вторую бету для новой мартовской сборки библиотеки Благодарю за Ваше внимание
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5769
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.03.18 11:11. Заголовок: Всем привет. Созрело..
Всем привет. Созрело предложение по цветам. Сейчас в i_color.ch только 19 цветов и все задаются через {....} Для новых кнопок с градиентами нужны числовые цвета. В TSBROWSE.CH только 16 цветов, нет ORANGE и неск.других, да и не всегда удобно к проекту его добавлять, там куча всего. Название цветов мне нравиться больше как в TSBROWSE.CH Посмотреть заодно и как в FW сделано. Предлагаю в i_color.ch добавить цвета: #define CLR_YELLOW RGB( 255 , 255 , 0 ) #define CLR_PINK RGB( 255 , 128 , 192 ) #define CLR_HRED RGB( 255 , 0 , 0 ) #define CLR_HMAGENTA RGB( 255 , 0 , 255 ) #define CLR_BROWN RGB( 128 , 64 , 64 ) #define CLR_ORANGE RGB( 255 , 128 , 64 ) #define CLR_HGREEN RGB( 0 , 255 , 0 ) #define CLR_PURPLE RGB( 128 , 0 , 128 ) #define CLR_BLACK RGB( 0 , 0 , 0 ) #define CLR_WHITE RGB( 255 , 255 , 255 ) #define CLR_GRAY RGB( 128 , 128 , 128 ) #define CLR_HBLUE RGB( 0 , 0 , 255 ) #define CLR_HGRAY RGB( 192 , 192 , 192 ) #define CLR_RED RGB( 128 , 0 , 0 ) #define CLR_OLIVE RGB( 128 , 128 , 0 ) #define CLR_LGREEN RGB( 0 , 128 , 0 ) #define CLR_HCYAN RGB( 0 , 255 , 255 ) #define CLR_BLUE RGB( 0 , 0 , 128 ) #define CLR_CYAN RGB( 0 , 128 , 128 ) Может что и упустил... И ещё можно добавить вот такие цвета: #define CLR_SKYPE RGB( 0, 176,240 ) // голубой, как SKYPE #define CLR_VIBER RGB( 125, 82,158 ) // фиолетовый, как в Viber #define CLR_VK RGB( 93, 114,148 ) // сине-серый, как в Контакте #define CLR_TWIT RGB( 118, 170,235 ) // голубой, как TWITER #define CLR_FB RGB( 71, 89,149 ) // синеватый, как Фейсбук #define CLR_OK RGB( 238, 89,149 ) // оранжевый, как Одноклассники
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1776
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.03.18 08:54. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение заменить, подправить METHOD DoEvent ( Key, nHandle ) CLASS TWndData LOCAL o := Self LOCAL i := o:Index LOCAL w := o:IsWindow IF ! empty(nHandle) IF hmg_IsWindowObject( nHandle ) // control handle o := hmg_GetWindowObject( nHandle ) i := o:Index w := o:IsWindow ELSEIF nHandle > 0 .and. nHandle <= Len( _HMG_aControlHandles ) // control index IF hmg_IsWindowObject( _HMG_aControlHandles[ nHandle ] ) o := hmg_GetWindowObject( _HMG_aControlHandles[ nHandle ] ) i := o:Index w := o:IsWindow ELSE i := nHandle w := .F. ENDIF ENDIF ENDIF IF w RETURN Do_WindowEventProcedure ( ::oEvent:Get( Key ), i, o, Key ) ENDIF RETURN Do_ControlEventProcedure( ::oEvent:Get( Key ), i, o, Key ) и пример APP_OOPEVENTS DEFINE MAIN MENU POPUP 'MENU_1' NAME 100 ITEM 'Item main menu 1.1' NAME 101 IMAGE 'n1' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name), This.Index) ITEM 'Item main menu 1.2' NAME 102 IMAGE 'n2' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name)) ITEM 'Item main menu 1.3 ( This -> Button_2 )' NAME 103 IMAGE 'n3' ; ACTION (ThisWindow.Object):PostMsg(val(This.Name), This.Button_2.Index) SEPARATOR ITEM 'Exit' NAME 199 ; ACTION (ThisWindow.Object):PostMsg(val(This.Name)) END POPUP
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1251
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.03.18 11:11. Заголовок: SergKis пишет: заме..
SergKis пишет: Благодарю за помощь Поправлю, конечно...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1784
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.03.18 22:09. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте, пожалуйста METHOD Sum( Key, xSum ) CLASS TKeyData LOCAL sum := ::Get( Key, 0 ) IF HB_ISNUMERIC( xSum ) IF HB_ISNUMERIC( sum ); sum += xSum ELSE ; sum := xSum ENDIF ::Set( Key, sum ) ELSEIF HB_ISARRAY( xSum ) IF HB_ISARRAY( sum ) .AND. Len( sum ) == Len( xSum ) AEval( xSum, {| s, i| sum[ i ] := iif( HB_ISNUMERIC( s ), sum[ i ] + s, s ) } ) ELSE sum := xSum ENDIF ::Set( Key, sum ) ENDIF RETURN NIL ... METHOD Sum( Key, xSum ) CLASS TThrData LOCAL sum := ::Get( Key, 0 ) IF HB_ISNUMERIC( xSum ) IF HB_ISNUMERIC( sum ); sum += xSum ELSE ; sum := xSum ENDIF ::Set( Key, sum ) ELSEIF HB_ISARRAY( xSum ) IF HB_ISARRAY( sum ) .AND. Len( sum ) == Len( xSum ) AEval( xSum, {| s, i| sum[ i ] := iif( HB_ISNUMERIC( s ), sum[ i ] + s, s ) } ) ELSE sum := xSum ENDIF ::Set( Key, sum ) ENDIF RETURN NIL ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1253
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.03.18 22:26. Заголовок: SergKis пишет: Попр..
SergKis пишет: Уже сделал. Благодарю за помощь и внимание
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1785
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.03.18 09:29. Заголовок: gfilatov2002 Предла..
gfilatov2002 Предлагаю новый метод для tsb, для растяжки нескольких колонок до размера тсб по ширине. Скрытый текст
METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse LOCAL c, i, k, n, s, w, obr := Self, aCol := {} LOCAL nVisible := 0 Default nDelta := 1 If empty(aColumns) aColumns := array( ::nColCount() ) AEval(aColumns, {|xv,nn| xv := nn, aColumns[ nn ] := xv }) Endif If HB_ISNUMERIC(aColumns) AAdd(aCol, aColumns) ElseIf HB_ISCHAR(aColumns) AAdd(aCol, ::nColumn(aColumns)) Else AEval(aColumns, {|xv| AAdd(aCol, iif( HB_ISCHAR(xv), obr:nColumn(xv), xv )) }) EndIf AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) }) k := Len(aCol) w := GetWindowWidth( ::hWnd ) - nVisible - nDelta - iif( ::lNoVScroll, 0, GetVScrollBarWidth() ) If w > 0 n := int( w / k ) s := 0 For i := 1 To k c := aCol[ i ] If i == k ::aColumns[ c ]:nWidth += ( w - s ) Else s += n ::aColumns[ c ]:nWidth += n EndIf Next EndIf RETURN Nil
| Использование при ширине tsb > ширины колонок :AdjColumns() - все колонки :AdjColumns({"NAME", "SUMMA"}) - указанные колонки по cName :AdjColumns({3, 4, 5}) - указанные колонки по номеру В пример App_OOPoKeyData, который прислал Andrey, можно вставить *-----------------------------------------------------------------------------* STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) *-----------------------------------------------------------------------------* ... :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) :AdjColumns({3, 4, 5}) // или :AdjColumns() END TBROWSE oRpt:SetNoHoles() ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1256
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.03.18 11:27. Заголовок: SergKis пишет: Пред..
SergKis пишет: цитата: | Предлагаю новый метод для tsb |
| 1. добавил новый полезный метод 2. переименовал пример App_OOPoKeyData в APP_OOPREPORT 3. вставку строки в пример сделал - работает! Благодарю за помошь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1786
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.03.18 14:11. Заголовок: gfilatov2002 поправ..
gfilatov2002 поправьте APP_OOPREPORT (передал в TsbReport oWnd, а не показал цель этого) FUNCTION Main() ... :Event( 7, {|ow,ky| Report(ow, ky) } ) // ToolBar 2 :Event( 99, {|ow | ow:Release() } ) // StatusBar :Event( 91, {|ow | ow:StatusBar:Say('... W A I T ...') } ) :Event( 92, {|ow | ow:StatusBar:Say('') } ) END WITH // ---- Window events ... STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) ... // ToolBar 1 (This.Object):Event( 1, {|ow| oWnd:StatusBar:Say('... W A I T ...'), ; MsgBox('P r i n t i n g' , ow:Name), ; oWnd:StatusBar:Say('') } ) (This.Object):Event( 2, {|ow| oWnd:PostMsg(91), ; MsgBox('Export to MS Excel', ow:Name), ; oWnd:PostMsg(92) } ) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1257
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.03.18 20:01. Заголовок: SergKis пишет: попр..
SergKis пишет: Поправил, конечно. Благодарю за помощь - пример работает нормально
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1788
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.18 12:34. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет цитата: | пример работает нормально |
| Попробую сразу ответить на вопрос "Как улучшить вид отчета ?" Скрытый текст
1. FUNCTION Main() ... DEFINE FONT FontBold FONTNAME _HMG_DefaultFontName ; SIZE _HMG_DefaultFontSize BOLD DEFINE FONT FontNorm FONTNAME "Courier New" ; SIZE _HMG_DefaultFontSize BOLD USE Employee ALIAS BASE SHARED NEW ... STATIC FUNC Report( oWnd, nEvent ) ... b := { {|| Alltrim( FIRST ) }, ; {|| Alltrim( LAST ) }, ; {|| hb_ntos( AGE ) }, ; {|| Alltrim( STATE ) }, ; {|| Alltrim( CITY ) }, ; {|| STATE + ', ' + LEFT( LAST, 1 ) + '...' }, ; {|| CITY + ', ' + LEFT( LAST, 1 ) + '...' } ; } ... cKey := Eval( b[ nEvent ] ) o:Sum( cKey, { 1, cKey, 1, INCOMING, OUTLAY, INCOMING - OUTLAY } ) SKIP ... STATIC FUNC TsbReport( oWnd, nEvent, aArray, cColName ) ... // посчитаем итоги FOR EACH a IN aArray For i := 1 To Len(a) If i < 3 o:Sum(i, 1) // кол- во Else o:Sum(i, a[ i ]) // сумма EndIf Next NEXT a := o:Eval(.T.) // array {{value}, ...} aAlign := array(Len(a)) aSize := array(Len(a)) aPict := array(Len(a)) aFoot := array(Len(a)) aSize [ 1 ] := 50 aPict [ 1 ] := '9999' aAlign[ 1 ] := DT_CENTER AEVal(a, {|ns,nn| aFoot[ nn ] := iif( nn == 1, '', hb_ntos(ns) ) }) ... // заголовки колонок отчета aHead := { "#", cColName, "Quantity", "Incoming", "Outlay", "Balance" } ... DEFINE WINDOW Report ; AT 0, 0 ; WIDTH 700 ; ... :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) :aColumns[ 1 ]:bData := {|| oRpt:nAt } If nEvent == 6 .or. nEvent == 7 :aColumns[ 2 ]:hFont := GetFontHandle('FontNorm') :aColumns[ 2 ]:nWidth += 70 EndIf :AdjColumns({3, 4, 5}) // :AdjColumns() ... 2. Можно разложить, к примеру, cKey на 2-е колонки. Схема такая o:Sum( cKey, { 1, cKey, "", 1, INCOMING, OUTLAY, INCOMING - OUTLAY } ) и потом в массиве разделяем cKey по разделителю на 2-е части 1-ю пишем на место cKey 2-ю пишем на место добавленного элемента "" мняем aHead с добавленной надписью над новой колонкой и aFoot формируем с учетом новой колонки
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1789
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.18 12:39. Заголовок: PS надо без BOLD ..
PS надо без BOLD DEFINE FONT FontNorm FONTNAME "Courier New" ; SIZE _HMG_DefaultFontSize
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1791
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.18 16:46. Заголовок: Заработал My-Files.r..
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1260
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.03.18 17:28. Заголовок: SergKis пишет: Ссыл..
SergKis пишет: Благодарю за обновленный пример! Что сделал: 1. поправил опечатку 2. перевел комментарии из OEM-кодировки в ANSI. 3. проверил компиляцию примера по команде
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1792
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.18 19:21. Заголовок: gfilatov2002 пишет c..
gfilatov2002 пишет Спасибо за напоминание, с Borlandом редко собираю, забываю эти параметры для Compile.bat. цитата: | перевел комментарии из OEM-кодировки в ANSI. |
| Все проекты в OEM и настройки на нее, дергаю куски и комментарии идут, как идут. Сорри. По SET OOP ON показал практически все что хотел. Думаю теперь только вопросы.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1793
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.03.18 09:19. Заголовок: SergKis пишет показа..
SergKis пишет цитата: | показал практически все что хотел |
| Работу с сообщениями из тсб добавил в пример, т.е. кнопки toolbar продублировал клавишами http://my-files.ru/h5e6ms
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1261
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.03.18 11:26. Заголовок: SergKis пишет: кноп..
SergKis пишет: цитата: | кнопки toolbar продублировал клавишами |
| Благодарю за помощь Очень наглядный пример использования ООП
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1797
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.03.18 21:03. Заголовок: gfilatov2002 Надо п..
gfilatov2002 Надо правку сделать, Andrey неточность нашел, при hide колонки. Считать надо не только ширину видимых колонок, но и их кол-во METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse ... LOCAL nVisible := 0, aVisible := {} ... AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) }) AEval( aCol , {|nc| iif( obr:aColumns[ nc ]:lVisible, AAdd(aVisible, nc), Nil ) }) k := Len(aVisible) ... For i := 1 To k c := aVisible[ i ] ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1262
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.03.18 21:31. Заголовок: SergKis пишет: Надо..
SergKis пишет: Поправил, конечно. Благодарю за внимание
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1798
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.03.18 08:08. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте APP_OOPREPORT для альтернативного задания клавиш BUTTON 01 CAPTION 'First' PICTURE 'n1' ; TOOLTIP 'Column report FIRST Ctrl+1, Shift+1' ; ACTION wPost() SEPARATOR BUTTON 02 CAPTION 'Last' PICTURE 'n2' ; TOOLTIP 'Column report LAST Ctrl+2, Shift+2' ; ACTION wPost() SEPARATOR BUTTON 03 CAPTION 'Age' PICTURE 'n3' ; TOOLTIP 'Column report AGE Ctrl+3, Shift+3' ; ACTION wPost() SEPARATOR BUTTON 04 CAPTION 'State' PICTURE 'n4' ; TOOLTIP 'Column report STATE Ctrl+4, Shift+4' ; ACTION wPost() SEPARATOR BUTTON 05 CAPTION 'City' PICTURE 'n5' ; TOOLTIP 'Column report CITY Ctrl+5, Shift+5' ; ACTION wPost() SEPARATOR BUTTON 06 CAPTION 'State ?' PICTURE 'n6' ; TOOLTIP 'Column report STATE + Left(LAST, 1) Ctrl+6, Shift+6' ; ACTION wPost() SEPARATOR BUTTON 07 CAPTION 'City ?' PICTURE 'n7' ; TOOLTIP 'Column report CITY + Left(LAST, 1) Ctrl+7, Shift+7' ; ACTION wPost() SEPARATOR ... oTabl:SetFocus() ON KEY SHIFT+1 ACTION wPost(1) ON KEY SHIFT+2 ACTION wPost(2) ON KEY SHIFT+3 ACTION wPost(3) ON KEY SHIFT+4 ACTION wPost(4) ON KEY SHIFT+5 ACTION wPost(5) ON KEY SHIFT+6 ACTION wPost(6) ON KEY SHIFT+7 ACTION wPost(7) ON KEY ESCAPE ACTION wPost(99) END WINDOW ... STATIC FUNC Report( oWnd, nEvent ) ... oWnd:Action := .F. oBrw:lEnabled := .F. oWnd:StatusBar:Say('... W A I T ...') ... TsbReport( oWnd, nEvent, aRpt, cNam ) (This.oTabl.Object):Tsb:lEnabled := .T. // oBrw:lEnabled := .T. (This.oTabl.Object):SetFocus() // oBrw:SetFocus() ... PS На время формирования отчета (oWnd:Action := .F.) блокируются действия окна по сообщениям до (oWnd:Action := .T.)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1264
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.03.18 20:17. Заголовок: SergKis пишет: Попр..
SergKis пишет: цитата: | Поправьте APP_OOPREPORT для альтернативного задания клавиш |
| Сделал. Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1799
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.03.18 12:24. Заголовок: gfilatov2002 Вспомн..
gfilatov2002 Вспомнил про особенность работы с context menu ( извините, что не сразу ) Скрытый текст
FUNCTION Main() ... :Event( 99, {|ow | ow:Release() } ) // Tsb. Right click - context menu :Event( 90, {|ow | MenuReport(ow) } ) // StatusBar :Event( 91, {|ow | ow:StatusBar:Say('... W A I T ...') } ) ... DEFINE TBROWSE oTabl AT nY, nX ALIAS cAlias WIDTH nW HEIGHT nH CELL ; TOOLTIP 'Right click - context menu' ; COLUMNS {"FIRST", "LAST", "AGE", "STATE", "CITY", "INCOMING", "OUTLAY"} ... :bChange := {|ob| ob:DrawFooters() } :bRClicked := {|p1,p2,p3,ob| p1:=p2:=p3, wPost(90, ob) } ... *-----------------------------------------------------------------------------* FUNCTION _ShowFormContextMenu( cForm, nRow, nCol, lCenter ) *-----------------------------------------------------------------------------* LOCAL xContextMenuParentHandle := 0, hWnd, aRow DEFAULT nRow := -1, nCol := -1, lCenter := .F. If .Not. _IsWindowDefined(cForm) xContextMenuParentHandle := _HMG_xContextMenuParentHandle Else xContextMenuParentHandle := GetFormHandle(cForm ) Endif If xContextMenuParentHandle == 0 MsgMiniGuiError("Context Menu is not defined. Program terminated") EndIf lCenter := lCenter .or. ( nRow == 0 .or. nCol == 0 ) hWnd := GetFormHandle(cForm) If lCenter If nCol == 0 nCol := int( GetWindowWidth (hWnd) / 2 ) EndIf If nRow == 0 nRow := int( GetWindowHeight(hWnd) / 2 ) EndIf ElseIf nRow < 0 .or. nCol < 0 aRow := GetCursorPos() nRow := aRow[1] nCol := aRow[2] EndIf TrackPopupMenu ( _HMG_xContextMenuHandle , nCol , nRow , xContextMenuParentHandle ) RETURN Nil *-----------------------------------------------------------------------------* STATIC FUNC MenuReport( oWnd, aTxt, lPost, nRow, nCol, lCenter, nZeroLen ) *-----------------------------------------------------------------------------* LOCAL cWnd := oWnd:Name LOCAL nItm := 0, cNam, cImg, i LOCAL lDis := .F. LOCAL bAct := {|| nItm := Val(This.Name) } Default nZeroLen := 4, lPost := .T. Default aTxt := { ; 'Column report FIRST', ; 'Column report LAST ', ; 'Column report AGE ', ; 'Column report STATE', ; 'Column report CITY ', ; 'Column report STATE + Left(LAST, 1)', ; 'Column report CITY + Left(LAST, 1) ' ; } DEFINE CONTEXT MENU OF &cWnd For i := 1 To len(aTxt) cNam := StrZero(i, nZeroLen) If i > 9 cImg := Nil Else cImg := 'n' + hb_ntos(i) EndIf _DefineMenuItem( aTxt[ i ], bAct, cNam, cImg, .F., lDis, , , , .F., .F.) NEXT SEPARATOR MENUITEM 'Exit' ACTION NIL END MENU _ShowFormContextMenu(cWnd, nRow, nCol, lCenter ) DEFINE CONTEXT MENU OF &cWnd END MENU DO EVENTS If nItm > 0 .and. lPost oWnd:PostMsg(nItm) EndIf RETURN nItm
|
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1265
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.03.18 12:56. Заголовок: SergKis пишет: Вспо..
SergKis пишет: цитата: | Вспомнил про особенность работы с context menu |
| Спасибо
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1800
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.03.18 13:41. Заголовок: SergKis пишет Вспомн..
SergKis пишет цитата: | Вспомнил про особенность работы с context menu |
| Особенность в том, что работая в context menu (думаю с обычным будет так же) MENUITEM ... ACTION wPost() собственные сообщения рабатают, а сообщения прорисовки кнопок ToolBar теряются. В данном примере не снимается с кнопки ToolBar состояние Disable, а Caption 1ой кнопки срабатывает. Т.е. надо выйти из меню и потом работать, что показано в примере.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1268
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.03.18 09:36. Заголовок: Выпущена новая сборк..
Выпущена новая сборка 18.03 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.03-setup.exe Рекомендуется к использованию Выпуск новых сборок опложен на неопределенный период вследствие финансовых и др. проблем Благодарю за Ваше внимание и поддержку
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5789
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.18 10:33. Заголовок: Ура ! Наконец то дож..
Ура ! Наконец то дождались !
| |
|
Alw Spencer
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 31.03.18 22:03. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Выпущена новая сборка 18.03 |
| Спасибо и Приветствую Просьба Есть ли возможность получить сборки для компиляторов MinGW32 и MinGW64? Спасибо.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1271
Зарегистрирован: 11.02.10
|
|
Отправлено: 31.03.18 22:39. Заголовок: Alw Spencer пишет: ..
Alw Spencer пишет: цитата: | Есть ли возможность получить сборки для компиляторов MinGW32 и MinGW64? |
| Да, это возможно на платной основе, я уже подготовил такие сборки для свежего релиза. Заплатите небольшой взнос на развитие Минигуи через сервис PayPal, и я пришлю Вам ссылки для выкачки этих сборок.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5805
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.18 23:08. Заголовок: Andrey пишет: #defi..
Andrey пишет: цитата: | #define CLR_OK RGB( 238, 89,149 ) // оранжевый, как Одноклассники |
| Ошибку допустил. Нужно RGB( 238, 130, 8 )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1274
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.04.18 11:00. Заголовок: Всем кому это интере..
Всем кому это интересно В честь Дня освобождения Одессы, который отмечается сегодня, подготовил 4-ю бету для новой сборки библиотеки со следующим списком изменений Скрытый текст
* Fixed: Problem with a showing of the additional information in the ErrorLog at using of xHarbour compiler (introduced in the build 2.3.9). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\ShowDetailError) * Fixed: Program crash at the exit from a Preview window in a graph printing module at using of xHarbour compiler. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\Charts_3) * Enhanced: Added the helpful C-level function GetLastError(). Above function returns the error code of the last API function called. Most API functions merely return a number saying that an error occured, but not what kind of error. This function will return a universal error code identifying the type of error that last occured. Note that most functions set the code to 0 (success) if the function completes successfully, erasing the previous error code. Therefore, be sure to check this error code immediately after an error is found. Suggested and contributed by user on the Russian HMG forum. (see demo in folder \samples\Basic\COMMON_DIALOGS) * Modified: The Spinner control supports the similar tooltip for the arrows as well for an edit field. Above behavior is similar to DatePicker control. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\SPINNER) * Modified: The minor optimizations for a MiniGUI core reducing in the some functions: replace the expression hb_default( @<var>, <value> ) with hb_defaultValue( <var>, <value> ). It's useful for two main reasons: 1) we do not damage original parameter value; 2) if parameter is used only once then it's a little bit faster. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HBPrinter library v.2.44: - Fixed: conflict with xHarbour internal class NUMERIC (nasty bug). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.23.0 (from 3.23.0dev). Contributed by Grigory Filatov <gfilatov@inbox.ru> * New: 'Get User Locale Numerics' sample. Based upon a contribution of HMG user Edward. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\GetUserLocaleInfo) * Updated: 'Check User Login in the transparent form' sample: - retrieve the image sizes from an application's resource. Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\Login_2) * Updated: 'StatusBar with ProgressBar' sample: - use the function SuppressKeyAndMouseEvents() for blocking of the mouse and keyboard pressing in a loop. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\StatusBar_ProgressBar) * Updated: 'DBF Header Info' sample: - code cleaning for warnings with Harbour switch -w3. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\dbfHeaderInfo) * Updated: 'Print Pie Graph' sample: updated the data for March 2018. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo.prg in folder \samples\Basic\GraphPrint) * Updated: MAINDEMO (SYNTAX I) sample: - updated a graph printing for compatibility with xHarbour. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see at folder \samples\Basic\MAINDEMO_(SYNTAX_I))
| Благодарю за Ваше внимание
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5818
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.04.18 10:39. Заголовок: Ждем ! :sm36: Нов..
Ждем ! Новая версия МиниГуи 18.03 Ошибка в методе oBrw:ExcelOle(cXlsFile, ...) !!! Отрезает имя файла, когда задаёшь полный путь и длинное имя файла. Хотя в методе oBrw:Excel2() всё отлично работает... Имя файла делаю так: cPath := GetStartUpFolder() + "\" // путь записи файла cMaska := "Test2_ExcelOle" // шаблон файла cXlsFile := cPath + cMaska + "_" + DTOC( DATE() ) + "_" cXlsFile += SUBSTR( CharRepl( ":", TIME(), "-" ), 1, 5 ) //+ ".xls" И почему то пишет в папку Мои документы, а не C:\MiniGUI\SAMPLES\Advanced\Tsb_Brw2xml\Test2_ExcelOle_17.04.2018_09-48 Может это особенность Excel 2003 ? Есть кто может это проверить на другом Excel 2003 или новее ? Григорий, пример отослал на почту ! P.S. Попробовал на Excel 2007 - то же самое, режет имя до "Test2_ExcelOle_17.04"
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1275
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.04.18 10:45. Заголовок: Не удержался и выпус..
Не удержался и выпустил новую исправленную сборку 18.04 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.04-setup.exe Рекомендуется к использованию Благодарю за Ваше внимание и поддержку P.S. В последний момент в эту сборку были включены изменения в библиотеку TSBrowse по просьбе Андрея...
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5820
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.04.18 18:06. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | P.S. В последний момент в эту сборку были включены изменения в библиотеку TSBrowse по просьбе Андрея... |
| СПАСИБО ! Буду тестировать этот oBrw:ExcelOle() ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1819
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.05.18 20:35. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте пожалуйста h_objmisc.prg *-----------------------------------------------------------------------------* FUNCTION Do_Obj( nHandle, bBlock, p1, p2, p3 ) *-----------------------------------------------------------------------------* LOCAL o IF hmg_IsWindowObject( nHandle ) o := hmg_GetWindowObject( nHandle ) IF ISBLOCK( bBlock ) IF o:IsWindow RETURN Do_WindowEventProcedure ( bBlock, o:Index, o, p1, p2, p3 ) ELSE RETURN Do_ControlEventProcedure ( bBlock, o:Index, o, p1, p2, p3 ) ENDIF ENDIF ENDIF RETURN o Пример APP_OOPREPORT\demo.prg, заменить *-----------------------------------------------------------------------------* FUNC wPost( nEvent, nIndex, xParam ) *-----------------------------------------------------------------------------* LOCAL oWnd If HB_ISOBJECT(nIndex) oWnd := _WindowObj(nIndex:cParentWnd) oWnd:SetProp(nEvent, xParam) oWnd:PostMsg(nEvent) Else DEFAULT nEvent := val( This.Name ) If nEvent > 0 oWnd := (ThisWindow.Object) oWnd:SetProp(nEvent, xParam) oWnd:PostMsg(nEvent, nIndex) EndIf EndIf RETURN Nil *-----------------------------------------------------------------------------* FUNC wSend( nEvent, nIndex, xParam ) *-----------------------------------------------------------------------------* LOCAL oWnd If HB_ISOBJECT(nIndex) oWnd := _WindowObj(nIndex:cParentWnd) oWnd:SetProp(nEvent, xParam) oWnd:SendMsg(nEvent) Else DEFAULT nEvent := val( This.Name ) If nEvent > 0 oWnd := (ThisWindow.Object) oWnd:SetProp(nEvent, xParam) oWnd:SendMsg(nEvent, nIndex) EndIf EndIf RETURN Nil Это для передачи параметров в блок кода события. :Event( 1, {|ow,ky| myEvent(ow, ky) } ) В блоке кода извлекаем параметры Func myEvent( oW, nEvent ) xParam := oW:GetProp(nEvent) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1278
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.05.18 20:57. Заголовок: SergKis пишет: Попр..
SergKis пишет: Добавил эти корректировки... Благодарю за помощь
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1280
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.05.18 11:54. Заголовок: Всем кому это интере..
Всем кому это интересно Подготовил первый RC для новой сборки библиотеки со следующим списком изменений Скрытый текст
* Fixed: Program crash at using of ANIMATERES User Component (introduced in the build 17.11). Problem was reported by Pierpaolo Martinello. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\AVI_Animation) * New: Added possibility to set/get of the NON CLIENT attributes of windows at runtime. You can get the following properties with the functions: - GetWindowBorderSize(); - GetScrollBarSize(); - GetTitleBarWidth() and GetTitleBarHeight(); - GetMenuBarSize(). You can set these properties with the commands: SET WINDOW BORDER TO <nPixels> SET SCROLLBAR [SIZES] TO <nPixels> SET TITLEBAR [ WIDTH | HEIGHT ] TO <nPixels> SET [STANDARD] MENU [SIZES] TO <nPixels> Warning: Settings of the above attributes will affect on the all opened windows of the external applications also. Please use these possibilities with a caution. Added the new commands to support a font tuning: SET TITLEBAR FONT TO <fontname>, <fontsize> [BOLD] [CHARSET <n>] SET [STANDARD] MENU FONT TO <fname>,<fsize> [BOLD] [CHARSET <n>] SET STATUSBAR FONT TO <fontname>, <fontsize> [BOLD] [CHARSET <n>] SET MESSAGEBOX FONT TO <fontname>, <fontsize> [BOLD] [CHARSET <n>] Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\SETNONCLIENT) * Modified: A minor optimization in the Browse control: - added static function RestoreWorkArea( <Alias> ). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Basic\DATA_BOUND) * Updated: Internal OOP: improved function Do_Obj(). Suggested and contributed by Sergej Kiselev (see demo in folder \samples\Advanced\APP_OOPREPORT) * Updated: Config file of hbmk2 utility: - obsolete HbOle library is not required for Harbour anymore. It was replaced with using of the hbwin and xhb contrib libraries. Remark: It was a postponed modification. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see minigui.hbc in folder \harbour\bin) * Updated: PScript library source code (see in folder \Source\PageScript). Contribution of Richard Visscher <richard/at/irvis.com> (see demo in folder \samples\Advanced\PageScript and help file PageScript.chm in folder \Doc) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - New: added method SetKeyEvent() in TSColumn class. Sample code: oBrw:aColumns[nCol]:SetKeyEvent(VK_F2, {|og,vk| ProcessKey(og,vk)}) Suggested and contributed by SergKis. - Updated: minor corrections in the method ExcelOle(). Requested by Verchenko Andrey <verchenkoag@gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\Tsb_Brw2xml) * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.24.0dev (from 3.23.1). Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: Harbour Compiler 3.2.0dev (SVN 2018-05-11 12:23): * Updated: OpenSSL wrapper for using of the version 1.0.2n. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: HMGS-IDE v.1.4.3.3 Project Manager and Two-Way Visual Form Designer. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look for what's new at changelog.txt in folder \Ide) * New: 'My Error Function' sample is based upon the Harbour DerError function. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\MyErrorFunc_2) * New: 'Virtual Keyboard' sample. Based upon a contribution of Paulo Toledo. (see in folder \samples\Basic\VIRTUALKBD) * New: 'Process Terminator' sample is based upon the WMI command line 'process <ProcessId> delete'. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Advanced\PROCESS_TERMINATOR) * Updated: 'Calculator' sample: the numerous improvements. Don't miss this very interesting expansion! Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Basic\Calc) * Updated: OLE sample: - New: added Excel 3D Chart creation; - Modified: using of win_OleAuto class from hbwin library instead of TOleAuto class from HbOle library. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\OLE) * Updated: 'Bmp To Jpg' sample: - use BosTaurus library for saving of a BMP image to JPEG format instead of an external DLL. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\BmpToJpg) * Updated: 'Ftp Client' sample based upon the TIP library: - restyling of site Manager with ultimation of code for mask/unmask password; - added the ability to set up the initial folder on a server; - added the ability to enable/disable a log file; - added columns sort feature on a client side; - added backward navigation on a server side. Contributed by Pierpaolo Martinello <pier.martinello[at]alice.it> (see in folder \samples\Advanced\FtpClient) * Updated: 'Print List' samples: fixed a crash at Excel closing. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Basic\print_list) * Updated: The following samples are revised for compatibility with the recent Minigui modifications: - \samples\Basic\CONTACTOS_3; - \samples\Advanced\CONTROL_PANEL; - \samples\Advanced\GregorianCalendar; - \samples\Advanced\ReadXLS; - \samples\Advanced\TSBrowse; - \samples\Applications\Daily; - \samples\Applications\DBFview; - \samples\Applications\MiniGraph. Contributed by Grigory Filatov <gfilatov@inbox.ru>
| Благодарю за Ваше внимание
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1824
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.05.18 10:05. Заголовок: gfilatov2002 У себя..
gfilatov2002 У себя сделал правку (для обхода picture при lMultiLine == .T.) METHOD DrawLine( xRow ) CLASS TSBrowse ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays Else uData := Eval( oColumn:bData ) EndIf lMultiLine := Valtype( uData ) == "C" .and. At( Chr( 13 ), uData ) > 0 nVertText := 0 lCheck := ( oColumn:lCheckBox .and. ValType( uData ) == "L" .and. oColumn:lVisible ) ... ElseIf ! lCheck .and. oColumn:lEmptyValToChar .and. Empty( uData ) uData := "" ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) ElseIf lMultiLine Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf nAlign := If( ValType( nAlign ) == "B", Eval( nAlign, nJ, Self ), nAlign ) ... EndIf // lMultiLine := Valtype( uData ) == "C" .and. At( Chr( 13 ), uData ) > 0 If oColumn:l3DTextCell != Nil ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... lAdjBmp := oColumn:lAdjBmp nAlign := oColumn:nAlign lOpaque := .t. lMulti := .F. If nJ == 1 .and. ! Empty( ::hBmpCursor ) uBmpCell := ::hBmpCursor ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays Else uData := Eval( oColumn:bData ) EndIf lMulti := Valtype( uData ) == "C" .and. At( Chr( 13 ), uData ) > 0 cPicture := If( ValType( oColumn:cPicture ) == "B", Eval( oColumn:cPicture, ::nAt, nJ, Self ), ; oColumn:cPicture ) lCheck := ( oColumn:lCheckBox .and. ValType( uData ) == "L" .and. oColumn:lVisible ) ... ElseIf ! lCheck .and. oColumn:lEmptyValToChar .and. Empty( uData ) uData := "" ElseIf Empty( cPicture ) uData := If( Valtype( uData ) != "C", cValToChar( uData ), uData ) ElseIf lMulti Else uData := If( uData == NIL, "", Transform( uData, cPicture ) ) EndIf EndIf ... Default hBitMap := 0 // lMulti := Valtype( uData ) == "C" .and. At( Chr( 13 ), uData ) > 0 If lCheck ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1834
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.06.18 11:44. Заголовок: gfilatov2002 Добави..
gfilatov2002 Добавить для получения массивом установленных значений :SetProp CLASS TKeyData ... _METHOD GetAll( lAll ) ... METHOD GetAll( lAll ) CLASS TKeyData LOCAL aRet := {} If lAll == Nil; ::Eval({|val,key| AAdd(aRet, { val, key }) }) ElseIf lAll ; ::Eval({|val | AAdd(aRet, val ) }) Else ; ::Eval({|val,key| AAdd(aRet, { key, val }) }) EndIf RETURN aRet ... CLASS TThrData ... _METHOD GetAll( lAll ) ... METHOD GetAll( lAll ) CLASS TThrData LOCAL aRet := {} If lAll == Nil; ::Eval({|val,key| AAdd(aRet, { val, key }) }) ElseIf lAll ; ::Eval({|val | AAdd(aRet, val ) }) Else ; ::Eval({|val,key| AAdd(aRet, { key, val }) }) EndIf RETURN aRet ... CLASS TWndData ... METHOD AllProp( lArray ) INLINE ::oProp:GetAll( lArray ) ... Следующее предложение не так однозначно (в метод ControlAssign cMessage получаем в upper из __GetMessage() ) CLASS TWndData ... VAR oHand AS OBJECT VAR oNameUpper AS OBJECT EXPORTED: ... METHOD Def( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ... ::oName := oKeyData(), ::oHand := oKeyData(), ; ::oNameUpper := oKeyData(), ; ::oProp := oKeyData(), hmg_SetWindowObject( ::nHandle, Self ), ; ... METHOD GetObj( xName ) INLINE iif( HB_ISCHAR( xName ), ::oName:Get( xName ), ; ::oHand:Get( xName ) ) METHOD GetObjByName( cName ) INLINE ::oNameUpper:Get( upper(cName) ) // Destructor METHOD Destroy() INLINE ( ; ... ::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy() , Nil ), ; ::oNameUpper := iif( HB_ISOBJECT( ::oNameUpper ), ::oNameUpper:Destroy() , Nil ), ; ::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy() , Nil ), ; ... #endif ERROR HANDLER ControlAssign ENDCLASS ... METHOD ControlAssign( xValue ) CLASS TWndData LOCAL cMessage, uRet, lError, o cMessage := ALLTRIM( UPPER( __GetMessage() ) ) lError := .T. If PCOUNT() == 0 o := ::GetObjByName( cMessage ) If HB_ISOBJECT(o) uRet := _GetValue( , , o:nIndex ) lError := .F. EndIf ElseIf PCOUNT() == 1 o := ::GetObjByName( SUBSTR( cMessage, 2 ) ) If HB_ISOBJECT(o) _SetValue( , , xValue, o:nIndex ) uRet := _GetValue( , , o:nIndex ) lError := .F. EndIf EndIf If lError uRet := Nil ::MsgNotFound( cMessage ) EndIf RETURN uRet ... CLASS TCnlData INHERIT TWndData ... METHOD Set() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Set ( ::cName , Self ), ), ; iif( HB_ISOBJECT( ::oWin:oNameUpper ), ::oWin:oNameUpper:Set( upper(::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:oNameUpper ), ::oWin:oNameUpper:Del( upper(::cName) ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Del ( ::nHandle ), ) ) ... тогда это можно использовать так @ 90, 10 LABEL Label_3 WIDTH 100 HEIGHT 20 VALUE '' ; CENTERALIGN VCENTERALIGN TRANSPARENT ... *-----------------------------------------------------------------------------* STATIC FUNCTION SayToWait( oWnd, nEvent ) *-----------------------------------------------------------------------------* LOCAL oTsb := oWnd:GetProp( nEvent ) LOCAL nDay := oTsb:GetValue() LOCAL dDate := CalendarValue() LOCAL hForm, oForm FOR EACH hForm IN _HMG_aFormHandles oForm := _WindowObj( hForm ) If HB_ISOBJECT( oForm ) If left( oForm:Name, 3 ) == '_w_' oForm:SendMsg(93) // timers stop // oForm:GetObj('Label_3'):Value := DtoC(dDate) // _SetValue( 'Label_3', oForm:Name, DtoC(dDate) ) oForm:Label_3 := DtoC(dDate) ? oForm:Name, 'Label_3 =', oForm:Label_3 oForm:SendMsg(91) // timers start EndIf EndIf NEXT RETURN Nil
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1281
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.06.18 19:54. Заголовок: SergKis пишет: для ..
SergKis пишет: цитата: | для получения массивом установленных значений :SetProp |
| Принято. SergKis пишет: цитата: | в метод ControlAssign cMessage получаем в upper из __GetMessage() |
| Принято, кроме установки данных в upper Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1835
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.06.18 20:32. Заголовок: gfilatov2002 SergKi..
gfilatov2002 SergKis пишет цитата: | обхода picture при lMultiLine == .T. |
| Ситуация возникает, к примеру, если в 2х строчной колонке первая строка 25 байт (краткое наименование), вторая строка 50 байт (адрес). Если Picture короткий (это случается при взятии данных из справочника по ID или по краткому наим. методом LoadFields), то вторая строка через Transform обрезается. Что бы этого избежать приходится уст. Picture Repl('X', Len(<кр.наименование>)+Len(<адрес>)+Len(CRLF), что кажется лишним. Обход Transform(cPicture) при lMulti == .T. все решает
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1282
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.06.18 11:04. Заголовок: SergKis пишет: Ситу..
SergKis пишет: Благодарю за рахъяснение Принято
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1836
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.06.18 12:24. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет цитата: | Принято, кроме установки данных в upper |
| Вы правы , совсем из головы выпало, что данные контролов сохраняются в Public переменной, т.е. :oNameUpper не нужен, достаточно в некоторых мечтах сделать upper(xName)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1283
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.06.18 10:07. Заголовок: Выпущена новая сборк..
Выпущена новая сборка 18.05 для BCC 5.51 для компиляторов Harbour и xHarbour Базовый дистрибутив-инсталлятор находится по адресу http://hmgextended.com/files/CONTRIB/hmg-18.05-setup.exe Рекомендуется к использованию Благодарю за Ваше внимание и поддержку P.S. Также у нас появилось зеркало домашней страницы по адресу http://hmgextended.org Также имеются в наличии готовые сборки для следующих пар (Си-компилятор+Харбор): - MinGW 8.1.0 32-bit для Harbour 3.2.0dev; - MinGW 8.1.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.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1840
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.06.18 12:04. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте CLASS TWndData ... METHOD GetObj( xName ) INLINE iif( HB_ISCHAR( xName ), ::oName:Get( upper(xName) ), ; ::oHand:Get( xName ) ) ... METHOD GetObj4Name( cName ) CLASS TWndData ... FOR EACH cName IN hb_ATokens( upper(cName), ::cChr ) ... METHOD ControlAssign( xValue ) CLASS TWndData LOCAL cMessage, uRet, lError, o cMessage := __GetMessage() lError := .T. If PCOUNT() == 0 o := ::GetObj( cMessage ) If HB_ISOBJECT( o ) uRet := _GetValue( , , o:nIndex ) lError := .F. EndIf ElseIf PCOUNT() == 1 o := ::GetObj( SubStr( cMessage, 2 ) ) If HB_ISOBJECT( o ) _SetValue( , , xValue, o:nIndex ) uRet := _GetValue( , , o:nIndex ) lError := .F. EndIf EndIf ... CLASS TCnlData INHERIT TWndData ... METHOD Set() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Set( upper(::cName) , Self ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Set( ::nHandle, Self ), ) ) METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Del( upper(::cName) ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Del( ::nHandle ), ) ) METHOD Get( xName ) INLINE iif( HB_ISCHAR( xName ), ::oWin:oName:Get( upper(xName) ), ; ::oWin:oHand:Get( xName ) ) ... Тогда пример http://my-files.ru/e8rrl4 для проверки, собран на hmg 18.05
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1284
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.06.18 14:10. Заголовок: SergKis пишет: Попр..
SergKis пишет: Поправил код и выложил исправленный инсталлятор на сервер. SergKis пишет: цитата: | для проверки, собран на hmg 18.05 |
| Ваш пример работает... Благодарю за помощь
| |
|
Alex_Cher
|
| |
Пост N: 59
Зарегистрирован: 18.06.15
|
|
Отправлено: 07.06.18 10:01. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Выпущена новая сборка 18.05 для BCC 5.51 для компиляторов Harbour и xHarbour |
| Уважаемый Григорий, замечания - функция определения наличие в системе ( установлена Win 7) MS Office не находит программу, хотя MS Office установлен ... На сборке 18.04 проблем не было. Ole2TxtError() != 'S_OK'
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1285
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.06.18 10:38. Заголовок: Alex_Cher пишет: за..
Alex_Cher пишет: цитата: | замечания - функция определения наличие в системе ( установлена Win 7) MS Office |
| Ожидал подобное замечание, поскольку произошел отказ от устаревшей библиотеки HbOLE Alex_Cher пишет: Используйте теперь взамен такую конструкцию: цитата: | IF ( oExcel := CreateObject( "Excel.Application" ) ) == NIL MsgStop('Excel не установлен','Ошибка') RETURN Nil ENDIF |
| Именно по этой причине так долго не мог отказаться от использования библиотеки HbOLE
| |
|
Alex_Cher
|
| |
Пост N: 60
Зарегистрирован: 18.06.15
|
|
Отправлено: 07.06.18 13:47. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Используйте теперь взамен такую конструкцию |
| Уважаемый Григорий, снова проблемы с 18.05. При создание файла Excel вылетают ошибки на следующих функциях - oWorkBook:Columns( 1):Set( 'NumberFormat', '@' ) Error WINOLE/1007 Неверный аргумент: SET (DOS Error -2147352562) Called from TOLEAUTO:SET(0) Called from OBRABOTKA_ZCH(1052) in module: zatrat.prg oWorkBook:Cells( 3, 5):Set( "HorizontalAlignment", 7) Error WINOLE/1007 Неверный аргумент: SET (DOS Error -2147352562) Called from TOLEAUTO:SET(0) Called from XLS_OT_3(944) in module: zatrat.prg
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1286
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.06.18 13:55. Заголовок: Alex_Cher пишет: Пр..
Alex_Cher пишет: цитата: | При создание файла Excel вылетают ошибки на следующих функциях |
| Это устаревшие конструкции, которые использовались в HbOle. Pasha пишет: цитата: | аналогично вызов (в 2-х местах) oSheet:Range( cRange ):Set( "HorizontalAlignment", xlHAlignCenterAcrossSelection ) заменить на oSheet:Range( cRange ):HorizontalAlignment := xlHAlignCenterAcrossSelection |
| Рекомендую посмотреть исправленные примеры связи с Excel из поставки 18.05 Но, как я писал ранее, никто ведь не смотрит примеры и даже не читает список изменений
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1841
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.06.18 22:50. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение по TsColumns i_tsbrowse.ch #command DEFINE COLUMN <oCol> ; ... => ; <oCol> := TSColumn():New( ; [ If(<.oem.>, OemToAnsi(<cHead>), <cHead>) ], ; [ If( ValType(<uData>) $ "BC", <uData>, <{uData}> ) ], ; [ <cPicture> ], [ \{<aColors>\} ], [ \{<aAlign>\} ], ; ... CLASS TSColumn ... DATA cName INIT "" // An optional column name DATA cField INIT "" // FieldName column ... METHOD New( cHeading, bData, cPicture, aColors, aAlign, nWidth, ; lBitMap, lEdit, bValid, lNoLite, cOrder, cFooting, ; bPrevEdit, bPostEdit, nEditMove, lFixLite, a3DLook, ; bWhen, oBrw, cData, cWhen, cValid, cPrevEdit, cPostEdit, cMsg, cToolTip, lTotal, ; lSpinner, bUp, bDown, bMin, bMax, cError, cSpcHeading,; cDefData, cName ) CLASS TSColumn Local nEle, uAlign, xVar, aList, aClr, ; ... If HB_ISCHAR(bData) ::cField := bData bData := Nil EndIf If aColors != Nil If HB_ISARRAY( aColors ) .and. Len( aColors ) > 0 .and. HB_ISARRAY( aColors[1] ) FOR EACH aClr IN aColors If HB_ISNUMERIC( aClr[1] ) .and. aClr[1] > 0 .and. aClr[1] <= Len( aTmpColor ) aTmpColor[ aClr[1] ] := aClr[2] EndIf NEXT Else ASize( aColors, 20 ) Aeval( aColors, { |bColor,n| aTmpColor[ n ] := bColor } ) EndIf Endif ... 1. :cField - для создания колонок с неизвестным Alias, когда станет известен, получим :bData 2. Цвета задавать не все 20 штук, а по номерам\define // aColors items number #define CLR_TEXT 1 // text #define CLR_PANE 2 // back #define CLR_HEADF 3 // header text #define CLR_HEADB 4 // header back #define CLR_FOCUSF 5 // focused text #define CLR_FOCUSB 6 // focused back ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1842
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 11:44. Заголовок: PS В догонку CLASS T..
PS В догонку CLASS TSColumn ... METHOD SaveProperty( aExcept ) INLINE __objGetValueList( Self, aExcept ) METHOD RestProperty( aProp ) INLINE __objSetValueList( Self, aProp ) ENDCLASS ... Использовать a := oBrw:aColumns[1]:SaveProperty() _logfile(.T., o, o:ClassName, a) AEval(a, {|av,nv| _logfile(.T., nv, av[1], valtype(av[2]), av[2]) }) ... oBrw:aColumns[1]:RestProperty(a) ... Использовав, aExcept (массив исключаемых свойств\переменных) можно, к примеру, сохранять\восстанавливать колонки в файлах
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1287
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.06.18 12:08. Заголовок: SergKis пишет: Пред..
SergKis пишет: Все изменения приняты с благодарностью
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1843
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 12:15. Заголовок: Пояснение использова..
Пояснение использования DEFINE COLUMN oC1 DATA 'R_1' NAME 'KOD' DEFINE COLUMN oC2 DATA 'R_2' NAME 'NAM' DEFINE COLUMN oC3 DATA FieldBlock( "Field1" ) NAME 'KEY' FOR EACH o IN {oC1, oC2, oC3} a := o:SaveProperty() _logfile(.T., o, o:ClassName, a, '------------') AEval(a, {|av,nv| _logfile(.T., nv, av[1], valtype(av[2]), av[2]) }) NEXT
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1844
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 13:52. Заголовок: gfilatov2002 В прод..
gfilatov2002 В продолжении по TsColumn. В колонке есть :cAlias, используемый в методах LoadRelated и PostEdit. LoadRelated вызываем руками специально (заполняет на колонку :cAlias) PostEdit при :lEdit == .T. может записать по :cAlias колонки. Других мест не увидел. Предложение исп. :cAlias колонки для получения uData из другой области, отличной от oBrw:cAlias. METHOD DrawLine( xRow ) CLASS TSBrowse ... Local aBitMaps, lCheckVal := .F., cColAls ... hFont := If( hFont == Nil, 0, hFont ) cColAls := oColumn:cAlias ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays ElseIf cColAls != Nil uData := ( cColAls )->( Eval( oColumn:bData ) ) Else uData := Eval( oColumn:bData ) EndIf ... METHOD DrawSelect( xRow ) CLASS TSBrowse ... Local aBitMaps, lCheckVal := .F., cColAls ... lMulti := .F. cColAls := oColumn:cAlias If nJ == 1 .and. ! Empty( ::hBmpCursor ) ... Else If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays ElseIf cColAls != Nil uData := ( cColAls )->( Eval( oColumn:bData ) ) Else uData := Eval( oColumn:bData ) EndIf ... Правки не сломают PostEdit и позволят делать так DEFINE COLUMN oC3 DATA FieldBlock( "Field1" ) NAME 'KEY' или ADD COLUMN ... oC3:cAlias := 'KLIENT' Для удобства можно сделать CLASS TSColumn ... METHOD New( cHeading, bData, cPicture, aColors, aAlign, nWidth, ; ... lSpinner, bUp, bDown, bMin, bMax, cError, cSpcHeading,; cDefData, cName, cAlias ) CLASS TSColumn ... lCheck := .F. ::cAlias := cAlias If HB_ISCHAR(bData) ... i_tsbrowse.ch #command DEFINE COLUMN <oCol> ; ... [ NAME <name> ] ; [ ALIAS <alias> ] ; => ; <oCol> := TSColumn():New( ; ... [<cMsg>], [ <cToolTip> ], [ <.total.> ],,,,,,,,, [ <"name"> ], [ <"alias"> ] ) ... и в других #command ADD [ COLUMN ] ... тоже
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1845
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 14:10. Заголовок: PS Что бы избежать в..
PS Что бы избежать влияния LoadRelated, добавим в него METHOD LoadRelated( cAlias, lEditable, aNames, aHeaders ) CLASS TSBrowse ... ATail( ::aColumns ):cAlias := cAlias ATail( ::aColumns ):cData := cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cField := cAlias + "->" + FieldName( nE ) Next ... Поправим cColAls в методах DrawLine и DrawSelect на cColAls := If( '->' $ oColumn:cField, Nil, oColumn:cAlias ) ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1846
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 14:18. Заголовок: PS Возможно лучше то..
PS Возможно лучше тогда в методе LoadRelated заменить использование FieldWBlock на FieldBlock cBlock := 'FieldWBlock( "' + ( cAlias )->( Field( nE ) ) + '", Select( "' + ; cAlias + '" ) )' ::AddColumn( TSColumn():New( cHeading, FieldWBlock( ( cAlias )->( Field( nE ) ), nArea ),, ;
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5908
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.06.18 14:23. Заголовок: Новая версия 18.05, ..
Новая версия 18.05, METHOD ExcelOle() Нашёл такой код: Try oExcel := CreateObject( "Excel.Application" ) Catch MsgStop( "Excel is not available. [" + Ole2TxtError() + "]", "Error" ) Return Nil End Try А он точно правильный ? Может надо win_oleErrorText() поставить ?
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1289
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.06.18 14:35. Заголовок: Andrey пишет: он то..
Andrey пишет: Правильный Функция Ole2TxtError() берется эдесь из библиотеки xHb
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1847
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 16:43. Заголовок: gfilatov2002 Ошибка..
gfilatov2002 Ошибка закралась CLASS TSBROWSE METHOD GetValue( xCol ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; EVal( ::GetColumn(xCol):bData ) ) METHOD SetValue( xCol, xVal ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; EVal( ::SGetColumn(xCol):bData, xVal ) ) у себя сделал (больше нравится) // METHOD GetValue( xCol ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; // EVal( ::GetColumn(xCol):bData ) ) // METHOD SetValue( xCol, xVal ) INLINE ( xCol := hb_defaultValue(xCol, ::nCell), ; // EVal( ::GetColumn(xCol):bData, xVal ) ) METHOD Value( xCol, xVal ) METHOD SetValue( xCol, xVal ) INLINE ::Value( xCol, xVal ) METHOD GetValue( xCol ) INLINE ::Value( xCol ) ... METHOD Value( xCol, xVal ) CLASS TSBrowse LOCAL xRet, oCol, cAls xCol := hb_defaultValue(xCol, ::nCell) oCol := ::GetColumn(xCol) cAls := oCol:cAlias // !!! If empty(cAls) .or. '->' $ oCol:cField // !!! If PCOUNT() > 1 EVal( oCol:bData, xVal ) Else xRet := EVal( oCol:bData ) EndIf Else If PCOUNT() > 1 (cAls)->( EVal( oCol:bData, xVal ) ) Else xRet := (cAls)->( EVal( oCol:bData ) ) EndIf EndIf RETURN xRet ... // !!! - это добавка по предложениям выше ... *-----------------------------------------------------------------------------* FUNCTION _SetValue ( ControlName, ParentForm, Value, index ) *-----------------------------------------------------------------------------* ... CASE T == "TBROWSE" oGet := _HMG_aControlIds [ix] IF oGet:lInitGoTop IF ISNUMBER( Value ) .AND. Value > 0 oGet:GoPos( Value ) Eval( oGet:bGoToPos, Value ) oGet:Refresh( .T. ) ENDIF ELSE // Eval( oGet:GetColumn( oGet:nCell ):bData, Value ) oGet:SetValue( oGet:nCell, Value ) ENDIF ... *-----------------------------------------------------------------------------* FUNCTION _GetValue ( ControlName, ParentForm, Index ) *-----------------------------------------------------------------------------* ... CASE T == "TBROWSE" oGet := _HMG_aControlIds [ix] retval := oGet:GetValue( oGet:nCell ) // retval := Eval( oGet:GetColumn( oGet:nCell ):bData )
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1848
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 20:00. Заголовок: gfilatov2002 пишет В..
gfilatov2002 пишет Поправьте метод METHOD LoadFields( lEditable ) CLASS TSBrowse ... ATail( ::aColumns ):cData := ::cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cName := ( ::cAlias )->( FieldName( nE ) ) // 21.07.2015 ATail( ::aColumns ):cField := ( ::cAlias )->( FieldName( nE ) ) If cType == "L" ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1849
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 20:23. Заголовок: PS Установка цвета в..
PS Установка цвета в тсб так же как в TsColumn * METHOD TSBrowse:New() Version 9.0 Nov/30/2009 ... If aColors != Nil If HB_ISARRAY( aColors ) .and. Len( aColors ) > 0 .and. HB_ISARRAY( aColors[1] ) FOR EACH aClr IN aColors If HB_ISNUMERIC( aClr[1] ) .and. aClr[1] > 0 .and. aClr[1] <= Len( aTmpColor ) aTmpColor[ aClr[1] ] := aClr[2] EndIf NEXT Else Aeval( aColors, { |bColor,nEle| aTmpColor[ nEle ] := bColor } ) EndIf // Aeval( aColors, { | bColor, nEle | aTmpColor[ nEle ] := bColor } ) EndIf ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1290
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.06.18 20:32. Заголовок: SergKis пишет: ..
SergKis пишет: цитата: | If HB_ISARRAY( aColors ) .and. Len( aColors ) > 0 .and. HB_ISARRAY( aColors[1] ) |
| Этой проверки недостаточно для корректной работы. Проверил, что Sample1 из базового примера в папке Advanced\TSBrowse вылетает на втором элементе массива.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1850
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 20:47. Заголовок: gfilatov2002 Еще, н..
gfilatov2002 Еще, на мой взгляд неточность METHOD LoadRelated( cAlias, lEditable, aNames, aHeaders ) CLASS TSBrowse ... было ATail( ::aColumns ):cData := cAlias + "->" + FieldName( nE ) ATail( ::aColumns ):cField := cAlias + "->" + FieldName( nE ) надо ATail( ::aColumns ):cData := cAlias + "->" + ( cAlias )->( FieldName( nE ) ) ATail( ::aColumns ):cField := cAlias + "->" + ( cAlias )->( FieldName( nE ) ) ATail( ::aColumns ):cName := cAlias + "->" + ( cAlias )->( FieldName( nE ) ) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1291
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.06.18 20:58. Заголовок: SergKis пишет: Еще,..
SergKis пишет: цитата: | Еще, на мой взгляд неточность |
| Спасибо, поправил
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1851
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 21:31. Заголовок: gfilatov2002 пишет Э..
gfilatov2002 пишет цитата: | Этой проверки недостаточно для корректной работы. Проверил, что Sample1 из базового примера в папке Advanced\TSBrowse вылетает на втором элементе массива. |
| Упустил я изменения (передвигаюсь между своим проектом lib и 18.05, еще и внук отвлек) FUNCTION _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... LOCAL aTmpColor := Array( 20 ), lColors := .F., aClr ... IF aColors != NIL .AND. ValType( aColors ) == 'A' If ( lColors := HB_ISARRAY( aColors ) .and. Len( aColors ) > 0 .and. HB_ISARRAY( aColors[1] ) ) FOR EACH aClr IN aColors If HB_ISNUMERIC( aClr[1] ) .and. aClr[1] > 0 .and. aClr[1] <= Len( aTmpColor ) aTmpColor[ aClr[1] ] := aClr[2] EndIf NEXT Else AEval( aColors, {| bColor, nEle | aTmpColor[ nEle ] := bColor } ) EndIf ENDIF IF ValType( fontcolor ) != "U" If lColors AAdd(aTmpColor, { CLR_TEXT, RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) }) Else aTmpColor[ 1 ] := RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) EndIf ENDIF IF ValType( backcolor ) != "U" If lColors AAdd(aTmpColor, { CLR_PANE, RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) }) Else aTmpColor[ 2 ] := RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) EndIf ENDIF ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1852
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 21:47. Заголовок: Упс. перегнул чуток ..
Упс. перегнул чуток LOCAL aTmpColor := Array( 20 ), lColors := .F., aClr ... If ( lColors := HB_ISARRAY( aColors ) .and. Len( aColors ) > 0 .and. HB_ISARRAY( aColors[1] ) ) ... IF ValType( fontcolor ) != "U" If lColors AAdd(aTmpColor, { CLR_TEXT, RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) }) Else aTmpColor[ 1 ] := RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) EndIf ENDIF IF ValType( backcolor ) != "U" If lColors AAdd(aTmpColor, { CLR_PANE, RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) }) Else aTmpColor[ 2 ] := RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) EndIf ENDIF ... lColors не нужна
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1292
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.06.18 22:29. Заголовок: SergKis пишет: FUNC..
SergKis пишет: Благодарю за помощь! С этим исправлением контрольный пример работает
| |
|
Dima
|
| |
Пост N: 6842
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.06.18 22:29. Заголовок: SergKis пишет: еще ..
SergKis пишет: SergKis пишет: Отдохни , утро вечера мудренее
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1853
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.06.18 23:25. Заголовок: Dima Спасибо, уже п..
Dima Спасибо, уже пооошееел. Только мысли не отпускают , надо базу колонок сделать и из нее создавать тсб. Массивами наглядно, но они, паразиты, улазят за экран . Вот и полез ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1854
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 10:24. Заголовок: gfilatov2002 пишет С..
gfilatov2002 пишет цитата: | С этим исправлением контрольный пример работает |
| Так тоже работает Local aColors := {} ... AAdd( aColors, { 5, CLR_BLACK} ) AAdd( aColors, { 2, CLR_NBLUE} ) AAdd( aColors, { 1, CLR_BLACK} ) AAdd( aColors, { 3, CLR_WHITE} ) AAdd( aColors, {13, CLR_WHITE} ) AAdd( aColors, {15, CLR_BLACK} ) DEFINE TBROWSE Brw_1 AT 0, 0 ALIAS "Employee" ; COLORS aColors ; WIDTH nBrwWidth HEIGHT nBrwHeight ; ... :SetColor( { 6 }, {{ CLR_WHITE, CLR_BLACK }} ) // degraded cursor background color /* :SetColor( { 1, 3, 5, 6, 13, 15 }, ; { CLR_BLACK, CLR_WHITE, CLR_BLACK, ; { CLR_WHITE, CLR_BLACK }, ; // degraded cursor background color CLR_WHITE, CLR_BLACK } ) // text colors */ ... вариант такой не сработал (пока не смотрел), добавить AAdd( aColors, { 6, { CLR_WHITE, CLR_BLACK }} ) убрать // :SetColor( { 6 }, {{ CLR_WHITE, CLR_BLACK }} ) // degraded cursor background color
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1855
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 11:54. Заголовок: SergKis пишет вариан..
SergKis пишет цитата: | вариант такой не сработал |
| Надо добавить FUNCTION _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... IF ValType( aColSel ) != 'U' .AND. ValType( aColSel ) == 'A' IF ValType( aColSel[ 1 ] ) == 'A' aColSel := aColSel[ 1 ] ENDIF ENDIF IF HB_ISARRAY(aColors) .and. Len( aColors ) > 0 .AND. ValType( aColors[ 1 ] ) == 'A' aColors := aColors[ 1 ] ENDIF IF ValType( uWhen ) == 'B' /* BK 18.05.2015 */ ... тогда работает AAdd( aColors, { 5, CLR_BLACK} ) AAdd( aColors, { 2, CLR_NBLUE} ) AAdd( aColors, { 1, CLR_BLACK} ) AAdd( aColors, { 3, CLR_WHITE} ) AAdd( aColors, {13, CLR_WHITE} ) AAdd( aColors, {15, CLR_BLACK} ) AAdd( aColors, { 6, { CLR_WHITE, CLR_BLACK }} ) AAdd( aColors, { 2, { CLR_WHITE, CLR_NBLUE }} ) AAdd( aColors, { 4, { CLR_WHITE, CLR_BLACK }} ) AAdd( aColors, {14, { CLR_HRED, CLR_BLACK }} ) DEFINE TBROWSE Brw_1 AT 0, 0 ALIAS "Employee" ; COLORS aColors ; WIDTH nBrwWidth HEIGHT nBrwHeight ; MESSAGE "Cell height idependent of the font size using oBrw:nHeightCell. " +; "Also try multi-select feature by double clicking." :LoadFields( .F. ) /* :SetColor( { 1, 3, 5, 6, 13, 15 }, ; { CLR_BLACK, CLR_WHITE, CLR_BLACK, ; { CLR_WHITE, CLR_BLACK }, ; // degraded cursor background color CLR_WHITE, CLR_BLACK } ) // text colors :SetColor( { 2, 4, 14 }, ; { { CLR_WHITE, CLR_NBLUE }, ; // degraded cells background color { CLR_WHITE, CLR_BLACK }, ; // degraded headers backgroud color { CLR_HRED, CLR_BLACK } } ) // degraded order column background color */ ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1856
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 12:47. Заголовок: gfilatov2002 В TsCo..
gfilatov2002 В TsColumn добавить методы METHOD SetProperty ( cName, xVal ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil ) METHOD GetProperty ( cName ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, cName ), Nil ) использовать DEFINE COLUMN oC1 DATA 'R_1' NAME 'KOD' ALIAS U08 DEFINE COLUMN oC2 DATA 'R_2' NAME 'NAM' ALIAS U08 DEFINE COLUMN oC3 DATA FieldBlock("Field1") NAME 'KEY' ALIAS U04 DEFINE COLUMN oC4 DATA 'R_1+R_2' NAME 'KDM' ALIAS U08 FOR EACH o IN {oC1, oC2, oC3, oC4} a := o:SaveProperty() msglog(o, o:ClassName, a, '------------') AEval(a, {|av,nv| msglog( nv, av[1], valtype(av[2]), av[2]) }) o:SetProperty('cData', '') AEval({'cData', 'cField'}, {|cv,nv| msglog( nv, o:GetProperty(cv)) }) NEXT
| |
|
PSP
|
| постоянный участник
|
Пост N: 1436
Зарегистрирован: 27.01.07
|
|
Отправлено: 09.06.18 13:07. Заголовок: SergKis пишет: FOR ..
SergKis пишет: цитата: | FOR EACH o IN {oC1, oC2, oC3, oC4} a := o:SaveProperty() |
| Опечатка?
| |
|
Dima
|
| |
Пост N: 6845
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.06.18 13:08. Заголовок: PSP пишет: Опечатка..
PSP пишет: Это снова внук видимо
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1857
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 15:48. Заголовок: Dima пишет Опечатка ..
Dima пишет Нет. Добавлены методы сохранить в массив переменные колонки или восстановить из массива CLASS TSColumn ... METHOD SaveProperty( aExcept ) INLINE __objGetValueList( Self, aExcept ) METHOD RestProperty( aProp ) INLINE __objSetValueList( Self, aProp ) добавил еще (проще небольшие замены\получения значений делать) METHOD SetProperty ( cName, xVal ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, '_'+cName, xVal ), Nil ) METHOD GetProperty ( cName ) INLINE iif( __objHasData( Self, cName ), __objSendMsg( Self, cName ), Nil ) Переменных в массиве много и исп. aExcept (массив исключаемых свойств\переменных) можно, но накладно ... Надо еще Clone сделать, но пока не у того компа. Двигаю базу колонок на DFINE COLUMN ..., как выше, потом для конкр. тсб набирать из базы объекты, чуть поправил и в тсб отбравил типа так AEval({oC1, ...., oCn}, {|ocol| oBrw:AddColumn(ocol) }) И массив цветов, практически, глобальный на задачу, чуть подправить, если что
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1858
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 18:44. Заголовок: gfilatov2002 Добави..
gfilatov2002 Добавить в TSColumn METHOD Clone() INLINE __objClone( Self ) Интересный вывод по установке в колонку cAlias, для себя сделал. Не использовать метод LoadRelated (и ранее не использовал). Не использовать в :bData FieldWBlock с привязкой к workarea (использовал) ! Применять FieldBlock для полей и hb_MacroBlock для выражений из полей (типа trim(R_34)+' '+...). Ставить в каждую колонку нужный алиас, повторяя oBrw:cAlias или другой workarea. В результате будем иметь в тсб uData := ( oCol:cAlias )->( EVal( oCol:bData ) ) Кое что упрощается.
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1293
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.06.18 19:44. Заголовок: SergKis пишет: Доба..
SergKis пишет: Все поправки и дополнения, кроме цитата: | IF HB_ISARRAY(aColors) .and. Len( aColors ) > 0 .AND. ValType( aColors[ 1 ] ) == 'A' aColors := aColors[ 1 ] ENDIF |
| были приняты
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1859
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.18 20:17. Заголовок: gfilatov2002 пишет к..
gfilatov2002 пишет Там же препроцессор добавляет лишние { }
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1860
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.18 23:52. Заголовок: gfilatov2002 Добави..
gfilatov2002 Добавил CLASS TSBrowse FROM TControl ... METHOD SetValue ( xCol, xVal ) INLINE ::Value( xCol, xVal ) METHOD GetValue ( xCol ) INLINE ::Value( xCol ) METHOD bDataEval( oCol ) INLINE iif( empty( oCol:cAlias ) .or. '->' $ oCol:cField, ; EVal( oCol:bData ), ( oCol:cAlias )->( EVal( oCol:bData ) ) ) ... Static Function SetHeights( oBrw ) ... For nEle := 1 TO Len( oBrw:aColumns ) oColumn := oBrw:aColumns[ nEle ] cHeading := oBrw:bDataEval( oColumn ) // cHeading := Eval( oColumn:bData ) ... Начал тестировать. Набросок примера http://my-files.ru/qqjal9
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1294
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.06.18 09:52. Заголовок: SergKis пишет: Доба..
SergKis пишет: Принято, благодарю за помощь SergKis пишет: Супер
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1861
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.18 11:55. Заголовок: gfilatov2002 У себя..
gfilatov2002 У себя сделал CLASS TWndData ... METHOD Hide() INLINE _HideWindow( ::cName ) METHOD SetFocus( xName ) INLINE iif( empty(xName), SetFocus(::nHandle) , ::GetObj(xName):SetFocus() ) METHOD SetSize( y, x, w, h ) INLINE _SetWindowSizePos( ::cName, y, x, w, h ) Переключать фокус на контрол окна oWnd:SetFocus('oBrw') focus на tsb
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1295
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.06.18 12:28. Заголовок: SergKis пишет: У се..
SergKis пишет: OK, принято
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1862
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.18 15:03. Заголовок: gfilatov2002 Пример..
gfilatov2002 Пример довел до какой то кондиции. http://my-files.ru/923enb Старое не сломалось (вроде), новое работает. Показал, как избавиться от public переменных базы колонок. На модальных окнах справ. включается edit (не ключевые поля)
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1296
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.06.18 15:23. Заголовок: SergKis пишет: Прим..
SergKis пишет: Очень хорошо! SergKis пишет: цитата: | Старое не сломалось (вроде), новое работает. |
| У меня работает тоже
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1863
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.18 16:02. Заголовок: gfilatov2002 Добавь..
gfilatov2002 Добавьте строку в пример (у меня автоматом уст. в lib, в hmg забываю ставить) FUNC Tsb_Create( cName, nY, nX, nW, nH, aCols ) ... :lFooting := .T. :lNoKeyChar := .T. :lNoVScroll := .F. ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1297
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.06.18 16:18. Заголовок: SergKis пишет: Доба..
SergKis пишет: Благодарю, уже добавил...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1864
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 08:30. Заголовок: gfilatov2002 Сделал..
gfilatov2002 Сделал вариант #xcommand DEFINE TBROWSE <name> TO <obrw> ; AT <row>,<col> ; ... =>; <obrw> :=_DefineTBrowse (<"name"> , ; ... with object <obrw> ... разделил имя тсб и имя переменной
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1298
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.18 09:54. Заголовок: SergKis пишет: разд..
SergKis пишет: цитата: | разделил имя тсб и имя переменной |
| Благодарю за идею! Только использовал ключевое слово OBJ вместо TO цитата: | #xcommand DEFINE TBROWSE <name> OBJ <obrw> ; AT <row>,<col> ; |
|
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1865
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 10:03. Заголовок: gfilatov2002 Еще по..
gfilatov2002 Еще по цветам и фонтам (не работает как надо сейчас) #command DEFINE COLUMN <oCol> ; ... => ; <oCol> := TSColumn():New( ; ... [ <"name"> ], [ <"alias"> ], .T. ) ... т.е. находимся в define columns - не делать заполнение цветов, фонтов по default (все в nil) CLASS TSColumn ... METHOD DefColor() METHOD DefFont() ENDCLASS ... METHOD DefFont( oBrw ) CLASS TSColumn LOCAL hFont , ; hFontHead , ; hFontFoot , ; hFontEdit , ; hFontSpcHd If oBrw != Nil hFont := oBrw:hFont hFontHead := If( Empty( oBrw:hFontHead ), oBrw:hFont, oBrw:hFontHead ) hFontFoot := If( Empty( oBrw:hFontFoot ), oBrw:hFont, oBrw:hFontFoot ) hFontEdit := If( Empty( oBrw:hFontEdit ), oBrw:hFont, oBrw:hFontEdit ) hFontSpcHd := If( Empty( oBrw:hFontSpcHd ), oBrw:hFont, oBrw:hFontSpcHd ) Default ::hFont := hFont , ; ::hFontHead := hFontHead , ; ::hFontFoot := hFontFoot , ; ::hFontEdit := hFontEdit , ; ::hFontSpcHd := hFontSpcHd EndIf RETURN Self METHOD DefColor( oBrw ) CLASS TSColumn LOCAL aTmpColor := Array( 20 ) If oBrw != Nil Default aTmpColor[ 1 ] := oBrw:nClrText, ; aTmpColor[ 2 ] := oBrw:nClrPane, ; aTmpColor[ 3 ] := oBrw:nClrHeadFore, ; aTmpColor[ 4 ] := oBrw:nClrHeadBack, ; aTmpColor[ 5 ] := oBrw:nClrFocuFore, ; aTmpColor[ 6 ] := oBrw:nClrFocuBack Default aTmpColor[ 7 ] := oBrw:nClrEditFore, ; aTmpColor[ 8 ] := oBrw:nClrEditBack, ; aTmpColor[ 9 ] := oBrw:nClrFootFore, ; aTmpColor[ 10 ] := oBrw:nClrFootBack, ; aTmpColor[ 11 ] := oBrw:nClrSeleFore, ; aTmpColor[ 12 ] := oBrw:nClrSeleBack, ; aTmpColor[ 13 ] := oBrw:nClrOrdeFore, ; aTmpColor[ 14 ] := oBrw:nClrOrdeBack, ; aTmpColor[ 15 ] := oBrw:nClrLine , ; aTmpColor[ 16 ] := oBrw:nClrHeadFore, ; aTmpColor[ 17 ] := oBrw:nClrHeadBack, ; aTmpColor[ 20 ] := oBrw:nClrSpcHdActive IF oBrw:lEnum DEFAULT aTmpColor[ 18 ] := oBrw:nClrHeadFore, ; aTmpColor[ 19 ] := oBrw:nClrHeadBack ELSE Default aTmpColor[ 18 ] := oBrw:nClrEditFore, ; aTmpColor[ 19 ] := oBrw:nClrEditBack ENDIF EndIf Default aTmpColor[ 1 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrText aTmpColor[ 2 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrPane aTmpColor[ 3 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrHeadFore aTmpColor[ 4 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrHeadBack aTmpColor[ 5 ] := GetSysColor( COLOR_HIGHLIGHTTEXT ), ; // nClrFocuFore aTmpColor[ 6 ] := GetSysColor( COLOR_HIGHLIGHT ) // nClrFocuBack Default aTmpColor[ 7 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrEditFore aTmpColor[ 8 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrEditBack aTmpColor[ 9 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrFootFore aTmpColor[ 10 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrFootBack aTmpColor[ 11 ] := CLR_HGRAY , ; // nClrSeleFore NO focused aTmpColor[ 12 ] := CLR_GRAY , ; // nClrSeleBack NO focused aTmpColor[ 13 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrOrdeFore aTmpColor[ 14 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrLine aTmpColor[ 15 ] := CLR_BLACK ,; aTmpColor[ 16 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSupHeadFore aTmpColor[ 17 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSupHeadBack aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSpecHeadBack aTmpColor[ 20 ] := CLR_HRED // nClrSpecHeadActive ::nClrFore := aTmpColor[ 1 ] ::nClrBack := aTmpColor[ 2 ] ::nClrHeadFore := aTmpColor[ 3 ] ::nClrHeadBack := aTmpColor[ 4 ] ::nClrFocuFore := aTmpColor[ 5 ] ::nClrFocuBack := aTmpColor[ 6 ] ::nClrEditFore := aTmpColor[ 7 ] ::nClrEditBack := aTmpColor[ 8 ] ::nClrFootFore := aTmpColor[ 9 ] ::nClrFootBack := aTmpColor[ 10 ] ::nClrSeleFore := aTmpColor[ 11 ] ::nClrSeleBack := aTmpColor[ 12 ] ::nClrOrdeFore := aTmpColor[ 13 ] ::nClrOrdeBack := aTmpColor[ 14 ] ::nClrSpcHdFore := aTmpColor[ 18 ] ::nClrSpcHdBack := aTmpColor[ 19 ] ::nClrSpcHdActive := aTmpColor[ 20 ] RETURN Self ... METHOD New( cHeading, bData, cPicture, aColors, aAlign, nWidth, ; ... cDefData, cName, cAlias, DefineCol ) CLASS TSColumn ... If empty( DefineCol ) ::DefColor( oBrw ) ::DefFont ( oBrw ) /* If oBrw == Nil Default aTmpColor[ 1 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrText aTmpColor[ 2 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrPane aTmpColor[ 3 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrHeadFore aTmpColor[ 4 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrHeadBack aTmpColor[ 5 ] := GetSysColor( COLOR_HIGHLIGHTTEXT ), ; // nClrFocuFore aTmpColor[ 6 ] := GetSysColor( COLOR_HIGHLIGHT ) // nClrFocuBack Default aTmpColor[ 7 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrEditFore aTmpColor[ 8 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrEditBack aTmpColor[ 9 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrFootFore aTmpColor[ 10 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrFootBack aTmpColor[ 11 ] := CLR_HGRAY , ; // nClrSeleFore NO focused aTmpColor[ 12 ] := CLR_GRAY , ; // nClrSeleBack NO focused aTmpColor[ 13 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrOrdeFore aTmpColor[ 14 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrLine aTmpColor[ 15 ] := CLR_BLACK ,; aTmpColor[ 16 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSupHeadFore aTmpColor[ 17 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSupHeadBack aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSpecHeadBack aTmpColor[ 20 ] := CLR_HRED // nClrSpecHeadActive Else Default aTmpColor[ 1 ] := oBrw:nClrText, ; aTmpColor[ 2 ] := oBrw:nClrPane, ; aTmpColor[ 3 ] := oBrw:nClrHeadFore, ; aTmpColor[ 4 ] := oBrw:nClrHeadBack, ; aTmpColor[ 5 ] := oBrw:nClrFocuFore, ; aTmpColor[ 6 ] := oBrw:nClrFocuBack Default aTmpColor[ 7 ] := oBrw:nClrEditFore, ; aTmpColor[ 8 ] := oBrw:nClrEditBack, ; aTmpColor[ 9 ] := oBrw:nClrFootFore, ; aTmpColor[ 10 ] := oBrw:nClrFootBack, ; aTmpColor[ 11 ] := oBrw:nClrSeleFore, ; aTmpColor[ 12 ] := oBrw:nClrSeleBack, ; aTmpColor[ 13 ] := oBrw:nClrOrdeFore, ; aTmpColor[ 14 ] := oBrw:nClrOrdeBack, ; aTmpColor[ 15 ] := oBrw:nClrLine , ; aTmpColor[ 16 ] := oBrw:nClrHeadFore, ; aTmpColor[ 17 ] := oBrw:nClrHeadBack, ; aTmpColor[ 20 ] := oBrw:nClrSpcHdActive IF oBrw:lEnum DEFAULT aTmpColor[ 18 ] := oBrw:nClrHeadFore, ; aTmpColor[ 19 ] := oBrw:nClrHeadBack ELSE Default aTmpColor[ 18 ] := oBrw:nClrEditFore, ; aTmpColor[ 19 ] := oBrw:nClrEditBack endif ::hFont := oBrw:hFont ::hFontHead := If( Empty( oBrw:hFontHead ), oBrw:hFont, oBrw:hFontHead ) ::hFontFoot := If( Empty( oBrw:hFontFoot ), oBrw:hFont, oBrw:hFontFoot ) ::hFontEdit := If( Empty( oBrw:hFontEdit ), oBrw:hFont, oBrw:hFontEdit ) ::hFontSpcHd := If( Empty( oBrw:hFontSpcHd ), oBrw:hFont, oBrw:hFontSpcHd ) EndIf */ EndIf ... ::bMax = bMax // ::nClrFore = aTmpColor[ 1 ] // ::nClrBack = aTmpColor[ 2 ] // ::nClrHeadFore = aTmpColor[ 3 ] // ::nClrHeadBack = aTmpColor[ 4 ] // ::nClrFocuFore = aTmpColor[ 5 ] // ::nClrFocuBack = aTmpColor[ 6 ] // ::nClrEditFore = aTmpColor[ 7 ] // ::nClrEditBack = aTmpColor[ 8 ] // ::nClrFootFore = aTmpColor[ 9 ] // ::nClrFootBack = aTmpColor[ 10 ] // ::nClrSeleFore = aTmpColor[ 11 ] // ::nClrSeleBack = aTmpColor[ 12 ] // ::nClrOrdeFore = aTmpColor[ 13 ] // ::nClrOrdeBack = aTmpColor[ 14 ] // ::nClrSpcHdFore = aTmpColor[ 18 ] // ::nClrSpcHdBack = aTmpColor[ 19 ] // ::nClrSpcHdActive = aTmpColor[ 20 ] ::nClr3DLCell = GetSysColor( COLOR_BTNHIGHLIGHT ) ... CLASS TSBrowse FROM TControl ... METHOD AddColumn( oColumn ) CLASS TSBrowse Local nHeight, nAt, cHeading, cRest, nOcurs, ; hFont := If( ::hFont != Nil, ::hFont, 0 ) oColumn:DefColor( Self ) oColumn:DefFont ( Self ) Default ::aColSizes := {} ... METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse Local nI, ; nCell := ::nCell oColumn:DefColor( Self ) oColumn:DefFont ( Self ) Default nPos := 1
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1866
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 10:12. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет цитата: | Только использовал ключевое слово OBJ вместо TO |
| еще #xcommand DEFINE TBROWSE <name> OBJ <obrw> ; [ AT <row>,<col> ] ;
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1867
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 11:10. Заголовок: gfilatov2002 Пример..
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1868
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 13:05. Заголовок: PS работает и такой ..
PS работает и такой вариант FUNC Tsb_Create( cName, nY, nX, nW, nH, aCols ) *----------------------------------------------------------------------------* LOCAL oBrw, aColors := {} PRIV &cName AAdd(aColors, { CLR_FOCUSB, { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) DEFINE TBROWSE &cName OBJ oBrw AT nY, nX ALIAS ALIAS() WIDTH nW HEIGHT nH CELL ; COLORS aColors :hFontHead := GetFontHandle( "FontBold" ) :hFontFoot := GetFontHandle( "FontBold" ) ... вместо // :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; // {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) ...
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1299
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.18 13:31. Заголовок: SergKis пишет: рабо..
SergKis пишет: У меня - НЕ работает. После этих изменений пропал фоновый цвет в контрольном примере (sample 4 и sample 7), а также фон у фантомной колонки селектора. Если возможно, выложите исправленные исходники библиотеки для сверки изменений. SergKis пишет: цитата: | вместо // :SetColor( { CLR_FOCUSB }, { { |a,b,c| If( c:nCell == b, {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; // |
| Через установку :SetColor цвет есть
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1869
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 18:18. Заголовок: gfilatov2002 Для св..
gfilatov2002 Для сверки http://my-files.ru/dk0g0p Поправил, упустил CLASS TSColumn ... DATA lDefineColumn AS LOGICAL INIT .F. ... ::lDefineColumn := ! empty(DefineCol) If ! ::lDefineColumn ::DefColor( oBrw, aTmpColor ) ::DefFont ( oBrw ) EndIf /* If oBrw == Nil ... Else ... EndIf */ Default aTmp3D[ 1 ] := If( oBrw == Nil, .F., oBrw:l3DLook ) ... ::bMax = bMax /* ::nClrFore = aTmpColor[ 1 ] ::nClrBack = aTmpColor[ 2 ] ::nClrHeadFore = aTmpColor[ 3 ] ::nClrHeadBack = aTmpColor[ 4 ] ::nClrFocuFore = aTmpColor[ 5 ] ::nClrFocuBack = aTmpColor[ 6 ] ::nClrEditFore = aTmpColor[ 7 ] ::nClrEditBack = aTmpColor[ 8 ] ::nClrFootFore = aTmpColor[ 9 ] ::nClrFootBack = aTmpColor[ 10 ] ::nClrSeleFore = aTmpColor[ 11 ] ::nClrSeleBack = aTmpColor[ 12 ] ::nClrOrdeFore = aTmpColor[ 13 ] ::nClrOrdeBack = aTmpColor[ 14 ] ::nClrSpcHdFore = aTmpColor[ 18 ] ::nClrSpcHdBack = aTmpColor[ 19 ] ::nClrSpcHdActive = aTmpColor[ 20 ] */ ::nClr3DLCell = GetSysColor( COLOR_BTNHIGHLIGHT ) ::nClr3DLHead = GetSysColor( COLOR_BTNHIGHLIGHT ) ::nClr3DLFoot = GetSysColor( COLOR_BTNHIGHLIGHT ) ::nClr3DSCell = GetSysColor( COLOR_BTNSHADOW ) ::nClr3DSHead = GetSysColor( COLOR_BTNSHADOW ) ::nClr3DSFoot = GetSysColor( COLOR_BTNSHADOW ) /* ::aColors = aTmpColor ::aColorsBack = aTmpColor */ ::lIndexCol = .F. ... METHOD DefColor( oBrw, aTmpColor ) CLASS TSColumn Default aTmpColor := Array( 20 ) If oBrw == Nil Default aTmpColor[ 1 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrText aTmpColor[ 2 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrPane aTmpColor[ 3 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrHeadFore aTmpColor[ 4 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrHeadBack aTmpColor[ 5 ] := GetSysColor( COLOR_HIGHLIGHTTEXT ), ; // nClrFocuFore aTmpColor[ 6 ] := GetSysColor( COLOR_HIGHLIGHT ) // nClrFocuBack Default aTmpColor[ 7 ] := GetSysColor( COLOR_WINDOWTEXT ), ; // nClrEditFore aTmpColor[ 8 ] := GetSysColor( COLOR_WINDOW ) , ; // nClrEditBack aTmpColor[ 9 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrFootFore aTmpColor[ 10 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrFootBack aTmpColor[ 11 ] := CLR_HGRAY , ; // nClrSeleFore NO focused aTmpColor[ 12 ] := CLR_GRAY , ; // nClrSeleBack NO focused aTmpColor[ 13 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrOrdeFore aTmpColor[ 14 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrLine aTmpColor[ 15 ] := CLR_BLACK ,; aTmpColor[ 16 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSupHeadFore aTmpColor[ 17 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSupHeadBack aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) , ; // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) , ; // nClrSpecHeadBack aTmpColor[ 20 ] := CLR_HRED // nClrSpecHeadActive Else Default aTmpColor[ 1 ] := oBrw:nClrText, ; aTmpColor[ 2 ] := oBrw:nClrPane, ; aTmpColor[ 3 ] := oBrw:nClrHeadFore, ; aTmpColor[ 4 ] := oBrw:nClrHeadBack, ; aTmpColor[ 5 ] := oBrw:nClrFocuFore, ; aTmpColor[ 6 ] := oBrw:nClrFocuBack Default aTmpColor[ 7 ] := oBrw:nClrEditFore, ; aTmpColor[ 8 ] := oBrw:nClrEditBack, ; aTmpColor[ 9 ] := oBrw:nClrFootFore, ; aTmpColor[ 10 ] := oBrw:nClrFootBack, ; aTmpColor[ 11 ] := oBrw:nClrSeleFore, ; aTmpColor[ 12 ] := oBrw:nClrSeleBack, ; aTmpColor[ 13 ] := oBrw:nClrOrdeFore, ; aTmpColor[ 14 ] := oBrw:nClrOrdeBack, ; aTmpColor[ 15 ] := oBrw:nClrLine , ; aTmpColor[ 16 ] := oBrw:nClrHeadFore, ; aTmpColor[ 17 ] := oBrw:nClrHeadBack, ; aTmpColor[ 20 ] := oBrw:nClrSpcHdActive IF oBrw:lEnum DEFAULT aTmpColor[ 18 ] := oBrw:nClrHeadFore, ; aTmpColor[ 19 ] := oBrw:nClrHeadBack ELSE Default aTmpColor[ 18 ] := oBrw:nClrEditFore, ; aTmpColor[ 19 ] := oBrw:nClrEditBack ENDIF EndIf ::nClrFore := aTmpColor[ 1 ] ::nClrBack := aTmpColor[ 2 ] ::nClrHeadFore := aTmpColor[ 3 ] ::nClrHeadBack := aTmpColor[ 4 ] ::nClrFocuFore := aTmpColor[ 5 ] ::nClrFocuBack := aTmpColor[ 6 ] ::nClrEditFore := aTmpColor[ 7 ] ::nClrEditBack := aTmpColor[ 8 ] ::nClrFootFore := aTmpColor[ 9 ] ::nClrFootBack := aTmpColor[ 10 ] ::nClrSeleFore := aTmpColor[ 11 ] ::nClrSeleBack := aTmpColor[ 12 ] ::nClrOrdeFore := aTmpColor[ 13 ] ::nClrOrdeBack := aTmpColor[ 14 ] ::nClrSpcHdFore := aTmpColor[ 18 ] ::nClrSpcHdBack := aTmpColor[ 19 ] ::nClrSpcHdActive := aTmpColor[ 20 ] ::aColors := aTmpColor ::aColorsBack := aTmpColor RETURN Self ... METHOD AddColumn( oColumn ) CLASS TSBrowse Local nHeight, nAt, cHeading, cRest, nOcurs, ; hFont := If( ::hFont != Nil, ::hFont, 0 ) If oColumn:lDefineColumn oColumn:DefColor( Self ) oColumn:DefFont ( Self ) EndIf Default ::aColSizes := {} ... METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse Local nI, ; nCell := ::nCell If oColumn:lDefineColumn oColumn:DefColor( Self ) oColumn:DefFont ( Self ) EndIf Default nPos := 1 ... sample 4 заработал, sample 7 отличается с 3-8 колонки, но я не вижу где ставится этим колонкам белый цвет фона. Всем колонкам ставится CLR_PINK и потом др. колонкам пере назначается.
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1870
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 18:49. Заголовок: gfilatov2002 От арх..
gfilatov2002 От архива сверки еще немного поправил (сохранить цвета из define column ... команды) METHOD New( cHeading, bData, cPicture, aColors, aAlign, nWidth, ; ... cDefData, cName, cAlias, DefineCol ) CLASS TSColumn ... ::lDefineColumn := ! empty(DefineCol) If ::lDefineColumn ::aColors := aTmpColor ::aColorsBack := aTmpColor Else ::DefColor( oBrw, aTmpColor ) ::DefFont ( oBrw ) EndIf ... METHOD AddColumn( oColumn ) CLASS TSBrowse Local nHeight, nAt, cHeading, cRest, nOcurs, ; hFont := If( ::hFont != Nil, ::hFont, 0 ) If oColumn:lDefineColumn oColumn:DefColor( Self, oColumn:aColors ) oColumn:DefFont ( Self ) EndIf ... METHOD InsColumn( nPos, oColumn ) CLASS TSBrowse Local nI, ; nCell := ::nCell If oColumn:lDefineColumn oColumn:DefColor( Self, oColumn:aColors ) oColumn:DefFont ( Self ) EndIf ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1871
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 19:57. Заголовок: PS сделал в sample 7..
PS сделал в sample 7 DEFINE TBROWSE Brw_7 AT 0,0 CELLED ALIAS "Employee" Transparent Selector "Bitmaps\Arrow.bmp" ; WIDTH nBrwWidth HEIGHT nBrwHeight ; COLORS {CLR_BLACK, CLR_WHITE} ; // CLR_PINK получил белый фон, как раньше, т.е. пример совпал
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1300
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.18 21:01. Заголовок: SergKis пишет: MET..
SergKis пишет: цитата: | METHOD DefColor( oBrw, aTmpColor ) CLASS TSColumn Default aTmpColor := Array( 20 ) |
| Мыслим одинаково! Я тоже добавил у себя эти изменения SergKis пишет: цитата: | COLORS {CLR_BLACK, CLR_WHITE} |
| Согласен, что требуется установить белый цвет фона для этого примера с учетом исправленной Вами обработки цветов Сейчас внесу последние предложенные исправления и проверю работу контрольного примера Благодарю за помощь
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1872
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 21:02. Заголовок: PS В примере работае..
PS В примере работает *----------------------------------------------------------------------------* FUNC Tsb_Create( cName, nY, nX, nW, nH, aCols, aColors ) *----------------------------------------------------------------------------* LOCAL oBrw PRIV &cName If empty(aColors) .or. ! HB_ISARRAY(aColors) aColors := {} AAdd(aColors, { CLR_FOCUSB, { |a,b,c| If( c:nCell == b, ; {RGB( 66, 255, 236), RGB(209, 227, 248)}, ; {RGB(220, 220, 220), RGB(220, 220, 220)} ) } } ) EndIf DEFINE TBROWSE &cName OBJ oBrw AT nY, nX ALIAS ALIAS() WIDTH nW HEIGHT nH CELL ; COLORS aColors ...
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1873
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.18 21:39. Заголовок: gfilatov2002 Потеря..
gfilatov2002 Потерял в примере с базой колонок в Report колонку BaseCols() AAdd(aCols, oDTDOK:Clone() ) AAdd(aCols, oNRDOK:Clone() ) AAdd(aCols, oSMDOK:Clone() ) AAdd(aCols, oTXDOK:Clone() ) AAdd(aCols, oSMTAX:Clone() ) AAdd(aCols, oSMITG:Clone() ) AAdd(aCols, oID_E:Clone() ) AAdd(aCols, oFIRST:Clone() ) AAdd(aCols, oLAST:Clone() ) AAdd(aCols, oSTREET:Clone() ) AAdd(aCols, oCITY:Clone() ) AAdd(aCols, oSTATE:Clone() ) AAdd(aCols, oNAME:Clone() ) AAdd(aCols, oZIP:Clone() ) AAdd(aCols, oHIREDATE:Clone() ) AAdd(aCols, oAGE:Clone() ) MyUse( 'States' , 'STAT' )
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1301
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.18 22:19. Заголовок: SergKis пишет: В пр..
SergKis пишет: Подтверждаю - работает и Ваш пример, и контрольный пример SergKis пишет: цитата: | в примере с базой колонок в Report колонку |
| Добавил. Большое спасибо за помощь и терпение
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|