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

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

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

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

SergKis: gfilatov2002 Поправил в своей lib[pre2] *------------------------------------------------------------------------------* FUNC Do_Obj( nHandle, bBlock, p1, p2, p3 ) *------------------------------------------------------------------------------* LOCAL o If empty (nHandle) ; nHandle := _HMG_ThisFormName ElseIf HB_ISOBJECT(nHandle) If nHandle:ClassName == 'TSBROWSE'; nHandle := nHandle:cParentWnd Else ; nHandle := nHandle:Name EndIf EndIf If HB_ISCHAR(nHandle) ; nHandle := GetFormHandle( nHandle ) EndIf If hmg_IsWindowObject(nHandle) o := hmg_GetWindowObject(nHandle) If HB_ISCHAR(bBlock); bBlock := hb_macroblock( bBlock ) EndIf If HB_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 Для исп. в командах (короче писать), к прмеру #translate doObj( <blk> ) => Do_Obj ( nil , <"blk"> ) #translate doObj( <blk> , <wnd> ) => Do_Obj ( <"wnd">, <"blk"> ) #translate _doObj( <blk> ) => Do_Obj ( nil , <"blk"> ) #translate _doObj( <blk> , <wnd> ) => Do_Obj ( <wnd> , <"blk"> ) #translate wObj( ) => _WindowObj ( _HMG_ThisFormName ) #translate wObj( <wnd> ) => _WindowObj ( <"wnd"> ) #translate _wObj( ) => _WindowObj ( _HMG_ThisFormName ) #translate _wObj( <wnd> ) => _WindowObj ( <wnd> ) #translate gObj( <ctl> ) => _ControlObj( <"ctl">, _HMG_ThisFormName ) #translate gObj( <ctl> , <wnd> ) => _ControlObj( <"ctl">, <wnd> ) #translate _gObj( <ctl> ) => _ControlObj( <ctl> , _HMG_ThisFormName ) #translate _gObj( <ctl> , <wnd> ) => _ControlObj( <ctl> , <wnd> ) [/pre2]

gfilatov2002: SergKis пишет: Поправил в своей lib Благодарю за внимание! Мы уже обсуждали, что подготовкой входных параметров в идеале должна заниматься вызывающая функция Это позволяет делать функции в ядре компактными По этой причине не принято...

SergKis: gfilatov2002 пишет Это позволяет делать функции в ядре компактными Был не прав, вспылил.


