Форум » 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

SergKis: gfilatov2002 Вроде поймал ситуацию, которая возникает у Андрея. Пример на базе SPLASHDEMO_3: https://TransFiles.ru/vz2sa На кнопках входим в окно STANDARD с тсб, выбираем запись и входим в окно AlertInfo(...) Не смотря на заданный _HMG_InplaceParentHandle при первом входе в окно по кнопке, выбора записи и выхода из AlertInfo(), окно с тсб убегает под окно MAIN. Окно STANDARD имеет родителя окно DeskTop. Повторные выборы записи и все ok! окно STANDARD на переднем плане, но закрыв его и снова жмем кнопку, та же картина, окно под main. Т.е. поведение окна STANDARD первый раз правильное, раз привязана к desktop, то на desktop и убежало (хоть и было поверх main), тогда надо дать возможность, как и у модал, привязывать родителя, может через тот же _HMG_InplaceParentHandle, сейчас стоит в _DefineWindow() ParentHandle := iif( child == .T., _HMG_MainHandle, 0 )

gfilatov2002: SergKis Большое спасибо за Ваш пример Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна. [pre2] (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) [/pre2] где вспомогательная функция определена в одну строку: [pre2]DECLARE DLL_TYPE_VOID SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; IN USER32.DLL [/pre2]

SergKis: gfilatov2002 пишет Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна Дело не в этом, а во внутренней работе hmg (ф-я events()), которая перемещает окно standard на desktop после первого вызова, т.е. убирает окно с переднего плана, окно должно оставаться как было на переднем плане или привязывать parentHandle к main например. Поднять окно после модального можно и To_Focus(...) можно[pre2] FUNCTION my_Modal( oWnd ) LOCAL nBrw, oBrw, cBrw, cAls, cWnd LOCAL cMsg := "" LOCAL o := oWnd:Cargo cWnd := oWnd:Name nBrw := o:nBrw oBrw := o:oBrw cBrw := o:cBrw cAls := o:cAls cMsg := hb_valtoexp({cWnd, nBrw, cBrw, cAls, oBrw:cControlName}) AlertInfo(cMsg, "INFO - "+cWnd) To_Focus(cWnd, cBrw) RETURN Nil [/pre2] Последующие выборы строки (не выходя из STANDARD) работают не перемещая окно STANDARD после modal


SergKis: PS Проявление ситуации хорошо видно на следующем примере (добавил модальное окно на выбор записи с таблицей тсб). Выбор в этом окне и выход из окна AlertInfo() дает перенос окна STANDARD под main, т.е. с окна модального с таблицей улетели под main. Пример https://TransFiles.ru/0s7wp PS Попробовал простое (для теста) в [pre2] FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ; ... //ParentHandle := iif( child == .T., _HMG_MainHandle, 0 ) ParentHandle := iif( child == .T., _HMG_MainHandle, _HMG_InplaceParentHandle ) ... и в примере в ф-ии (цветом) STATIC FUNCTION my_Btn( nEvnt, cButt, oWnd ) LOCAL cBtn, cWnd, o, cForm, y, x cWnd := oWnd:Name cBtn := "ButtonEX_" + hb_ntos(nEvnt) cForm := "w"+cBtn IF cBtn != cButt ? ProcName(), "ERROR", cBtn, "!=", cButt RETURN .F. ENDIF SET WINDOW THIS TO cWnd o := This.(cBtn).Cargo cAls := "CUST_"+hb_ntos(o:nBtn) cTitle := cBtn+": "+hb_ntos(o:nBtn)+" "+o:cCap y := o:nY - 100 x := o:nX + 50 _HMG_InplaceParentHandle := This.Handle ? ProcName(), nEvnt, cBtn, o:cBtn, o:nBtn, o:cCap, cForm, cTitle my_Standard( cForm, o:nBtn, cTitle, o:aBClr, y, x, o:nW, o:nH, cAls ) _HMG_InplaceParentHandle := 0 SET WINDOW THIS TO RETURN .T. [/pre2] Окна не убегают под main, но при выходе из окна modal с тсб, окно STANDARD без фокуса (это все про первый вход с кнопки, потом все ok!)

