Опять про всплывающие окна ...

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Опять про всплывающие окна ...

Сообщение Игорь Столяров »

Привет всем !

Хочу поднять старую тему, хотя она уже вроде не раз обсуждалась.
Среда - C62 9049 ABC. Задача все таже - в интерфейсе MDI проверять, было ли открыто уже окно и если ДА, то просто заставить его всплыть наверх, т.е. передать на него фокус. Вроде все просто и понятно, при запуске процесса запоминаем номер потока:

Glo:OneProcess = Start(Browse,25000)

При попытке повторного запуска передаем в поток событие:

Post(Event:GainFocus,,Glo:OneProcess)

Событие в поток приходит - но окно упорно не хочет "всплывать" наверх. Да и если разобраться, то Event:GainFocus - это событие КОГДА окно получает фокус. А как заставить окно получить этот фокус ? Moжет быть есть, что вроде Event:WindowsOnTop ? Чувствую, что запутался в элементарном - заранее спасибо за подсказку !
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Сообщение 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 -рулят
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Опять про всплывающие окна ...

Сообщение 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 перечитываются, а это тебе надо?

Последний раз редактировалось Andrew™ 07 Декабрь 2005, 9:11, всего редактировалось 1 раз.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7373
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Сообщение Игорь Столяров »

Большое спасибо - все OK !
mike_ch
Бывалый
Сообщения: 62
Зарегистрирован: 11 Июль 2007, 14:21
Откуда: Беларусь, Минск

Re: Опять про всплывающие окна ...

Сообщение mike_ch »

Почти 7 лет прошло как тема закрыта :). Хочу поднять.
Передача управления окну срабатывает, но если окно было свернуто и после 0{PROP:Iconize}=FALSE восстановлено в размерах - TOOLBAR не обновляется. TOOLBAR отобразиться только после нажатия на заголовок окна, что вообще неудобно. Желательно сразу. Что делать? Clarion 8.
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

Re:

Сообщение 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 (я имею ввиду передачу фокуса на уже запущенное приложение), я ему СКАЖУ...(см. ниже) .
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Опять про всплывающие окна ...

Сообщение Yufil »

Самый тупой и ленивый способ - поднять в головном окне DDE-сервер.
Client# = DDEServer('MyProgram',...)
If Client#<>0
DDEExecute(Client#,....) ! Какой-то сигнал
Return
End

Server# = DDEServer('MyProgram',....)
Ну и обработка события
Of Event:DDEExecute
0{Prop:Active} = True
....

Работает...
Аватара пользователя
muskin
Активист
Сообщения: 114
Зарегистрирован: 08 Декабрь 2009, 21:16
Откуда: РК

Re: Опять про всплывающие окна ...

Сообщение muskin »

Да, спасибо, работает.
Всем пралитарское Спасибо и 'Желаю, чтобы ВСЕ !!!'
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Опять про всплывающие окна ...

Сообщение Yufil »

Естественно, в первой строчке вместо DDEServer надо читать DDEClient
Ответить