| Автор | Сообщение |
|
|
| постоянный участник
|
Пост N: 8007
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.07.25 18:36. Заголовок: Почему MAIN окно вылазит на передний план, перед STANDART окном ?
Так и не понял как победить данную проблему. До сих пор у меня в большой системе такое же твориться... Открыто STANDART окно, делаем вычисления и выводим на экран. Выходит на передний план MAIN окно и потом AlertInfo() !!! Как убрать MAIN окно ? 
|
 |

|
|
Ответов - 15
[только новые]
|
|
|
|
| постоянный участник
|
Пост N: 4782
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.07.25 22:38. Заголовок: Andrey пишет На окн..
Andrey пишет На окнах standard сделал так (выделил из события 3 AlertInfo(...) в отдельное событие 10 и вызов _wPost(10,, ky)), произошла обработка событий очереди и все нормализовалось :Event( 3, {|ow,ky,cn| SET WINDOW THIS TO ow:Name ky := Table_W(ow, cn) SET WINDOW THIS TO ow:Enabler(cn, .T.) ow:SetFocus(ow:Cargo:cFocus) _wPost(10, , ky) Return Nil }) :Event(10, {|ow,ky,arr| Local cMsg := "Selected: ;" Local lEsc := !Empty(ow:Cargo:lEscape) Local aRez := ow:Cargo:aRezult ky := iif( IsArray(arr), Len(arr), 0 ) cMsg += "1 - records: "+cValToChar(ky) + ";" cMsg += "2 - records: "+cValToChar(Len(aRez)) IF lEsc ; cMsg += ";3 - press key ESCAPE !" ENDIF SET WINDOW THIS TO ow:Name _HMG_InplaceParentHandle := ow:Handle AlertInfo(cMsg) _HMG_InplaceParentHandle := 0 SET WINDOW THIS TO ow:SetFocus(ow:Cargo:cFocus) Return Nil })
|
 |

|
|
|
| постоянный участник
|
Пост N: 8008
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.25 16:20. Заголовок: SergKis пишет: На о..
SergKis пишет: | цитата: | | На окнах standard сделал так (выделил из события 3 AlertInfo(...) в отдельное событие 10 и вызов _wPost(10,, ky)) |
| А в самой функции HMG_Alert(...) модуль h_alert.prg это сделать нельзя ? Почему простой вызов функции нужно усложнять костылями ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4783
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.07.25 17:39. Заголовок: Andrey пишет Почему ..
Andrey пишет | цитата: | | Почему простой вызов функции нужно усложнять костылями ? |
| Тогда тебе на консоль окна надо, там действительно об очереди событий думать не надо. В коде выше, разделили работу обработчика событий на 2-е части и между ними выполнили цикл ожидания работы обработчика, который отработал с событиями первого (и др. окон) окна ky := Table_W(ow, cn), включая фокусы и тд. и т.п. (если ловить события WM_..., удивишься как их много, а ты их сам не вызывал) и потом перешли к работе Alert* события 10. Если делать твой код под main, modal окнами, то разбиения на 2-а события не требуется, думаю, это особенность поведения окна standard - это надо понимать и учитывать в работе
|
 |

