Форум » GUI » Как вернуть на экран своё окно ? » Ответить

Как вернуть на экран своё окно ?

Andrey: Непонятка большая у юзеров, да и у меня тоже.... Запускаю Фар и Мозилу, потом прогу на минигуи. В проге на МиниГуи открываю своё окно печати : [pre2] 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 ) } ....[/pre2] По кнопке в функции MenuPrint() ставлю в конце функции: [pre2]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[/pre2] После выхода из cRet := &cRun(cMenu, cForma, ....) появляется окно Фара, а окно печати под Фаром. Если Фар скинуть на панель задач, то появляется окно Мозилы, а моё окно печати под ней. Почему так ? Как вернуть своё окно печати поверх всех окон ? Если Фар и Мозилу скинуть на панель задач, то только тогда появляется моё окно, т.к. нет других открытых задач. Но у юзеров постоянно куча окон открыто и они теряются, ищут окно печати. P.S. Забыл уточнить, на главной форме висит таймер каждые 1 минуту проверяет то что нужно.

Ответов - 17

Andrey: Опять непонятки поведения МиниГуи в Win8.1 и WinServer 2012 В WinServer 2012 теряется модальное окно. В проге есть окно Form_0 c бровсом(таблица) и кнопкой вызова для модального окна Form_1, на неё есть кнопка вызова другого модального окна Form_2. После закрытия Form_2 на экране остаётся таблица, которую нельзя редактировать, так как модальное окно Form_1 прячется на MAIN окне. Пока не тыкнешь на MAIN окне - только тогда поднимается модальное окно Form_1 и можно дальше работать. На Win8.1 такого нет. Достаточно ли будет поставить так, чтобы убрать эту непонятку ? [pre2] .... Show_Form2() // вызов модального окна Form_2 Form_1.Restore DO EVENTS[/pre2]

SergKis: Andrey пишет Достаточно ли будет поставить так, чтобы убрать эту непонятку ? Практика показала, что нет. Когда делал менеджер запуска clipper программ по DosBox и windows программ по командам из DosBox менеджером (ShellExecuteEx), описанная тобой ситуация, под 10 и 7 была во всей красе, под 8 все отлично, как надо. BringToTop не помогали. Моя борьба с этим закончилась тем, что окно менеджера минимизирую, запускаю wvt\hmg\vo программу и по окончании их работы поднимаю окно менеджера. Все сообщения менеджера, при окне DosBox и др. раб. окон (MsgStop(), MsgBox(),...) выходили но передний план, но не в фокусе, т.е. надо доп. по ним кликать мышкой. Сделал доп. комплект этих ф-й с добавленным параметром hWnd родителя и при 0 (окно десктоп родитель) окна сообщений стали работать почти как надо, кроме первого раза. Т.е. первый раз любое окно сообщения было не в фокусе. С окнами сообщений завершил работу тем, что убрал их и стал общаться с DosBox, т.е. перенес сообщения на прогу, работающую в DosBox (bat файл). В таком виде работает стабильно.

SergKis: 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


Andrey: SergKis пишет: Если Form_2 вызываешь из под Form_1, то попробуй на Form_2 до DEFINE WINDOW ... сделать У меня в программе 2 режима вызова этого окна. 1) сразу одна кнопка вызова Show_Form2() 2) есть доп.окно Form_1 и вызов с этого окна по кнопке Show_Form2() Как мне сделать эту обработку только для режима 2 ? Т.е. там [pre2] 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 [/pre2] На втором компе проверил по удалёнке, там стоит WinServer 2008 - отлично работает, костылей не нужно.

SergKis: [pre2] 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 ... [/pre2] Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ?

Andrey: SergKis пишет: Делай для всех окон модальных, как я написал. Это привязка мод. окна к родителю. По умолчанию к main окну. Поможет ли ? А куда это вставить, модуль какой ? Вообще то меня забодало (юзеров тоже), открываешь несколько модальных окон и потом нужно дергать MAIN окно. Может это нужно сразу поставить в МиниГуи ?