gfilatov2002: Всем кому это интересно Подготовил beta 3 для новой сборки библиотеки со следующим списком изменений [pre2] * Fixed: Missed 'XObject' property reference in the GetProperty() function. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demos in folder \samples\Advanced\GoogleCharts) * Modified: Added Min and Max range for the NON CLIENT attributes of windows according to the Windows requirements. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Enhanced: Added the useful function EnumChildWindows( hWnd [, lExt] ) for retrieving of array of the child windows for a parent window handle. This implementation is compatible with Official HMG if a second parameter is false (default value). Based upon a contribution of Petr Chornyj <myorg63/at/gmail.com>. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see SumatraPDF.prg in folder \samples\Advanced\PdfView) * Updated: Synchronized Extended HMG for compatibility with Official HMG: - New: SET DIALOGBOX POSITION: Sets the position of the dialog boxes (GetColor, GetFile, GetFolder, GetFont, MessageBoxTimeout, MsgXXX, PutFile, SELECT PRINTER, etc.) Added the following commands: - SET DIALOGBOX [ POSITION ] ROW <nRow>|<@VarCodeBlockRow>|<NIL> ; COL <nCol>|<@VarCodeBlockCol>|<NIL> - SET DIALOGBOX [ POSITION ] CENTER OF PARENT - SET DIALOGBOX [ POSITION ] CENTER OF <hWnd> - SET DIALOGBOX [ POSITION ] CENTER OF DESKTOP - SET DIALOGBOX [ POSITION ] DISABLE Based upon a contribution of Claudio Soto <srvet@adinet.com.uy>. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\MoveDialogBox) * Updated: 'MiniGUI Extended Edition Common Commands' list: - added the recent entered commands. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at commands.txt in folder \Doc) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - New: added the optional OBJ clause in DEFINE TBROWSE command. - New: added the optional ALIAS clause in DEFINE COLUMN command and the variable :cField in TSColumn class. - New: methods DefColor()(), DefFont() and Clone() in TSColumn class. - New: methods SaveProperty() and RestProperty() in TSColumn class. - New: methods SetProperty() and GetProperty() in TSColumn class. - Updated: improved the methods GetValue(xCol) and SetValue(xCol, xVal). - Updated: improved a colors processing with using of aColors items number, f.e. { CLR_TEXT, RGB( fontcolor[1], fontcolor[2], fontcolor[3] ) } { CLR_PANE, RGB( backcolor[1], backcolor[2], backcolor[3] ) }. Suggested and contributed by Sergej Kiselev (see demo in folder \samples\Advanced\APP_OOPCOLUMNS) * New: 'Using DEFINE COLUMN commands as container for design of TBROWSE' sample. Contributed by Sergej Kiselev (see in folder \samples\Advanced\APP_OOPCOLUMNS) * New: 'Get Tasks' sample is based on calling of EnumChildWindows() function. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\GETTASKS) * New: 'Google Charts' samples: using of a static image and a html file. Based upon a contribution of HMG user Edward. Adapted for Minigui Extended by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\GoogleCharts) * New: 'TSBrowse Export data to XLS/XML/DOC/DBF files with a coloring' sample. Contributed by Verchenko Andrey <verchenkoag@gmail.com> (see in folder \samples\Advanced\Tsb_Export) * Updated: 'Move a standard dialog box in the screen' sample: - added an example of centering of the GetFolder() dialog related to an application's window. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \samples\Advanced\MoveDialogBox) * Updated: The following samples are revised for compatibility with the recent Minigui modification: - demo2.prg in folder \samples\Advanced\ExternalApp_3; - demo3.prg in folder \samples\Basic\TaskDialogs\TTaskDialog. Contributed by Grigory Filatov <gfilatov@inbox.ru> [/pre2] Благодарю за Ваше внимание Особая благодарность Сергею Киселеву за неоценимую помощь в развитии библиотеки TsBrowse

SergKis: gfilatov2002 Если модальному окну добавить свойство lFocusBreack := [.F.]\.T. Добавить в место, где обработка потери фокуса мод. окном с морганием, проверку lFocusBreack. Если .T., не моргать, а завершать мод.окно (как по X), будет похоже на child поведение под модал родителем

SergKis: PS В команду[pre2] #command ADD [ COLUMN ] TO [ TBROWSE ] <oBrw> ; ...[/pre2] надо добавить ALIAS, тогда в команде ADD COLUMN ... DATA hb_macroblock(...) ... ALIAS ... поведение аналогично DEFINE COLUMN будет

gfilatov2002: SergKis пишет: надо добавить ALIAS, тогда в команде ADD COLUMN Да, это было сделано сразу при модификации аналогично DEFINE COLUMN SergKis пишет: Если модальному окну добавить свойство lFocusBreack Предложение интересное, но требуется небольшой пример для проверки этого нового свойства

SergKis: gfilatov2002 пишет требуется небольшой пример Свойство условное, имел ввиду такое[pre2] FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... NoAutoRelease, InteractiveCloseProcedure, MoveProcedure, DropProcedure, clientwidth, clientheight, lLostExit ) ... _HMG_aFormMiscData1 [ k ] := {lLostExit} ... [/pre2] В обработчике, при потере фокуса на окне типа 'M' проверить разрешен выход или нет.

SergKis: PS в команду #xcommand DEFINE WINDOW <w> ; добавить [pre2] [ <helpbutton: HELPBUTTON> ] ; [ <FocusExit: FOCUSEXIT> => ; DECLARE WINDOW <w> ;; ... к примеру [/pre2]

