Страница 1 из 1
Опять про всплывающие окна ...
Добавлено: 07 Декабрь 2005, 9:01
Игорь Столяров
Привет всем !
Хочу поднять старую тему, хотя она уже вроде не раз обсуждалась.
Среда - C62 9049 ABC. Задача все таже - в интерфейсе MDI проверять, было ли открыто уже окно и если ДА, то просто заставить его всплыть наверх, т.е. передать на него фокус. Вроде все просто и понятно, при запуске процесса запоминаем номер потока:
Glo:OneProcess = Start(Browse,25000)
При попытке повторного запуска передаем в поток событие:
Post(Event:GainFocus,,Glo:OneProcess)
Событие в поток приходит - но окно упорно не хочет "всплывать" наверх. Да и если разобраться, то Event:GainFocus - это событие КОГДА окно получает фокус. А как заставить окно получить этот фокус ? Moжет быть есть, что вроде Event:WindowsOnTop ? Чувствую, что запутался в элементарном - заранее спасибо за подсказку !
Добавлено: 07 Декабрь 2005, 9:04
StillZero
на GainFocus повесить надо
Код: Выделить всё
IF SELF.Opened
IF 0{PROP:Iconize}=TRUE
0{PROP:Iconize}=FALSE
END
IF 0{PROP:Active}<>TRUE
0{PROP:Active}=TRUE
END
END
см. ABCFree -рулят
Re: Опять про всплывающие окна ...
Добавлено: 07 Декабрь 2005, 9:11
Andrew™
Игорь Столяров писал(а):Привет всем !
Хочу поднять старую тему, хотя она уже вроде не раз обсуждалась.
Среда - C62 9049 ABC. Задача все таже - в интерфейсе MDI проверять, было ли открыто уже окно и если ДА, то просто заставить его всплыть наверх, т.е. передать на него фокус. Вроде все просто и понятно, при запуске процесса запоминаем номер потока:
Glo:OneProcess = Start(Browse,25000)
При попытке повторного запуска передаем в поток событие:
Post(Event:GainFocus,,Glo:OneProcess)
Событие в поток приходит - но окно упорно не хочет "всплывать" наверх. Да и если разобраться, то Event:GainFocus - это событие КОГДА окно получает фокус. А как заставить окно получить этот фокус ? Moжет быть есть, что вроде Event:WindowsOnTop ? Чувствую, что запутался в элементарном - заранее спасибо за подсказку !
всё проще, я делаю так
Код: Выделить всё
для определённой процедуры завожу глобальную не THREAd переменную, например Thread_Proc1
в начале оконной процедуры, после CODE:
IF Thread_Proc1
POST(EVENT:User,,Thread_Proc1)
POPBIND
RETURN
END
Thread_Proc1 = THREAD()
с конце процедуры
Thread_Proc1 = 0
обработка EVENT:User
Window{PROP:Active} = True
усё!
почему не на EVENT:GainFocus, да потому что на нём навешано много логики, например, все Browse перечитываются, а это тебе надо?
Добавлено: 07 Декабрь 2005, 9:11
Игорь Столяров
Большое спасибо - все OK !
Re: Опять про всплывающие окна ...
Добавлено: 24 Август 2012, 3:29
mike_ch
Почти 7 лет прошло как тема закрыта

. Хочу поднять.
Передача управления окну срабатывает, но если окно было свернуто и после 0{PROP:Iconize}=FALSE восстановлено в размерах - TOOLBAR не обновляется. TOOLBAR отобразиться только после нажатия на заголовок окна, что вообще неудобно. Желательно сразу. Что делать? Clarion 8.
Re:
Добавлено: 25 Август 2012, 0:54
muskin
StillZero писал(а):на GainFocus повесить надо
Код: Выделить всё
IF SELF.Opened
IF 0{PROP:Iconize}=TRUE
0{PROP:Iconize}=FALSE
END
IF 0{PROP:Active}<>TRUE
0{PROP:Active}=TRUE
END
END
см. ABCFree -рулят
Аналогичный код использую давно и никаких проблем. Если бы
StillZero напомнил, как эту ситуацию применить к запущенной App (я имею ввиду передачу фокуса на уже запущенное приложение), я ему СКАЖУ...(см. ниже) .
Re: Опять про всплывающие окна ...
Добавлено: 27 Август 2012, 10:42
Yufil
Самый тупой и ленивый способ - поднять в головном окне DDE-сервер.
Client# = DDEServer('MyProgram',...)
If Client#<>0
DDEExecute(Client#,....) ! Какой-то сигнал
Return
End
Server# = DDEServer('MyProgram',....)
Ну и обработка события
Of Event:DDEExecute
0{Prop:Active} = True
....
Работает...
Re: Опять про всплывающие окна ...
Добавлено: 30 Август 2012, 21:14
muskin
Да, спасибо, работает.
Re: Опять про всплывающие окна ...
Добавлено: 03 Сентябрь 2012, 10:15
Yufil
Естественно, в первой строчке вместо DDEServer надо читать DDEClient