Страница 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