gfilatov2002: SergKis пишет: Свойство условное Решил назвать это свойство модального окна FLASHEXIT и сохранять его в элементе массива _HMG_aFormFocused [ i ] У меня уже работает следующий пример: [pre2]#include "Minigui.ch" ************* function MAIN ************* DEFINE WINDOW cDlgMain AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Main" MAIN DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Child&Modal" ICON NIL ACTION CHILD_MODAL() END BUTTONEX DEFINE BUTTONEX ButtonEX_2 ROW 225 COL 219 WIDTH 100 HEIGHT 30 CAPTION "&Quit" ICON NIL ACTION cDlgMain.release END BUTTONEX END window cDlgMain.center cDlgMain.activate return NIL ************************* static function CHILD_MODAL ************************* IF iswindowdefined(cDlgChild1) doMethod( "cDlgChild1", "SETFOCUS" ) return NIL ENDIF DEFINE WINDOW cDlgChild1 AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Child" CHILD ; ON GOTFOCUS iif((i := GetFormIndex( "cDlgModal1" )) > 0, _HMG_aFormFocused [ i ] := .T., THIS.TITLE := "GOTFOCUS") END window DEFINE WINDOW cDlgModal1 AT 0 , 0 WIDTH 100 HEIGHT 100 TITLE "Modal" MODAL ; ON LOSTFOCUS cDlgChild1.TITLE := "FLASHEXIT" END window cDlgChild1.center activate window cDlgModal1, cDlgChild1 return NIL [/pre2] Прошу проверить и подтвердить, что я двигаюсь в правильном направлении

gfilatov2002: P.S. В файле h_events.prg сделал такую вставку [pre2]... IF iswinnt() .OR. _HMG_aFormType [ i ] != 'M' BringWindowToTop ( _HMG_ActiveModalHandle ) FOR x := 1 TO Len ( _HMG_aFormHandles ) IF _HMG_aFormHandles [x] == _HMG_ActiveModalHandle .AND. _HMG_aFormFocused [x] PostMessage( _HMG_ActiveModalHandle, WM_CLOSE, 0, 0 ) ENDIF NEXT x ENDIF ... [/pre2]

SergKis: gfilatov2002 пишет Прошу проверить Более наглядный пример (по мне)[pre2] #include "Minigui.ch" ************* function MAIN ************* SET OOP ON DEFINE WINDOW cDlgMain AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Main" MAIN WITH OBJECT This.Object // ---- Window events :Event( 01, {|ow | Modal_1(ow) } ) :Event( 99, {|ow | ow:Release() } ) END WITH // ---- Window events DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Modal 1" ICON NIL ACTION (ThisWindow.Object):PostMsg(1) END BUTTONEX DEFINE BUTTONEX ButtonEX_2 ROW 225 COL 219 WIDTH 100 HEIGHT 30 CAPTION "&Quit" ICON NIL ACTION (ThisWindow.Object):PostMsg(99) END BUTTONEX END window cDlgMain.center cDlgMain.activate return NIL ************************* static function MODAL_1( oParent ) ************************* LOCAL y := App.Row+40 LOCAL x := App.Col+40 DEFINE WINDOW cModal1 AT y, x WIDTH 400 HEIGHT 300 TITLE "Modal 1" MODAL WITH OBJECT This.Object // ---- Window events :Event( 01, {|ow | _HMG_aFormFocused [ ow:Index ] := .F., ; Modal_2(ow) } ) :Event( 02, {|ow | _HMG_aFormFocused [ ow:Index ] := .T., ; oParent:SetFocus('ButtonEX_1') } ) :Event( 99, {|ow | ow:Release() } ) END WITH // ---- Window events DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Modal 2" ICON NIL ACTION (ThisWindow.Object):PostMsg(1) END BUTTONEX DEFINE BUTTONEX ButtonEX_2 ROW 225 COL 219 WIDTH 100 HEIGHT 30 CAPTION "Focus Main" ICON NIL ACTION (ThisWindow.Object):PostMsg(2) END BUTTONEX END window Activate window cModal1 return NIL ************************* static function MODAL_2( oParent ) ************************* LOCAL y := App.Row+80 LOCAL x := App.Col+80 DEFINE WINDOW cModal2 AT y, x WIDTH 400 HEIGHT 300 TITLE "Modal 2" MODAL WITH OBJECT This.Object // ---- Window events :Event( 01, {|ow| _HMG_aFormFocused [ ow:Index ] := .T., ; oParent:SetFocus('ButtonEX_1') } ) :Event( 99, {|ow| ow:Release() } ) END WITH // ---- Window events DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Focus Modal 1" ICON NIL ACTION (ThisWindow.Object):PostMsg(1) END BUTTONEX END window Activate window cModal2 return NIL [/pre2] С модал 1 фокус на маин окно и с маин 2 фокус на маин 1. Если нажав на модал 1 кнопку Focus Main, переключить на far и обратно - срабатывает, модал 1 уходит.