SergKis: Andrey пишет А куда это вставить, модуль какой ? У тебя, как понимаю, окна в функциях. Вот в них и делаешь. Повторю на твоем примере[pre2] 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 ... [/pre2]

Andrey: SergKis пишет: Вот в них и делаешь. Повторю на твоем примере Спасибо БОЛЬШОЕ ! Буду пробовать...

SergKis: PS Можно попробовать добавить[pre2] LOCAL cWnd := ThisWindow.Name LOCAL cFocus := This.FocusedControl ... _hmg_InplaceParentHandle := hParent DoMethod(cWnd, 'SetFocus') IF ! empty(cFocus) DoMethod(cWnd, cFocus, 'SetFocus') ENDIF ... [/pre2]

Andrey: SergKis пишет: Можно попробовать добавить Поставил. Вроде нормально работает, пока юзера не жаловались...

Andrey: Всем привет - отдыхающим и работающим !!! Вопрос возник по окнам: Есть окно [pre2] 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 ....[/pre2] Это окно можно скинуть на рабочий стол и оно там находиться постоянно. Раз в 5-10 минут (в зависимости от настроек) по таймеру идёт запрос к PostgreSql и если там есть данные, то окно Form_OtvetSite.Restore и располагается повер всех окон. Всё классно работает, если на экране нет MODAL окна, если есть, то труба - сколько не жми кнопку Выход, ничего не происходит, пока окно MODAL не закроешь, доступа к кнопке Выход НЕТ ! Как исправить данную ситуацию ?

SergKis: Andrey пишет Это окно можно скинуть на рабочий стол и оно там находиться постоянно В чем смысл нахождения этого окна постоянно в работе\ожидании ? Можно проверить изменения и запустить окно modal когда надо, оно тогда всегда запустится

Andrey: SergKis пишет: В чем смысл нахождения этого окна постоянно в работе\ожидании ? Чтобы юзер увидел когда окно поднялось, что пришёл ответ от мастера (PostgreSql) и вывожу этот ответ в это окно. Юзер может отложить (скинуть на раб.стол) этот ответ и продолжить работу. Когда юзер захочет, то может вернутся к этому окну ответа.

SergKis: Andrey пишет пока окно MODAL не закроешь, доступа к кнопке Выход НЕТ ! Так и должно быть, пока модал на экране, можешь создавать модал окно, а другое будет не доступно. Чтобы юзер увидел когда окно поднялось, что пришёл ответ от мастера (PostgreSql) и вывожу этот ответ в это окно. Юзер может отложить (скинуть на раб.стол) этот ответ и продолжить работу. Когда юзер захочет, то может вернутся к этому окну ответа. Вместо поднятия создавай новое окно и имей режим создания такого окна с последними данными от Postgres/ У тебя даже все упростится в работе окон, от того, что есть сейчас

Andrey: SergKis пишет: Вместо поднятия создавай новое окно и имей режим создания такого окна с последними данными от Postgres/ У тебя даже все упростится в работе окон, от того, что есть сейчас Не совсем то... Не будет режима: отложить окно (*.Minimize) пока юзер занят другой работой. Вроде единственный вариант пока для меня проверять, есть ли окно работы у юзера с карточкой (Form_Card) и не поднимать окно ответа в этом случае. Хотя лучше бы сделать на проверку - есть ли MODAL окно на экране ? Как это можно сделать ?

SergKis: Andrey пишет Не будет режима: отложить окно (*.Minimize) пока юзер занят другой работой. По мне. Абсолютно "пустой" режим (*.Minimize), вполне можно обходится без этого висящего окна. Его можно создавать, в любой момент, когда надо или вообще вынести в программу фона, посадив в tray (работу с Postgres) Хотя лучше бы сделать на проверку - есть ли MODAL окно на экране ? Как это можно сделать ? Тип окна "M" проверь и дальше что ... ?

Andrey: SergKis пишет: Тип окна "M" проверь и дальше что ... ? Не буду поднимать окно Form_OtvetSite.Restore Нормальное решение для юзера. SergKis пишет: посадив в tray (работу с Postgres) Не знаю как трей работает с сервером-терминалов, да и обычные юзера теряются с треем, ему понятней свернутое окно программы.



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