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

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

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

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

gfilatov2002: SergKis пишет: Может добавить функцию Принято с благодарностью

gfilatov2002: Адаптировал свежую версию библиотеки для работы с Microsoft Visual C++ 2019 (32- и 64-бит). По шагам: 1) скачал полный дистрибутив MSVC 2019 (примерно 22 ГБ) и установил его. 2) сделал консольную версию MSVC 2019 из вышеуказанного дистрибутива (около 454 МБ). 3) собрал компилятор Харбор из сырцов с помощью консольной версии MSVC 2019. 4) собрал и успешно протестировал библиотеку Минигуи с этим компилятором Ваши комментарии приветствуются

Andrey: gfilatov2002 пишет: Адаптировал свежую версию библиотеки для работы с Microsoft Visual C++ 2019 (32- и 64-бит) Отличная новость ! Теперь надо будет нужные проги переводить на MSVC. Надеюсь будет работать лучше, чем на BCC.


Dima: Andrey пишет: Надеюсь будет работать лучше, чем на BCC. скорее всего разницы и не заметишь

gfilatov2002: Dima пишет: разницы и не заметишь Если сравнивать по скорости выполнения простых операций, то разница есть (см. ниже) 2019-07-02 14:17:48 Windows 10 10.0 Harbour 3.2.0dev (r1904111533) Borland C++ 5.5.1 (32-bit) x86 THREADS: 0 N_LOOPS: 1000000 [ T000: empty loop overhead ]...................................0.02 ==================================================================== [ T001: x := L_C ]..............................................0.03 [ T002: x := L_N ]..............................................0.03 [ T003: x := L_D ]..............................................0.03 [ T004: x := S_C ]..............................................0.03 [ T005: x := S_N ]..............................................0.05 [ T006: x := S_D ]..............................................0.03 [ T007: x := M->M_C ]...........................................0.05 [ T008: x := M->M_N ]...........................................0.03 [ T009: x := M->M_D ]...........................................0.03 [ T010: x := M->P_C ]...........................................0.05 [ T011: x := M->P_N ]...........................................0.03 [ T012: x := M->P_D ]...........................................0.03 [ T013: x := F_C ]..............................................0.03 [ T014: x := F_N ]..............................................0.02 [ T015: x := F_D ]..............................................0.03 [ T016: x := o:Args ]...........................................0.09 [ T017: x := o[ 2 ] ]...........................................0.08 [ T018: Round( i / 1000, 2 ) ]..................................0.11 [ T019: Str( i / 1000 ) ].......................................0.31 [ T020: Val( s ) ]..............................................0.11 [ T021: Val( a [ i % 16 + 1 ] ) ]...............................0.22 [ T022: DToS( d - i % 10000 ) ].................................0.25 [ T023: Eval( {|| i % 16 } ) ]..................................0.19 [ T024: Eval( bc := {|| i % 16 } ) ]............................0.13 [ T025: Eval( {| x | x % 16 }, i ) ]............................0.17 [ T026: Eval( bc := {| x | x % 16 }, i ) ]......................0.13 [ T027: Eval( {| x | f1( x ) }, i ) ]...........................0.22 [ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................0.19 [ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............0.19 [ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................1.30 [ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ]..........1.59 [ T032: x := ValType( x ) + ValType( i ) ]......................0.20 [ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........0.38 [ T034: x := a[ i % 16 + 1 ] == s ].............................0.17 [ T035: x := a[ i % 16 + 1 ] = s ]..............................0.19 [ T036: x := a[ i % 16 + 1 ] >= s ].............................0.17 [ T037: x := a[ i % 16 + 1 ] <= s ].............................0.19 [ T038: x := a[ i % 16 + 1 ] < s ]..............................0.19 [ T039: x := a[ i % 16 + 1 ] > s ]..............................0.17 [ T040: AScan( a, i % 16 ) ]....................................0.16 [ T041: AScan( a, {| x | x == i % 16 } ) ]......................1.36 [ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]....0.44 [ T043: x := a ]................................................0.03 [ T044: x := {} ]...............................................0.06 [ T045: f0() ]..................................................0.03 [ T046: f1( i ) ]...............................................0.08 [ T047: f2( c[1...8] ) ]........................................0.05 [ T048: f2( c[1...40000] ) ]....................................0.05 [ T049: f2( @c[1...40000] ) ]...................................0.05 [ T050: f2( @c[1...40000] ), c2 := c ]..........................0.06 [ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................0.20 [ T052: f2( a ) ]...............................................0.06 [ T053: x := f4() ].............................................0.44 [ T054: x := f5() ].............................................0.11 [ T055: x := Space( 16 ) ]......................................0.08 [ T056: f_prv( c ) ]............................................0.17 ==================================================================== [ total application time: ]....................................11.72 [ total real time: ]...........................................11.75 2019-07-02 14:18:48 Windows 10 10.0 Harbour 3.2.0dev (r1904111533) Microsoft Visual C++ 19.21.27702 (32-bit) x86 THREADS: 0 N_LOOPS: 1000000 [ T000: empty loop overhead ]...................................0.02 ==================================================================== [ T001: x := L_C ]..............................................0.00 [ T002: x := L_N ]..............................................0.02 [ T003: x := L_D ]..............................................0.00 [ T004: x := S_C ]..............................................0.02 [ T005: x := S_N ]..............................................0.00 [ T006: x := S_D ]..............................................0.02 [ T007: x := M->M_C ]...........................................0.00 [ T008: x := M->M_N ]...........................................0.02 [ T009: x := M->M_D ]...........................................0.02 [ T010: x := M->P_C ]...........................................0.00 [ T011: x := M->P_N ]...........................................0.02 [ T012: x := M->P_D ]...........................................0.02 [ T013: x := F_C ]..............................................0.00 [ T014: x := F_N ]..............................................0.00 [ T015: x := F_D ]..............................................0.02 [ T016: x := o:Args ]...........................................0.05 [ T017: x := o[ 2 ] ]...........................................0.02 [ T018: Round( i / 1000, 2 ) ]..................................0.06 [ T019: Str( i / 1000 ) ].......................................0.14 [ T020: Val( s ) ]..............................................0.08 [ T021: Val( a [ i % 16 + 1 ] ) ]...............................0.13 [ T022: DToS( d - i % 10000 ) ].................................0.20 [ T023: Eval( {|| i % 16 } ) ]..................................0.11 [ T024: Eval( bc := {|| i % 16 } ) ]............................0.08 [ T025: Eval( {| x | x % 16 }, i ) ]............................0.09 [ T026: Eval( bc := {| x | x % 16 }, i ) ]......................0.06 [ T027: Eval( {| x | f1( x ) }, i ) ]...........................0.09 [ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................0.08 [ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............0.08 [ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................0.69 [ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ]..........0.75 [ T032: x := ValType( x ) + ValType( i ) ]......................0.09 [ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........0.19 [ T034: x := a[ i % 16 + 1 ] == s ].............................0.08 [ T035: x := a[ i % 16 + 1 ] = s ]..............................0.09 [ T036: x := a[ i % 16 + 1 ] >= s ].............................0.08 [ T037: x := a[ i % 16 + 1 ] <= s ].............................0.09 [ T038: x := a[ i % 16 + 1 ] < s ]..............................0.09 [ T039: x := a[ i % 16 + 1 ] > s ]..............................0.08 [ T040: AScan( a, i % 16 ) ]....................................0.13 [ T041: AScan( a, {| x | x == i % 16 } ) ]......................0.83 [ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]....0.27 [ T043: x := a ]................................................0.00 [ T044: x := {} ]...............................................0.03 [ T045: f0() ]..................................................0.02 [ T046: f1( i ) ]...............................................0.03 [ T047: f2( c[1...8] ) ]........................................0.02 [ T048: f2( c[1...40000] ) ]....................................0.03 [ T049: f2( @c[1...40000] ) ]...................................0.02 [ T050: f2( @c[1...40000] ), c2 := c ]..........................0.03 [ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................0.11 [ T052: f2( a ) ]...............................................0.03 [ T053: x := f4() ].............................................0.13 [ T054: x := f5() ].............................................0.06 [ T055: x := Space( 16 ) ]......................................0.05 [ T056: f_prv( c ) ]............................................0.08 ==================================================================== [ total application time: ].....................................6.34 [ total real time: ]............................................6.35

SergKis: gfilatov2002 Добавьте в CLASS TWndData [pre2] ACCESS Title INLINE GetWindowText ( ::nHandle ) ASSIGN Title( cVal ) INLINE SetWindowText ( ::nHandle, cVal ) ACCESS Enabled INLINE IsWindowEnabled( ::nHandle ) ASSIGN Enabled( xVal ) INLINE iif ( Empty( xVal ), DisableWindow ( ::nHandle ), EnableWindow ( ::nHandle ) ) [/pre2] Пример для проверки на базе BASIC\ChildAsModal [pre2] /* */ #define _HMG_OUTLOG #include "hmg.ch" PROCEDURE main LOCAL cActiveFormName := 'Form_2' SET OOP ON DEFINE WINDOW Form_1 ; AT 0, 0 ; WIDTH 640 HEIGHT 480 ; TITLE 'Main Window'; MAIN DEFINE MAIN MENU POPUP 'Child Window' ITEM 'Open Win 2' ACTION {|| DoWindow2() } END POPUP END MENU DEFINE BUTTON B_OK ROW 20 COL 30 WIDTH 100 HEIGHT 28 ACTION Msgbox( 'OK' ) CAPTION "OK" END BUTTON // DEFINE TIMER T_1 INTERVAL 250 ACTION SetProperty( ThisWindow.Name, "Enabled", ( _IsWindowActive( cActiveFormName ) == .F. ) ) END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 RETURN ***************************************************************************** PROCEDURE DoWindow2() // LOCAL cActiveFormName := 'Form_3' LOCAL cOwnerFormName := ThisWindow.Name, cOwnerFormTitle := ThisWindow.Title LOCAL oWnd := ThisWindow.Object LOCAL cTit := oWnd:Title DEFINE WINDOW Form_2 ; AT App.Row + 30, App.Col + 30 ; WIDTH 600 HEIGHT 400 ; TITLE 'Win 2' ; CHILD ; ON INIT ( oWnd:Title := cTit + " - Disabled", oWnd:Enabled := .F. ) ; ON RELEASE ( oWnd:Enabled := .T., oWnd:Title := cTit, oWnd:SetFocus() ) /* ON INIT ( SetProperty( cOwnerFormName, "Title", cOwnerFormTitle + " - Disabled" ) ) ; ON RELEASE ( SetProperty( cOwnerFormName, "Title", cOwnerFormTitle ) ) ; */ @ 20, 40 BUTTON Button_2 caption 'Child Win 3' WIDTH 100 HEIGHT 28 ACTION {|| DoWindow3() } // DEFINE TIMER T_1 INTERVAL 250 ACTION SetProperty( ThisWindow.Name, "Enabled", ( _IsWindowActive( cActiveFormName ) == .F. ) ) END WINDOW ACTIVATE WINDOW Form_2 RETURN ***************************************************************************** PROCEDURE DoWindow3() // LOCAL cOwnerFormName := ThisWindow.Name, cOwnerFormTitle := ThisWindow.Title LOCAL oWnd := ThisWindow.Object LOCAL cTit := oWnd:Title DEFINE WINDOW Form_3 ; AT App.Row + 60, App.Col + 60 ; WIDTH 600 HEIGHT 400 ; TITLE 'Win 3' ; CHILD ; ON INIT ( oWnd:Title := cTit + " - Disabled", oWnd:Enabled := .F. ) ; ON RELEASE ( oWnd:Enabled := .T., oWnd:Title := cTit, oWnd:SetFocus() ) /* ON INIT ( SetProperty( cOwnerFormName, "Title", cOwnerFormTitle + " - Disabled" ) ) ; ON RELEASE ( SetProperty( cOwnerFormName, "Enabled", .T. ), SetProperty( cOwnerFormName, "Title", cOwnerFormTitle ), ; DoMethod( cOwnerFormName, "setFocus" ) ) */ @ 50, 100 BUTTON Button_2 caption 'OK' WIDTH 100 HEIGHT 28 ACTION {|| MsgBox( 'OK' ) } END WINDOW ACTIVATE WINDOW Form_3 RETURN [/pre2]

gfilatov2002: SergKis пишет: Добавьте в CLASS TWndData Спасибо, добавил

gfilatov2002: Обновил сборку 19.06 (Update 2) с учетом последних наработок Базовый дистрибутив находится по адресу http://hmgextended.com/files/CONTRIB/hmg-19.06-setup.exe Что нового: [pre2] * New: Added the useful function HMG_GetForms( [ cFormTypes ] [, lObj ] ) for retrieving of an array of the form's names (or handles). Contributed by Sergej Kiselev (see demo in folder \samples\Basic\MAINDEMO_(SYNTAX_I)) * Modified: The local OS detecting functions were replaced with a native [x]Harbour implementation (instead of using the MiniGUI function WindowsVersion()). NOTE: The C-functions IsWinXPorLater() and IsVistaOrLater() are defined as pseudo-functions now. It was a postponed modification. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see i_pseudofunc.ch in folder Include\) * Modified: The function IsExe64() is replaced with a native Harbour implementation. The compatibility with xHarbour compiler is provided also. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see i_pseudofunc.ch in folder Include\) * Updated: Header file i_hmgcompat.ch for compatibility with Official HMG: - added pseudo-function IsMaximized( hWnd ). Contributed by Grigory Filatov <gfilatov@inbox.ru> (see demo in folder \samples\Advanced\ImageFromWeb) * Updated: Pacified the warnings in the C-code for compatibility with MS Visual C++ 2019 (32-bit) compiler. Contributed by Grigory Filatov <gfilatov@inbox.ru> * Updated: OpenSSL wrapper for using of the version 1.0.2s. Contributed by Grigory Filatov <gfilatov@inbox.ru> (look at ReadMe.txt in folder \harbour) * Updated: 'MiniGUI DataBase Utility' sample. Contributed by Grigory Filatov <gfilatov@inbox.ru> (see in folder \Utils\mgDBU) [/pre2]

SergKis: gfilatov2002 Думается функция _hmg_OnHideFocusManagement ( i ) для окна STANDART работает не точно. Подправленный пример (был выше) тут https://TransFiles.ru/b0lgp Нажатие кнопок на окнах CHILD и MODAL работает нормально, а на окне STANDART на передний план выводится окно MAIN и потом окно AlertInf(...). Если, в ф-ии _DO_BTN_( oBtn ), убрать строку (выделено цветом)[pre2] STATIC FUNC _DO_BTN_( oBtn ) LOCAL cBtn := oBtn:Name //This.Name LOCAL cCapt := This.Caption LOCAL cWnd := ThisWindow.Name LOCAL cTitl := ThisWindow.Title LOCAL cType := ThisWindow.Type LOCAL lStbP := 'Export' $ cBtn LOCAL cText := iif( lStbP, CRLF+CRLF+'Start ProgressBar', '' ) LOCAL aThis := _ThisInfo() _OUT_(.T., cWnd, cType) AlertInfo(cBtn + CRLF + cCapt + CRLF + cTitl + CRLF + cType + cText, cWnd) _OUT_(.F.) _ThisInfo(aThis) This.Chk_Lock.Value := .F. // oBtn:SetFocus() If lStbP; StbProgressBar() EndIf This.Chk_Lock.Value := .T. RETURN Nil [/pre2] окно MAIN так и останется на переднем плане в фокусе.

gfilatov2002: SergKis пишет: на окне STANDART на передний план выводится окно MAIN Да, это верно Но это плата за то, что у этого окна нет родительского окна-хозяина (в отличие от CHILD). SergKis пишет: Если, в ф-ии _DO_BTN_( oBtn ), убрать строку Поэтому и требуется предложенный Вами костыль. Как это победить по-другому, я не нашел...

SergKis: gfilatov2002 пишет Как это победить по-другому, я не нашел... Получается при первом STANDART надо убирать MAIN в hide (костыль в придачу), тогда, вроде, похоже на правду [pre2] STATIC FUNC Main_Btn_Run( oBtn, nEvent ) ... LOCAL nY, nX, nW, nH, nN, aYX LOCAL nTypW := 0 LOCAL cTypW := '' ... DEF WINDOW &cForm AT 0,0 WIDTH 1100 HEIGHT 650 ; ... ON RELEASE Nil cTypW := This.Type nTypW := Len( HMG_GetForms('S') ) If cTypW == 'S' .and. nTypW == 1 do_obj( _HMG_MainHandle, {|ow| ow:Hide() } ) EndIf DEFINE STATUSBAR ... CENTER WINDOW &cForm ACTIVATE WINDOW &cForm If cTypW == 'S' .and. nTypW == 1 do_obj( _HMG_MainHandle, {|ow| ow:Show() } ) EndIf If Len(HMG_GetForms()) == 1; oChk:Value := .T. EndIf RETURN Nil [/pre2]

Andrey: Заметил такую неприятность. В функциях пользуюсь определением имени формы [pre2] ? ThisWindow.Name, _HMG_ThisFormName, cStaticGlobalForm возвращает: Form_Main Form_Main Form_AYC [/pre2] cStaticGlobalForm - делаю определение сразу под созданием окна. Т.е. должно всегда возвращаться Form_AYC !!! Значит - ThisWindow.Name, _HMG_ThisFormName нельзя использовать ? Правда у меня на форме Form_Main включён таймер на каждую секунду (для тестирования). Может он влияет на псевдо-функции ThisWindow.Name, _HMG_ThisFormName ?

SergKis: Andrey пишет Значит - ThisWindow.Name, _HMG_ThisFormName нельзя использовать ? Перечитай http://clipper.borda.ru/?1-1-0-00000521-000-280-0-1563229132 Лучшее решение, по мне, функция aThis := _ThisInfo(), работаешь как с Alias(), сохраняешь\восстанавливаешь

SergKis: PS т.е. в TIMER блоке на Form_Main ставишь aThis := _ThisInfo() // в начале ... _ThisInfo(aThis) // в конце

SergKis: PPS Наврал, на TIMER не получится, там ставится среда This для Form_Main, sory

Andrey: Понял, что с TIMER нужно аккуратно работать. Всё таки решение через STATIC переменную типа cStaticThisForm более простое. SergKis пишет: Лучшее решение, по мне, функция aThis := _ThisInfo(), работаешь как с Alias(), сохраняешь\восстанавливаешь Буду иметь ввиду. Уже кое где применил.

SergKis: Andrey пишет Всё таки решение через STATIC переменную типа cStaticThisForm более простое. Теряется универсальность. Надо каждое окно делать в отдельном prg файле, иначе для каждого окна свою переменную, что фактически означает работу по имени окна, т.е. Form_Main.Btn1.Value и т.д.

PSP: SergKis пишет: Теряется универсальность. Надо каждое окно делать в отдельном prg файле, иначе для каждого окна свою переменную, что фактически означает работу по имени окна, т.е. Form_Main.Btn1.Value и т.д. hash-массив не поможет в этом случае?

Andrey: PSP пишет: hash-массив не поможет в этом случае? Да зачем усложнять то код написания. Нужно проще писать код, чтобы когда нужно править так лет через 10, понимать что и как написано. А то открываешь свой код написанный 12 лет назад и думаешь, кто так фигово написал то.... и почему до сих пор работает ?

SergKis: PSP пишет Как это может помочь при плавающем cForm [pre2] WHILE _IsWindowDefined( cForm := cFrm+'_'+hb_ntos(++nFrm) ) ENDDO [/pre2]



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