SergKis: SergKis пишет С модал 1 фокус на маин окно и с маин 2 фокус на маин 1. читать С модал 1 фокус на маин окно и с модал 2 фокус на модал 1.

SergKis: gfilatov2002 Такой манипуляцией, запустил child окно под modal [pre2] ************************* static function MODAL_2( oParent ) ************************* LOCAL y := App.Row+80 LOCAL x := App.Col+80 LOCAL m := _HMG_IsModalActive LOCAL h := _HMG_ActiveModalHandle _HMG_IsModalActive := .F. _HMG_ActiveModalHandle := 0 DEFINE WINDOW cModal2 AT y, x WIDTH 400 HEIGHT 300 TITLE "Modal 2" CHILD ON GOTFOCUS This.Release ... [/pre2]

SergKis: SergKis пишет Такой манипуляцией, запустил child окно под modal Работающий вариант с modal окна запустить child окно (это против системы). Функция на замену к примеру выше [pre2] ************************* static function MODAL_2( oParent ) ************************* LOCAL y := App.Row+80 LOCAL x := App.Col+80 LOCAL lM := _HMG_IsModalActive LOCAL hM := _HMG_ActiveModalHandle _HMG_IsModalActive := .F. _HMG_ActiveModalHandle := 0 DEFINE WINDOW cModal2 AT y, x WIDTH 400 HEIGHT 300 TITLE "Child" CHILD ; ON LOSTFOCUS do_Obj(ThisWindow.Handle, {|ow| ow:PostMsg(99) }) WITH OBJECT This.Object // ---- Window events :Event( 01, {|ow| oParent:SetFocus('ButtonEX_1') } ) :Event( 99, {|ow| ow:Release() } ) END WITH // ---- Window events DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Focus Modal 1" ICON NIL ACTION (ThisWindow.Object):PostMsg(01) END BUTTONEX END window Activate window cModal2 _HMG_IsModalActive := lM _HMG_ActiveModalHandle := hM oParent:SetFocus('ButtonEX_1') return NIL [/pre2]

SergKis: gfilatov2002 Сделал в своей версии [pre2] CLASS TSColumn ... DATA bSeek // ... METHOD DrawLine( xRow ) CLASS TSBrowse ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays Elseif cColAls != Nil If Valtype( oColumn:bSeek ) == 'B' ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ( cColAls )->( Eval( oColumn:bData ) ) Else If Valtype( oColumn:bSeek ) == 'B' Eval( oColumn:bSeek, Self, nJ ) EndIf uData := Eval( oColumn:bData ) EndIf ... METHOD DrawSelect( xRow, lFoot ) CLASS TSBrowse ... If ::lIsArr .and. ( ::lAppendMode .or. ::nAt > Len( ::aArray ) ) uData := "" // append mode for arrays Elseif cColAls != Nil If Valtype( oColumn:bSeek ) == 'B' ( cColAls )->( Eval( oColumn:bSeek, Self, nJ ) ) EndIf uData := ( cColAls )->( Eval( oColumn:bData ) ) Else If Valtype( oColumn:bSeek ) == 'B' Eval( oColumn:bSeek, Self, nJ ) EndIf uData := Eval( oColumn:bData ) EndIf ... [/pre2] Может полезно будет. Без relation, сечас, в блоке :bData делаем подвод, с :bSeek можно разделить подвод и :bData : oBrw:aColumns[5]:bSeek := {|obr| iif( obr:cAlias->FLD_3 == STAT, .T., dbSeek( obr:cAlias->FLD_3 ) ) }

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

