Форум » GUI » Проблема с модальным окном MiniGUI2.4 » Ответить

Проблема с модальным окном MiniGUI2.4

alexandr11: Помогите пожалуйста. Из главного окна приложения ухожу в модальное окно. Если переключиться на другое окно (другое приложение), а потом попытаться вернуться в мое приложение, щелкнув на значке окна, то фокус получает не модальное окно (которое до того было активным), а главное окно приложения. Модальное окно становится активным только если свернуть все остальные окна. Ошибка? Как исправить?

Ответов - 17

Andrey: alexandr11 пишет: Ошибка? Как исправить? Давай отдельный пример. И под какой системой работаешь ? У меня на Win8.1 тоже есть непонятка: с главного окна вызываю CHILD окно, а потом с CHILD окна вызываю MODAL окно. переключаюсь на другое окно, потом обратно на задачу, только под модальным окном находиться MAIN окно. После выхода из MODAL окна, появляется CHILD окно. Может и правильно делается, я не знаю.....

alexandr11: работаю в WindowsXP моя проблема очень похожа на Вашу. когда активно модальное окно, внизу в панели отображается имя его родительского окна. если уйти в другое приложение, а затем щелкнуть на нем, то на экране появится не модальное окно, а родительское. притом оно не активно. в MiniGUI1.0 работало. вот очень похожий пример. поочередно активируются 3 окна. если третье - модальное, то после его закрытия фокус почему-то получает первое, при этом второе окно деактивируется. если второе окно сделать child, то оно останется на экране, но фокус все равно получит первое окно если третье окно - не модальное, то фокус ожидаемо получает второе окно #include "minigui.ch" ************************** Function Main DEFINE WINDOW SAST_1; AT 0,0 ; WIDTH 500; HEIGHT 500; TITLE "SAST_1"; MAIN DEFINE BUTTON B1 ROW 100 COL 100 WIDTH 90 HEIGHT 30 CAPTION "GOSAST_2" ACTION GOSAST_2() END BUTTON END WINDOW CENTER WINDOW SAST_1 activate window SAST_1 Return Nil ******************* FUNCTION GOSAST_2 DEFINE WINDOW SAST_2 ; AT 0,0 ; WIDTH 400 HEIGHT 400 ; TITLE "SAST_2" DEFINE BUTTON B1 ROW 100 COL 100 WIDTH 90 HEIGHT 30 CAPTION "GOSAST_3" ACTION GOSAST_3() END BUTTON END WINDOW CENTER WINDOW SAST_2 ACTIVATE WINDOW SAST_2 RETURN(.T.) ******************* FUNCTION GOSAST_3 DEFINE WINDOW SAST_3 ; AT 0,0 ; WIDTH 300 HEIGHT 300 ; TITLE "SAST_3"; MODAL END WINDOW CENTER WINDOW SAST_3 ACTIVATE WINDOW SAST_3 RETURN(.T.)

gfilatov2002: alexandr11 пишет: вот очень похожий пример Благодарю за пример. Для решения проблемы определите второе окно как дочернее (CHILD). Исправленный пример см. ниже [pre2]include "minigui.ch" ************************** Function Main DEFINE WINDOW SAST_1; AT 0,0 ; WIDTH 500; HEIGHT 500; TITLE "SAST_1"; MAIN DEFINE BUTTON B1 ROW 100 COL 100 WIDTH 90 HEIGHT 30 CAPTION "GOSAST_2" ACTION GOSAST_2() END BUTTON END WINDOW CENTER WINDOW SAST_1 activate window SAST_1 Return Nil ******************* FUNCTION GOSAST_2 DEFINE WINDOW SAST_2 ; AT 0,0 ; WIDTH 400 HEIGHT 400 ; TITLE "SAST_2" ; CHILD DEFINE BUTTON B1 ROW 100 COL 100 WIDTH 90 HEIGHT 30 CAPTION "GOSAST_3" ACTION GOSAST_3() END BUTTON END WINDOW CENTER WINDOW SAST_2 ACTIVATE WINDOW SAST_2 RETURN(.T.) ******************* FUNCTION GOSAST_3 DEFINE WINDOW SAST_3 ; AT 0,0 ; WIDTH 300 HEIGHT 300 ; TITLE "SAST_3"; MODAL END WINDOW CENTER WINDOW SAST_3 ACTIVATE WINDOW SAST_3 RETURN(.T.)[/pre2]


alexandr11: gfilatov2002 пишет: Для решения проблемы определите второе окно как дочернее (CHILD). я об этом писал. при закрытии третьего окна второе окно остается, но фокус получает первое окно а вот при переходе в другое приложение и обратно - полностью помогло (видимо по причине того, что первое окно я прячу HIDE) спасибо!