|
|
|
| постоянный участник
|
Пост N: 8009
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.07.25 18:53. Заголовок: Вариант другой - окн..
Вариант другой - окно MODAL с ТСБ, вызываем окно редактирования мемо-поля. Опять MAIN окно лезет на передний план. Вот вариант как такое исправить: FUNCTION CellEditMemo(uVal, oBrw) // создать окно редактирования memo LOCAL oWnd := _WindowObj(oBrw:cParentWnd) LOCAL lMod := _HMG_IsModalActive LOCAL hMod := _HMG_ActiveModalHandle LOCAL hMain := _HMG_MainHandle ..... _HMG_MainHandle := oWnd:Handle // делаем нужное окно (MODAL) родителем окна _HMG_IsModalActive := .F. _HMG_ActiveModalHandle := 0 DEFINE WINDOW &cForm AT nY + nHCell, nX-5 CLIENTAREA nW-5, nH ; MINWIDTH 150 MINHEIGHT 150 ; CHILD NOSYSMENU NOCAPTION BACKCOLOR RED ; FONT cFont SIZE nFSize ; ON SIZE {|| ResizeMemoForm( This.Cargo ) } ; ON INIT {|| _wPost(0) } ; ON RELEASE _wSend(90) ..... END WINDOW ACTIVATE WINDOW &cForm _HMG_IsModalActive := lMod _HMG_ActiveModalHandle := hMod _HMG_MainHandle := hMain // восстановим MainHandle RETURN NIL
|
 |

|
|
|
| постоянный участник
|
Пост N: 4785
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.07.25 22:23. Заголовок: Andrey пишет _HM..
Andrey пишет | цитата: | _HMG_IsModalActive := .F. _HMG_ActiveModalHandle := 0 |
| Что будет в ситуации 2х modal окон + child с MemoEdit, с него можно попасть на 1е modal окно кликом мышки ? Что будет в ситуации stndard + modal + child с MemoEdit, с него можно попасть на standard окно кликом мышки ? При наличии модальных окон как родителя\владельца, по мне, может выступать только modal окно, иначе парадигма окон рушится. Проверь. Лучше добавить в твой код анализ IF oWnd:Type == "M" -> DEFINE WINDOW &cForm ... MODAL ... ELSE -> DEFINE WINDOW &cForm ... CHILD ... _HMG_MainHandle нужено всегда заполнять\восстанавливать, как у тебя, другие _HMG_... будут не нужны
|
 |