SergKis: Григорий, чем у Вас завершилось свойство модального окна FLASHEXIT У меня срабатывало, при уст. фокуса на внешнее приложении, к примеру Far. На своих окнах hmg -> не срабатывало. Завершил костылем, modal -> child, похожий костыль работает MDI child -> modal давно и стабильно.

gfilatov2002: SergKis пишет: чем у Вас завершилось Завершилось тем, что переписал этот кусок следующим образом: [pre2]... IF _HMG_IsModalActive .AND. Empty ( _HMG_InplaceParentHandle ) .AND. ; ( _HMG_aFormVirtualWidth [ i ] == 0 .OR. _HMG_aFormVirtualHeight [ i ] == 0 ) .AND. ; _HMG_SplitLastControl != "TOOLBAR" IF _HMG_aFormType [ i ] != 'M' IF iswinnt() IF ! _OnFlashExit () BringWindowToTop ( _HMG_ActiveModalHandle ) // Form's caption blinking if a top window is not Modal window FlashWindowEx ( _HMG_ActiveModalHandle, 1, 5, 60 ) ENDIF ELSE IF ! _OnFlashExit () BringWindowToTop ( _HMG_ActiveModalHandle ) ENDIF ENDIF ENDIF ENDIF ... *-----------------------------------------------------------------------------* STATIC FUNCTION _OnFlashExit () *-----------------------------------------------------------------------------* LOCAL x, lExit := .F., nFormCount := Len ( _HMG_aFormNames ) FOR x := 1 TO nFormCount IF _HMG_aFormHandles [x] == _HMG_ActiveModalHandle .AND. _HMG_aFormFocused [x] PostMessage ( _HMG_ActiveModalHandle, WM_CLOSE, 0, 0 ) lExit := .T. EXIT ENDIF NEXT x RETURN lExit [/pre2] Критика принимается...

SergKis: gfilatov2002 пишет переписал этот кусок следующим образом Не понял, как работает ? Простой пример [pre2] #include "Minigui.ch" ************* function MAIN ************* DEFINE WINDOW wMain AT 0 , 0 WIDTH 400 HEIGHT 300 TITLE "Main" MAIN DEFINE BUTTONEX ButtonEX_1 ROW 225 COL 79 WIDTH 100 HEIGHT 30 CAPTION "Modal" ICON NIL ACTION MODAL() END BUTTONEX DEFINE BUTTONEX ButtonEX_2 ROW 225 COL 219 WIDTH 100 HEIGHT 30 CAPTION "&Quit" ICON NIL ACTION ThisWindow.release END BUTTONEX END window wMain.center wMain.activate return NIL ************************* static function MODAL() ************************* DEFINE WINDOW wModal AT 0, 0 WIDTH 100 HEIGHT 100 TITLE "Modal" MODAL ; _HMG_aFormFocused [ This.Index ] := .T. DEFINE BUTTONEX ButtonEX_1 ROW 20 COL 40 WIDTH 100 HEIGHT 30 CAPTION "To wMain" ICON NIL ACTION wMain.ButtonEX_1.SetFocus() END BUTTONEX END window wModal.center wModal.activate return NIL [/pre2] Два окна. wMain -> wModal, на modal ставлю _HMG_aFormFocused [ This.Index ] := .T., при потере фокуса по кнопке или клику по main окну, modal должна убраться. Остается.



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