Автор | Сообщение |
|
| постоянный участник
|
Пост N: 6515
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.11.19 21:04. Заголовок: Как вернуть на экран своё окно ?
Непонятка большая у юзеров, да и у меня тоже.... Запускаю Фар и Мозилу, потом прогу на минигуи. В проге на МиниГуи открываю своё окно печати : PUBLIC oBrwP ..... DEFINE WINDOW Form_F5 ; ..... nHandle := ThisWindow.Handle .... DEFINE TBROWSE oBrwP ; ..... CELL END TBROWSE .... @ nRowButt, nColButt BUTTONEX BUTTON_Print WIDTH nWButt HEIGHT nHButt ; .......... ACTION {|| MenuPrint("F5", oBrwP:nAt), DoEvents(), BringWindowToTop( nHandle ) } .... По кнопке в функции MenuPrint() ставлю в конце функции: STATIC FUNCTION MenuF5F4(cFKey,nLine) ..... hWinHandle := nHandle cRet := &cRun(cMenu, cForma, ....) .... ShowWindow( hWinHandle, 6 ) // MINIMIZE windows ShowWindow( hWinHandle, 1 ) // SW_NORMAL windows DO EVENTS BringWindowToTop( hWinHandle ) // A window on the foreground BrwButtonShowHide(.T.) // разблокировать кнопки внизу формы DO EVENTS oBrwP:Setfocus() DO EVENTS SELECT(nTekSelect) RETURN Nil После выхода из cRet := &cRun(cMenu, cForma, ....) появляется окно Фара, а окно печати под Фаром. Если Фар скинуть на панель задач, то появляется окно Мозилы, а моё окно печати под ней. Почему так ? Как вернуть своё окно печати поверх всех окон ? Если Фар и Мозилу скинуть на панель задач, то только тогда появляется моё окно, т.к. нет других открытых задач. Но у юзеров постоянно куча окон открыто и они теряются, ищут окно печати. P.S. Забыл уточнить, на главной форме висит таймер каждые 1 минуту проверяет то что нужно.
|
|
|
Ответов - 17
[только новые]
|
|
|
| постоянный участник
|
Пост N: 6596
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.20 12:11. Заголовок: Опять непонятки пове..
Опять непонятки поведения МиниГуи в Win8.1 и WinServer 2012 В WinServer 2012 теряется модальное окно. В проге есть окно Form_0 c бровсом(таблица) и кнопкой вызова для модального окна Form_1, на неё есть кнопка вызова другого модального окна Form_2. После закрытия Form_2 на экране остаётся таблица, которую нельзя редактировать, так как модальное окно Form_1 прячется на MAIN окне. Пока не тыкнешь на MAIN окне - только тогда поднимается модальное окно Form_1 и можно дальше работать. На Win8.1 такого нет. Достаточно ли будет поставить так, чтобы убрать эту непонятку ? .... Show_Form2() // вызов модального окна Form_2 Form_1.Restore DO EVENTS
|
|
|
|
| постоянный участник
|
Пост N: 3080
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.20 13:03. Заголовок: Andrey пишет Достато..
Andrey пишет цитата: | Достаточно ли будет поставить так, чтобы убрать эту непонятку ? |
| Практика показала, что нет. Когда делал менеджер запуска clipper программ по DosBox и windows программ по командам из DosBox менеджером (ShellExecuteEx), описанная тобой ситуация, под 10 и 7 была во всей красе, под 8 все отлично, как надо. BringToTop не помогали. Моя борьба с этим закончилась тем, что окно менеджера минимизирую, запускаю wvt\hmg\vo программу и по окончании их работы поднимаю окно менеджера. Все сообщения менеджера, при окне DosBox и др. раб. окон (MsgStop(), MsgBox(),...) выходили но передний план, но не в фокусе, т.е. надо доп. по ним кликать мышкой. Сделал доп. комплект этих ф-й с добавленным параметром hWnd родителя и при 0 (окно десктоп родитель) окна сообщений стали работать почти как надо, кроме первого раза. Т.е. первый раз любое окно сообщения было не в фокусе. С окнами сообщений завершил работу тем, что убрал их и стал общаться с DosBox, т.е. перенес сообщения на прогу, работающую в DosBox (bat файл). В таком виде работает стабильно.
|
|
|
|
| постоянный участник
|
Пост N: 3081
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.20 13:52. Заголовок: Andrey Если Form_2 ..
Andrey Если Form_2 вызываешь из под Form_1, то попробуй на Form_2 до DEFINE WINDOW ... сделать hParent := _hmg_InplaceParentHandle _hmg_InplaceParentHandle := GetFormHandle(ThisWindow.Name) // 'Form_1' ... Form_2.Action _hmg_InplaceParentHandle := hParent
|
|
|
|
| постоянный участник
|
Пост N: 6597
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.20 15:58. Заголовок: SergKis пишет: Если..
SergKis пишет: цитата: | Если Form_2 вызываешь из под Form_1, то попробуй на Form_2 до DEFINE WINDOW ... сделать |
| У меня в программе 2 режима вызова этого окна. 1) сразу одна кнопка вызова Show_Form2() 2) есть доп.окно Form_1 и вызов с этого окна по кнопке Show_Form2() Как мне сделать эту обработку только для режима 2 ? Т.е. там DEFINE WINDOW Form_1 .... @ ... nG BUTTONEX Btn_F4 ... ; .... ACTION {|| ToF4(), oBrw:SetFocus() } .... END WINDOW Form_1.Action ... Function ToF4() Show_Form2() // вызов модального окна Form_2 Form_1.Restore DO EVENTS Return Nil На втором компе проверил по удалёнке, там стоит WinServer 2008 - отлично работает, костылей не нужно.
|
|
|
|
| постоянный участник
|
Пост N: 3082
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.20 16:40. Заголовок: FUNCTION _DefineMod..
FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ?
|
|
|
|
| постоянный участник
|
Пост N: 6598
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.20 16:44. Заголовок: SergKis пишет: Дела..
SergKis пишет: цитата: | Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ? |
| А куда это вставить, модуль какой ? Вообще то меня забодало (юзеров тоже), открываешь несколько модальных окон и потом нужно дергать MAIN окно. Может это нужно сразу поставить в МиниГуи ?
|
|
|
|
| постоянный участник
|
Пост N: 3083
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.20 16:54. Заголовок: Andrey пишет А куда ..
Andrey пишет цитата: | А куда это вставить, модуль какой ? |
| У тебя, как понимаю, окна в функциях. Вот в них и делаешь. Повторю на твоем примере LOCAL hParent := _hmg_InplaceParentHandle _hmg_InplaceParentHandle := GetFormHandle(ThisWindow.Name) DEFINE WINDOW Form_1 .... @ ... nG BUTTONEX Btn_F4 ... ; .... ACTION {|| ToF4(), oBrw:SetFocus() } .... END WINDOW Form_1.Action _hmg_InplaceParentHandle := hParent ...
|
|
|
|
| постоянный участник
|
Пост N: 6599
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.20 17:00. Заголовок: SergKis пишет: Вот ..
SergKis пишет: цитата: | Вот в них и делаешь. Повторю на твоем примере |
| Спасибо БОЛЬШОЕ ! Буду пробовать...
|
|
|
|
| постоянный участник
|
Пост N: 3084
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.20 17:03. Заголовок: PS Можно попробовать..
PS Можно попробовать добавить LOCAL cWnd := ThisWindow.Name LOCAL cFocus := This.FocusedControl ... _hmg_InplaceParentHandle := hParent DoMethod(cWnd, 'SetFocus') IF ! empty(cFocus) DoMethod(cWnd, cFocus, 'SetFocus') ENDIF ...
|
|
|
|
| постоянный участник
|
Пост N: 6605
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.04.20 16:38. Заголовок: SergKis пишет: Можн..
SergKis пишет: цитата: | Можно попробовать добавить |
| Поставил. Вроде нормально работает, пока юзера не жаловались...
|
|
|
|
| постоянный участник
|
Пост N: 6606
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.04.20 16:55. Заголовок: Всем привет - отдыха..
Всем привет - отдыхающим и работающим !!! Вопрос возник по окнам: Есть окно DEFINE WINDOW Form_OtvetSite ; WINDOWTYPE STANDARD ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || IniGetPosWindow(,,cTitle), SetProperty("Form_OtvetSite", "Topmost", .T.) } ; .... @ ... BUTTONEX Button_Exit ; CAPTION 'Выход' ; ...... ACTION { || Form_OtvetSite.Minimize, Form_OtvetSite.Label_Title.Setfocus } DEFINE TIMER Timer_1 INTERVAL OTVET_TIMER * nMsec ACTION DownldOtvetSite() END WINDOW ACTIVATE WINDOW Form_OtvetSite NOWAIT .... Это окно можно скинуть на рабочий стол и оно там находиться постоянно. Раз в 5-10 минут (в зависимости от настроек) по таймеру идёт запрос к PostgreSql и если там есть данные, то окно Form_OtvetSite.Restore и располагается повер всех окон. Всё классно работает, если на экране нет MODAL окна, если есть, то труба - сколько не жми кнопку Выход, ничего не происходит, пока окно MODAL не закроешь, доступа к кнопке Выход НЕТ ! Как исправить данную ситуацию ?
|
|
|
|
|
| постоянный участник
|
Пост N: 3108
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.04.20 21:15. Заголовок: Andrey пишет Это окн..
Andrey пишет цитата: | Это окно можно скинуть на рабочий стол и оно там находиться постоянно |
| В чем смысл нахождения этого окна постоянно в работе\ожидании ? Можно проверить изменения и запустить окно modal когда надо, оно тогда всегда запустится
|
|
|
|
| постоянный участник
|
Пост N: 6607
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.04.20 22:08. Заголовок: SergKis пишет: В че..
SergKis пишет: цитата: | В чем смысл нахождения этого окна постоянно в работе\ожидании ? |
| Чтобы юзер увидел когда окно поднялось, что пришёл ответ от мастера (PostgreSql) и вывожу этот ответ в это окно. Юзер может отложить (скинуть на раб.стол) этот ответ и продолжить работу. Когда юзер захочет, то может вернутся к этому окну ответа.
|
|
|
|
| постоянный участник
|
Пост N: 3110
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.04.20 22:37. Заголовок: Andrey пишет пока ок..
Andrey пишет цитата: | пока окно MODAL не закроешь, доступа к кнопке Выход НЕТ ! |
| Так и должно быть, пока модал на экране, можешь создавать модал окно, а другое будет не доступно. цитата: | Чтобы юзер увидел когда окно поднялось, что пришёл ответ от мастера (PostgreSql) и вывожу этот ответ в это окно. Юзер может отложить (скинуть на раб.стол) этот ответ и продолжить работу. Когда юзер захочет, то может вернутся к этому окну ответа. |
| Вместо поднятия создавай новое окно и имей режим создания такого окна с последними данными от Postgres/ У тебя даже все упростится в работе окон, от того, что есть сейчас
|
|
|
|
| постоянный участник
|
Пост N: 6608
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.04.20 13:37. Заголовок: SergKis пишет: Вмес..
SergKis пишет: цитата: | Вместо поднятия создавай новое окно и имей режим создания такого окна с последними данными от Postgres/ У тебя даже все упростится в работе окон, от того, что есть сейчас |
| Не совсем то... Не будет режима: отложить окно (*.Minimize) пока юзер занят другой работой. Вроде единственный вариант пока для меня проверять, есть ли окно работы у юзера с карточкой (Form_Card) и не поднимать окно ответа в этом случае. Хотя лучше бы сделать на проверку - есть ли MODAL окно на экране ? Как это можно сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 3111
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.04.20 14:54. Заголовок: Andrey пишет Не буде..
Andrey пишет цитата: | Не будет режима: отложить окно (*.Minimize) пока юзер занят другой работой. |
| По мне. Абсолютно "пустой" режим (*.Minimize), вполне можно обходится без этого висящего окна. Его можно создавать, в любой момент, когда надо или вообще вынести в программу фона, посадив в tray (работу с Postgres) цитата: | Хотя лучше бы сделать на проверку - есть ли MODAL окно на экране ? Как это можно сделать ? |
| Тип окна "M" проверь и дальше что ... ?
|
|
|
|
| постоянный участник
|
Пост N: 6609
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.04.20 16:57. Заголовок: SergKis пишет: Тип ..
SergKis пишет: цитата: | Тип окна "M" проверь и дальше что ... ? |
| Не буду поднимать окно Form_OtvetSite.Restore Нормальное решение для юзера. SergKis пишет: цитата: | посадив в tray (работу с Postgres) |
| Не знаю как трей работает с сервером-терминалов, да и обычные юзера теряются с треем, ему понятней свернутое окно программы.
|
|
|
|