SergKis: Григорий Есть эффект не оч. красивый, если в последнем примере, например кнопку "Sample 2" нажать, сделать выбор строки, попадаем на окно модал с таблицей, теперь, если кликнуть мышкой по заголовку окна STANDARD (пред. таблица), то будет мелькание окон и только потом звук с возвратом фокуса на тек. модальное окно

SergKis: gfilatov2002 пишет Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна. (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) Тогда получается, что код в ф-ии Events(...), для окна modal, не работает [pre2] ... **************************************************************************** CASE WM_CLOSE **************************************************************************** ... _hmg_OnHideFocusManagement ( i ) ... *-----------------------------------------------------------------------------* PROCEDURE _hmg_OnHideFocusManagement ( i ) *-----------------------------------------------------------------------------* ... * Modal IF ( x := AScan ( _HMG_aFormHandles, _HMG_aFormParenthandle [ i ] ) ) > 0 IF _HMG_aFormType [ x ] == "M" * Modal Parent _HMG_IsModalActive := .T. _HMG_ActiveModalHandle := _HMG_aFormParenthandle [ i ] EnableWindow ( _HMG_aFormParenthandle [ i ] ) SetFocus ( _HMG_aFormParenthandle [ i ] ) ELSE ...[/pre2] Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] ) SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )

gfilatov2002: SergKis пишет: Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] ) SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 ) Да, тоже подумываю об этом. Благодарю за наводку

gfilatov2002: Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]). По умолчанию значение lRestore = .T. Теперь конструкции вида IF IsIconic( hForm ) ; _Restore( hForm ) ENDIF можно заменить на SwitchToThisWindow( hForm )

SergKis: gfilatov2002 Маленькая добавка [pre2] METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse ... ATail( ::aColumns ):nFieldDec := aStru[ nE, 4 ] // 18.07.2018 IF aStru[ nE, 2 ] $ "=@T^+" ATail( ::aColumns ):lEdit := .F. ENDIF IF HB_ISARRAY( aNameSel ) .AND. Len( aNameSel ) > 0 .AND. n <= Len( aNameSel ) ... для режима SET DELETED OFF METHOD DeleteRow( lAll, lUpStable ) CLASS TSBrowse ... ::lHasChanged := .T. ::DrawSelect() CASE ::lIsArr ... [/pre2] Без этой строки надо oBrw:bPostDel := {|ob| ob:DrawSelect() } добавлять

gfilatov2002: SergKis пишет: Маленькая добавка Принято

Andrey: gfilatov2002 пишет: Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]). Когда обновление будет ?

gfilatov2002: Andrey пишет: Когда обновление будет ? Послезавтра, в среду

SergKis: gfilatov2002 Поймал ситуацию, как у Андрея. Не лечится To_Focus(), SwitchToThisWindow( hForm, 1 ) Пример https://TransFiles.ru/eudq8 После запуска, например, жмем "Sample 1", потом "Sample 2" Снова жмем "Sample 1", что бы перевести окно STANDARD на передний план. Не получается, окно приходит поверх main и опять прячется под него, т.е. мелькает Так же ведет себя и кнопка "Sample 2" и остальные тоже. Мышкой или Alt+TAB все работает Ф-я my_Btn() находится в table.prg. Работает для всех кнопок окна standard.

gfilatov2002: SergKis пишет: Поймал ситуацию, как у Андрея. Благодарю за пример! SergKis пишет: Мышкой или Alt+TAB все работает Не понятен выбор окон типа STANDARD для внутренних окон приложения. Окна STANDARD являются самостоятельными по отношению к главному окну. Для внутренних окон, конечно, надо использовать окна CHILD. Думаю, это решит проблему с иерархией окон в приложении.

