Автор | Сообщение |
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
[только новые]
|
|
SergKis
|
| постоянный участник
|
Пост N: 4325
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.23 11:18. Заголовок: gfilatov2002 Вроде ..
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
|
| moderator
|
Пост N: 2164
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.06.23 11:54. Заголовок: SergKis Большое спа..
SergKis Большое спасибо за Ваш пример Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна. (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) где вспомогательная функция определена в одну строку: DECLARE DLL_TYPE_VOID SwitchToThisWindow( DLL_TYPE_LONG hWnd, DLL_TYPE_BOOL lRestore ) ; IN USER32.DLL
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4326
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.23 12:53. Заголовок: gfilatov2002 пишет Р..
gfilatov2002 пишет цитата: | Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна |
| Дело не в этом, а во внутренней работе hmg (ф-я events()), которая перемещает окно standard на desktop после первого вызова, т.е. убирает окно с переднего плана, окно должно оставаться как было на переднем плане или привязывать parentHandle к main например. Поднять окно после модального можно и To_Focus(...) можно 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 Последующие выборы строки (не выходя из STANDARD) работают не перемещая окно STANDARD после modal
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4327
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.23 13:32. Заголовок: PS Проявление ситуац..
PS Проявление ситуации хорошо видно на следующем примере (добавил модальное окно на выбор записи с таблицей тсб). Выбор в этом окне и выход из окна AlertInfo() дает перенос окна STANDARD под main, т.е. с окна модального с таблицей улетели под main. Пример https://TransFiles.ru/0s7wp PS Попробовал простое (для теста) в 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. Окна не убегают под main, но при выходе из окна modal с тсб, окно STANDARD без фокуса (это все про первый вход с кнопки, потом все ok!)
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4328
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.23 14:39. Заголовок: Григорий Есть эффект..
Григорий Есть эффект не оч. красивый, если в последнем примере, например кнопку "Sample 2" нажать, сделать выбор строки, попадаем на окно модал с таблицей, теперь, если кликнуть мышкой по заголовку окна STANDARD (пред. таблица), то будет мелькание окон и только потом звук с возвратом фокуса на тек. модальное окно
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4329
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.23 15:32. Заголовок: gfilatov2002 пишет Р..
gfilatov2002 пишет цитата: | Решил эту проблему с помощью вызова функции SwitchToThisWindow() после выхода из модального окна. (This.Object):Event(VK_RETURN, {|ow| my_Modal(ow), SwitchToThisWindow( GetFormHandle( cForm ), 1 ) }) |
| Тогда получается, что код в ф-ии Events(...), для окна modal, не работает ... **************************************************************************** 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 ... Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] ) SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 )
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2165
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.06.23 16:03. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может есть смысл здесь подключить вместо SetFocus ( _HMG_aFormParenthandle [ i ] ) SwitchToThisWindow( _HMG_aFormParenthandle [ i ], 1 ) |
| Да, тоже подумываю об этом. Благодарю за наводку
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2167
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.06.23 18:22. Заголовок: Добавил в ядро библи..
Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]). По умолчанию значение lRestore = .T. Теперь конструкции вида цитата: | IF IsIconic( hForm ) ; _Restore( hForm ) ENDIF |
|
можно заменить на цитата: | SwitchToThisWindow( hForm ) |
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4330
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.06.23 09:52. Заголовок: gfilatov2002 Малень..
gfilatov2002 Маленькая добавка 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 ... Без этой строки надо oBrw:bPostDel := {|ob| ob:DrawSelect() } добавлять
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2168
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.06.23 10:38. Заголовок: SergKis пишет: Мале..
SergKis пишет: Принято
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7448
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.06.23 10:59. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Добавил в ядро библиотеки функцию SwitchToThisWindow(hWnd,[lRestore]). |
| Когда обновление будет ?
|
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2169
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.06.23 11:02. Заголовок: Andrey пишет: Когда..
Andrey пишет: Послезавтра, в среду
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4331
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.06.23 01:55. Заголовок: gfilatov2002 Поймал..
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
|
| moderator
|
Пост N: 2170
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.06.23 11:00. Заголовок: SergKis пишет: Пойм..
SergKis пишет: цитата: | Поймал ситуацию, как у Андрея. |
| Благодарю за пример! SergKis пишет: цитата: | Мышкой или Alt+TAB все работает |
| Не понятен выбор окон типа STANDARD для внутренних окон приложения. Окна STANDARD являются самостоятельными по отношению к главному окну. Для внутренних окон, конечно, надо использовать окна CHILD. Думаю, это решит проблему с иерархией окон в приложении.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4332
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.06.23 12:07. Заголовок: gfilatov2002 пишет Д..
gfilatov2002 пишет цитата: | Думаю, это решит проблему с иерархией окон в приложении. |
| У Андрея, я так понимаю, запускается ~5 окон STANDARD, которые получают фокус для работы пользователем по выбору в TaskBar, все работает на один раз открытые базы (наверно исторически так сложилось). цитата: | Окна STANDARD являются самостоятельными по отношению к главному окну |
| Это да, но это не значит, что Main окно, должно захватывать фокус. Немного подработал, почистил пример и сделал TABSTOP на кнопки main окна и стало видно, что повторно поднять окно standard кнопкой не получается, оно мелькает и фокус на main визуально, реально не понятно, т.к. (добавил в my_Standard() на входе) 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 '' ... Если интересно, пример с правками тут https://TransFiles.ru/hjqmk
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4333
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.06.23 12:41. Заголовок: PS Заменил ссылку на..
PS Заменил ссылку на пример, т.к. потерял bmp в ресурсах для индикации удаленных записей
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7449
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.06.23 12:51. Заголовок: Не понятен выбор око..
gfilatov2002 пишет: цитата: | Не понятен выбор окон типа STANDARD для внутренних окон приложения. Окна STANDARD являются самостоятельными по отношению к главному окну. Для внутренних окон, конечно, надо использовать окна CHILD. Думаю, это решит проблему с иерархией окон в приложении. |
| Во многих приложениях есть главное окно, с которого юзер запускает нужные ему окна для работы. У меня юзер запускает STANDARD окна с заявками, договорами, абонентами и т.д. Заставить юзера работать только с одним окном это не по современному, пускай что хочет, то и делает. STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться. Пример SAMPLES\Advanced\Tsb_5Win тоже такой же, и я думаю его так же можно поломать - поставив окно ожидания с прелодером и вызовом нескольких MODAL окон.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4334
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.06.23 12:55. Заголовок: gfilatov2002 Есть е..
gfilatov2002 Есть еще интересное поведение modal окон. Запускаем "Sample 1", "Sample 2" Поднимаем фокус на "Sample 1" (оба окна Sample над main) Жмем Enter на "Sample 1" -> попадаем на окно modal, кусочек окна "Sample 2" виден Жмем мышкой на видимый заголовок окна "Sample 2" Активируется окно "Sample 1" как будто на нем нажали Enter несколько раз -> попадаем на окно modal AlertInfo()
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4335
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.06.23 13:06. Заголовок: Andrey пишет STANDAR..
Andrey пишет цитата: | STANDARD окно ОЧЕНЬ удобно для юзера, оно остаётся на панели задач со своим значком и юзеру это нравиться. |
| Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), т.е. 0. main 0 // main окно с кнопками запуска в потоке пунктов ниже 1. main 1 // main окно заменяющее окно STANDARD 1 ... 5. main 5 // main окно заменяющее окно STANDARD 5 программа бы сильно упростилась, по мне
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 7450
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.06.23 13:19. Заголовок: SergKis пишет: Ты п..
SergKis пишет: цитата: | Ты получишь то же самое, если запустишь свой exe 6 раз (можно в потоке, как пример FileChangeControl2), |
| Нужно тогда менять иконку и титул окна задачи. Время запуска и открытия баз при запуске нового ехе-ника намного БОЛЬШЕ чем создание STANDART окна, базы все уже открыты. А так юзер будет нервничать, при каждом запуске ругаясь на "тормозную" программу. Уже такое видел и не раз. И логику программирования свою менять. Это можно, но уже в новых проектах.
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|