Andrey: Непонятка у меня с моим модальным окном. Добавил в свой проект новую форму из другого проекта. Теперь при попытке его открыть - выходит ошибка: Error MGERROR/0 Non Modal Window Form_Spr can't be activated when a Modal window is active. Program terminated. Called from MSGMINIGUIERROR(91) Called from _ACTIVATEWINDOW(1356) Called from DOMETHOD(4677) Called from FORM_SPRAVKI(428) В предыдущем проекте эта форма работала, а после добавления в большой проект не работает.... ........... ON MAXIMIZE { || ResizeSprBrowse() } ; CHILD ; NOMINIMIZE NOSYSMENU Может быть из-за того что вызываю из меню с окном МODAL ? Как перевести и исправить эту ошибку ?

PSP: Andrey пишет: Как перевести "Немодальное окно Form_Spr не может быть активировано, когда (пока) активно модальное окно"

Andrey: PSP пишет: "Немодальное окно Form_Spr не может быть активировано, когда (пока) активно модальное окно" Т.е. нельзя после MODAL-окна вызывать другие окна ? А как тогда можно делать ?

alexandr11: если не ошибаюсь, обходил такую проблему в MiniGUI 1.0 попробуйте спрятать модальное окно (hide), затем активировать второе, а после его закрытия вернуться в первое (restore) также в MiniGUI 1.0 использовал следующее: есть переменная _HMG_IsModalActive. перед активацией второго модального окна присваиваем ей значение .F. а после его закрытия - .T. возможно, в каком-то случае возникнут ошибки, но у меня все работает

Andrey: alexandr11 пишет: перед активацией второго модального окна присваиваем ей значение .F. а после его закрытия - .T. Спасибо БОЛЬШОЕ ! То что нужно !

Andrey: Andrey пишет: У меня на Win8.1 тоже есть непонятка: с главного окна вызываю CHILD окно, а потом с CHILD окна вызываю MODAL окно. переключаюсь на другое окно, потом обратно на задачу, только под модальным окном находиться MAIN окно. После выхода из MODAL окна, появляется CHILD окно. Может и правильно делается, я не знаю..... Вот с этим я так и не разобрался до сих пор. Как это исправить ? 1) с главного окна вызываю доп.окно (без указания CHILD) ( а какое это окно тогда по умолчанию ? ) IF !IsWindowActive( Form_Config ) DEFINE WINDOW Form_Config ; BACKCOLOR aBackColor ; NOMAXIMIZE NOSIZE ; ON INIT MyInitConfig() .............. END WINDOW ............... ELSE // !IsWindowActive( Form_Config ) SwitchToWin( "Form_Config" ) // переключить на форму ENDIF // !IsWindowActive( Form_Config ) 2) c этого окна вызываю CHILD окно. Под ним появляется MAIN окно... Почему ? При закрытии CHILD окна появляется доп.окно ! Непорядок....

SergKis: Andrey используй стек для окон (как делали в clipper). в init window добавляешь окно в стек а в release window удаляешь последний элемент (свое окно) и ставь фокус принудительно на получившийся последний. (в стеке можно с контролом хранить на который устанавливаться фокусом)

Andrey: Я понял эту идею. Меня не устраивает то что при переходе в CHILD окно под ним устанавливается MAIN . Почему ? Т.е. тогда мне самому нужно переключать окно в ON INIT (окна CHILD) на доп.окно ?

SergKis: Andrey пишет:Т.е. тогда мне самому нужно переключать окнами придется управлять тебе самому, нравится это тебе или нет. окна надо скрывать, разрушать и создавать снова, оставляя видимыми, например 1-2 последних child + modal, а остальные hide или release

Andrey: SergKis пишет: окнами придется управлять тебе самому Понял. Спасибо !

Andrey: Переделал (поставил CHILD в создании окна/до этого не было), помогло... Всё замечательно теперь. Только если окно уже открыто и под другими программами, то не переключаются вообще... В проге поставил, что Григорий давал: IF !IsWindowActive( Form_Spr ) ..... ACTIVATE WINDOW Form_Spr // показываем форму ELSE // !IsWindowActive( Form_Spr ) SwitchToWin( "Form_Spr" ) // переключить на форму ENDIF // !IsWindowActive( Form_Spr ) *----------------------------------- Function SwitchToWin( cForm ) *----------------------------------- If _IsWindowDefined( cForm ) If IsIconic( GetFormHandle(cForm) ) _Restore( GetFormHandle(cForm) ) Else DoMethod( cForm, "SetFocus" ) EndIf EndIf Return Nil

SergKis: Andrey пишет:то не переключаются вообще. попробуй SetProperty(cForm,"Topmost", .T.)

Andrey: SergKis пишет: попробуй SetProperty(cForm,"Topmost", .T.) Заработало ! Ура ! Спасибо !!!



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