|
|
|
| постоянный участник
|
Пост N: 8010
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.07.25 22:43. Заголовок: SergKis пишет: Что ..
SergKis пишет: | цитата: | | Что будет в ситуации stndard + modal + child с MemoEdit, с него можно попасть на standard окно кликом мышки ? |
| Проверил ! Нет выхода за окно CHILD ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8014
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.08.25 12:58. Заголовок: Вариант другой - окн..
Вариант другой - окно STANDART с ТСБ, вызываем любой Alert***() Опять MAIN окно лезет на передний план. Как от этого избавиться, чтобы при любом вызове Alert***() в этом окне оставаться на окне STANDART ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8015
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.08.25 13:20. Заголовок: Сделал так: LOCAL..
Сделал так: LOCAL hMain := _HMG_MainHandle .... DEFINE WINDOW &cForm AT nY,nX WIDTH nW-nX HEIGHT nH ; WINDOWTYPE STANDARD TOPMOST NOMAXIMIZE NOSIZE ; _HMG_MainHandle := This.Handle // делаем это окно родителем окна _HMG_Main ..... END WINDOW ACTIVATE WINDOW &cForm _HMG_MainHandle := hMain // восстановим MainHandle RETURN Срабатывает, но не всегда ! Как сделать 100% срабатывание ? Почему нельзя в код Alert***() сделать вывод на текущее окно, если оно есть ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8017
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.08.25 12:21. Заголовок: Ещё одна загадка с M..
Ещё одна загадка с MAIN окном. Если при старте программы окно MAIN делаем его без показа NOSHOW, то потом другие окна тоже не показываются на экране. Вот здесь НЕТ показа окна загрузки баз: :Event( 0, {|ow| // ON INIT Local lRet, aMsg, cw, nMsg := 100 aMsg := { "Opening databases!", "Configuring tables and reports!", App.Exename } cw := WaitWindow(aMsg, .T., 600, 16, NIL, WHITE, MAROON ) <<<------ DoMethod( cw, "Minimize" ) ; DO EVENTS DoMethod( cw, "Restore" ) ; DO EVENTS lRet := Set_DataBase_Tsb_Open() wApi_Sleep(1000*3) WaitWindow() IF !lRet AlertStop("The database is not open !") nMsg := 99 ENDIF _wPost(nMsg, ow:Name) // check for semaphore file presence Return Nil }) Почему так происходит ? Как исправить ? 
|
 |

|
|
|
| |
Пост N: 102
Зарегистрирован: 18.06.15
|
|
Отправлено: 14.08.25 12:56. Заголовок: Andrey Andrey пишет:..
Andrey Andrey пишет: | цитата: | | при старте программы окно MAIN делаем его без показа NOSHOW, то потом другие окна тоже не показываются на экране |
| Я с этой проблемой, как и с подобными другими, столкнулся гораздо раньше. Вернулся к версия Расширенного релиза библиотеки MiniGUI ориентировочно на конец 2023 года. Все заработало нормально, после этого перестал устанавливать все обновления.
|
 |

|
|
|
| постоянный участник
|
Пост N: 4788
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.08.25 18:57. Заголовок: Andrey пишет Почему ..
Andrey пишет | цитата: | | Почему так происходит ? Как исправить ? |
| Возможно потому, что используемый вариант WaitWindow делает окно CHILD. Если использовать вариант WaitWindow с MODAL окном, то все отработает как надо Скрытый текст
:Event( 0, {|ow| Local nMsg := 100 Local cMsg := App.ExeName + ";Opening databases!;" + ; "Configuring tables and reports!" Local bOpn := {|| Local ow := _WindowObj( _HMG_MainHandle ) ow:Cargo:lOpen := Set_DataBase_Tsb_Open() InkeyGui(3000) ThisWindow.Release Return Nil } ow:Cargo:lOpen := .F. WaitWindow( cMsg, bOpn, 600, 16, NIL, WHITE, MAROON ) EnableWindow( ow:Handle ) IF !ow:Cargo:lOpen AlertStop("The database is not open !") nMsg := 99 ENDIF _wPost(nMsg, ow:Name) Return Nil }) ... STATIC FUNCTION Set_DataBase_Tsb_Open() LOCAL cDbf, cAls, lRet, lErr, aUse := {}, a LOCAL cPth := App.Cargo:cPathDbf LOCAL aDbf := App.Cargo:aFileDbf FOR EACH a IN aDbf cDbf := a[1] cAls := a[2] lErr := .T. BEGIN SEQUENCE WITH {|e| break( e ) } USE ( cPth + cDbf ) ALIAS ( cAls ) NEW SHARED IF Used() ; AAdd( aUse, .T. ) ; lErr := .F. ENDIF END SEQUENCE IF lErr ; ? hb_enumindex(a), cAls, cPth + cDbf, "Not used !" ENDIF NEXT lRet := Len(aUse) == Len(aDbf) RETURN lRet
| Alex_Cher пишет | цитата: | | Вернулся к версия Расширенного релиза библиотеки MiniGUI ориентировочно на конец 2023 года. |
| Если в нее (версию 23.12) внести изменения по WaitWindow(), то тоже отработает такой вариант
|
 |

|
|
|
|
|
| постоянный участник
|
Пост N: 8018
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.08.25 14:36. Заголовок: SergKis пишет: Возм..
SergKis пишет: | цитата: | Возможно потому, что используемый вариант WaitWindow делает окно CHILD. Если использовать вариант WaitWindow с MODAL окном, то все отработает как надо |
| Спасибо БОЛЬШОЕ ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8132
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.12.25 16:38. Заголовок: Поймал у себя в боль..
Поймал у себя в большой системе ситуацию, когда главное окно "висит" - т.е. оно на экране, а на нём ничего нельзя нажать, окно наверное заблокировано. Т.е. цепочка по окнам такая: MAIN NOSHOW ... MsgDebug() ... AlertStop() ... Form_Main.Show и висим... Как избавиться от этого ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4864
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.12.25 17:40. Заголовок: EnableWindow( Form_M..
EnableWindow( Form_Main.Handle )
|
 |

|
|
|
| постоянный участник
|
Пост N: 8134
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.12.25 10:42. Заголовок: Переделываю свою бол..
Переделываю свою большую прогу - избавляюсь от MAIN окна на переднем плане. Не понимал раньше правило hmg - схему с модальными окнами. Теперь, спустя столько лет... дошло...  Спасибо Сергею ! Вот небольшой пример, может кому будет интересно ! Было: DEFINE WINDOW &cForm AT nY,nX WIDTH nW-nX HEIGHT nH ; WINDOWTYPE STANDARD TOPMOST NOMAXIMIZE NOSIZE ; ON INIT {|| MyInitCalc(cFont,nFontSize,cSiteMsg,oBrw) ,; aDbfIndex := Base_Part_IndexSave(0) } ; // запомним индексы ON RELEASE {|| SetWaitCursor(Thiswindow.Handle) , SetCursorSystem( IDC_WAIT ), ; Base_Part_IndexRest(aDbfIndex,0) ,; // восстановим индексы SetArrowCursor( Thiswindow.Handle ), SetCursorSystem( IDC_ARROW ) ,; Domethod(cFormMain,"Restore") } // возврат на главное окно ..... MenuButton1() // меню кнопки 1 MenuButton2() // меню кнопки 2 ..... MenuButton8() // меню кнопки 8 ..... END WINDOW ACTIVATE WINDOW &cForm Переделал - избавился от MAIN окна которое лезло на передний план после любого AlertStop() !!! Стало так: LOCAL hMain := _HMG_MainHandle // -->> (1!!!) запомним хендл главного окна .... DEFINE WINDOW &cForm AT nY,nX WIDTH nW-nX HEIGHT nH ; WINDOWTYPE STANDARD TOPMOST NOMAXIMIZE NOSIZE ; ON INIT {|| aDbfIndex := MyInitCalc(cFont,nFontSize,cSiteMsg,oBrw) } ; ON RELEASE {|| SetWaitCursor(Thiswindow.Handle) , SetCursorSystem( IDC_WAIT ), ; Base_Part_IndexRest(aDbfIndex,0) ,; // восстановим индексы SetArrowCursor( Thiswindow.Handle ), SetCursorSystem( IDC_ARROW ) ,; Domethod(cFormMain,"Restore") } // возврат на главное окно @ 0,0 LABEL Buff .... _HMG_MainHandle := This.Handle // -->> (2!!!) делаем это окно родителем окна _HMG_Main ..... MenuButton1() // меню кнопки 1 MenuButton2() // меню кнопки 2 ..... MenuButton8() // меню кнопки 8 ..... END WINDOW ACTIVATE WINDOW &cForm _HMG_MainHandle := hMain // -->> (3!!!) восстановим MainHandle RETURN FUNCTION MyInitCalc(...) ... Local lIsModal := _HMG_IsModalActive // -->> (4!!!) это для Modal окон Local cForm := ThisWindows.Name SET WINDOW THIS TO cForm // ставим и сохраняем this среду окна cForm _HMG_IsModalActive := .T. // -->> (5!!!) //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // это для Modal окон, ставит режим работы, тогда фокус с Modal окна // не уходит при клике мышкой на др. окне //далее будет модал окно вызвано и работать AlertStop(....) aDbfIndex := Base_Part_IndexSave(0) // ставить здесь !!! ... _HMG_IsModalActive := lIsModal // -->> (6!!!) это для Modal окон AEval(HMG_GetForms(,.T.), {|oo| EnableWindow(oo:Handle) }) // -->> (7!!!) Устранить потерю фокуса для Windows SET WINDOW THIS TO // восстанавливаем this среду окна которое было сохранено для работы командами This.Buff.Setfocus // можно теперь исп. this среду т.к. восстановили ее DO EVENTS Return aDbfIndex
|
 |

|
|