SergKis: gfilatov2002 пишет Думаю, это решит проблему с иерархией окон в приложении. У Андрея, я так понимаю, запускается ~5 окон STANDARD, которые получают фокус для работы пользователем по выбору в TaskBar, все работает на один раз открытые базы (наверно исторически так сложилось). Окна STANDARD являются самостоятельными по отношению к главному окну Это да, но это не значит, что Main окно, должно захватывать фокус. Немного подработал, почистил пример и сделал TABSTOP на кнопки main окна и стало видно, что повторно поднять окно standard кнопкой не получается, оно мелькает и фокус на main визуально, реально не понятно, т.к. (добавил в my_Standard() на входе)[pre2] IF _IsWindowDefined(cForm) hW := GetFormHandle(cForm) nI := GetFormNameByHandle( hW, @cVal ) ? "*Form =", hW, nI, cVal hW := GetFocus() cVal := "" nI := -1 IF hW <> 0 nI := GetFormNameByHandle( hW, @cVal ) ENDIF ? "*Focus=", hW, nI, cVal To_Focus(cForm) hW := GetFocus() cVal := "" nI := -1 IF hW <> 0 nI := GetFormNameByHandle( hW, @cVal ) ENDIF ? "#Focus=", hW, nI, cVal IF select(cAls) > 0 ; dbSelectArea(cAls) ENDIF RETURN Nil ENDIF ... выдает следующее *Form = 23594206 2 wButton_1 *Focus= 6030820 0 '' Call from: TO_FOCUS(20) --> main_misc.prg wButton_1 23594206 NIL #Focus= 45286518 0 '' ... [/pre2] Если интересно, пример с правками тут https://TransFiles.ru/hjqmk

SergKis: PS Заменил ссылку на пример, т.к. потерял bmp в ресурсах для индикации удаленных записей

Andrey: gfilatov2002 пишет: Не понятен выбор окон типа STANDARD для внутренних окон приложения. Окна STANDARD являются самостоятельными по отношению к главному окну. Для внутренних окон, конечно, надо использовать окна CHILD. Думаю, это решит проблему с иерархией окон в приложении. Во многих приложениях есть главное окно, с которого юзер запускает нужные ему окна для работы. У меня юзер запускает STANDARD окна с заявками, договорами, абонентами и т.д. Заставить юзера работать только с одним окном это не по современному, пускай что хочет, то и делает. STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться. Пример SAMPLES\Advanced\Tsb_5Win тоже такой же, и я думаю его так же можно поломать - поставив окно ожидания с прелодером и вызовом нескольких MODAL окон.

SergKis: gfilatov2002 Есть еще интересное поведение modal окон. Запускаем "Sample 1", "Sample 2" Поднимаем фокус на "Sample 1" (оба окна Sample над main) Жмем Enter на "Sample 1" -> попадаем на окно modal, кусочек окна "Sample 2" виден Жмем мышкой на видимый заголовок окна "Sample 2" Активируется окно "Sample 1" как будто на нем нажали Enter несколько раз -> попадаем на окно modal AlertInfo()

SergKis: Andrey пишет STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться. Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), т.е. 0. main 0 // main окно с кнопками запуска в потоке пунктов ниже 1. main 1 // main окно заменяющее окно STANDARD 1 ... 5. main 5 // main окно заменяющее окно STANDARD 5 программа бы сильно упростилась, по мне

Andrey: SergKis пишет: Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), Нужно тогда менять иконку и титул окна задачи. Время запуска и открытия баз при запуске нового ехе-ника намного БОЛЬШЕ чем создание STANDART окна, базы все уже открыты. А так юзер будет нервничать, при каждом запуске ругаясь на "тормозную" программу. Уже такое видел и не раз. И логику программирования свою менять. Это можно, но уже в новых проектах.



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