On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 8007
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.07.25 18:36. Заголовок: Почему MAIN окно вылазит на передний план, перед STANDART окном ?


Так и не понял как победить данную проблему.
До сих пор у меня в большой системе такое же твориться...

Открыто STANDART окно, делаем вычисления и выводим на экран.
Выходит на передний план MAIN окно и потом AlertInfo() !!!
Как убрать MAIN окно ?



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 15 [только новые]


постоянный участник




Пост N: 4782
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.07.25 22:38. Заголовок: Andrey пишет На окн..


Andrey пишет
 цитата:
Как убрать MAIN окно ?


На окнах 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
})


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8008
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.25 16:20. Заголовок: SergKis пишет: На о..


SergKis пишет:

 цитата:
На окнах standard сделал так (выделил из события 3 AlertInfo(...) в отдельное событие 10 и вызов _wPost(10,, ky))


А в самой функции HMG_Alert(...) модуль h_alert.prg это сделать нельзя ?
Почему простой вызов функции нужно усложнять костылями ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 - это надо понимать и учитывать в работе

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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_... будут не нужны

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8010
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.07.25 22:43. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что будет в ситуации stndard + modal + child с MemoEdit, с него можно попасть на standard окно кликом мышки ?


Проверил ! Нет выхода за окно CHILD !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8014
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.08.25 12:58. Заголовок: Вариант другой - окн..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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***() сделать вывод на текущее окно, если оно есть ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
})

Почему так происходит ? Как исправить ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 102
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 14.08.25 12:56. Заголовок: Andrey Andrey пишет:..


Andrey Andrey пишет:

 цитата:
при старте программы окно MAIN делаем его без показа NOSHOW, то потом другие окна тоже не показываются на экране



Я с этой проблемой, как и с подобными другими, столкнулся гораздо раньше. Вернулся к версия Расширенного релиза библиотеки MiniGUI ориентировочно на конец 2023 года.
Все заработало нормально, после этого перестал устанавливать все обновления.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4788
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.08.25 18:57. Заголовок: Andrey пишет Почему ..


Andrey пишет
 цитата:
Почему так происходит ? Как исправить ?


Возможно потому, что используемый вариант WaitWindow делает окно CHILD.
Если использовать вариант WaitWindow с MODAL окном, то все отработает как надо
Скрытый текст

Alex_Cher пишет
 цитата:
Вернулся к версия Расширенного релиза библиотеки MiniGUI ориентировочно на конец 2023 года.


Если в нее (версию 23.12) внести изменения по WaitWindow(), то тоже отработает такой вариант

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8018
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.08.25 14:36. Заголовок: SergKis пишет: Возм..


SergKis пишет:

 цитата:
Возможно потому, что используемый вариант WaitWindow делает окно CHILD.
Если использовать вариант WaitWindow с MODAL окном, то все отработает как надо


Спасибо БОЛЬШОЕ !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8132
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.12.25 16:38. Заголовок: Поймал у себя в боль..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4864
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.12.25 17:40. Заголовок: EnableWindow( Form_M..


EnableWindow( Form_Main.Handle )

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет