ToolBox покоя не дает.
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Не подскажет ли кто пару-тройку простых, по всей видимости для многих, вещей?
Иметься:
1. Main (Frame) окно. В нем, помимо всего прочего, есть пункт меню «Свернуть в трэй». Из Main запускается:
2. MyBrowse. Из него кодом: loc:ToolBoxThread = Start(MyToolBox,25000) запускается:
3. панель инструментов MyToolBox, в котором иметься ToolBoxBrowse, который фильтруется исходя из значений выбранных перемещением по списку MyBrowse (передается через Glo:Kod)
Вопросы:
1. Как, при перемещении курсора в MyBrowse перерисовывать ToolBoxBrowse? Glo:Kod поменялся, но в MyToolBox этого не видно. Если же отслеживать по таймеру, но заметны задержки, от которых хотелось бы уйти.
2. Надо из MyBrowse закрыть MyToolBox. Наверное, как-нибудь через Post(Event:…, а то через таймер тормозит.
3. Надо из Main, при его сворачивании в трэй, свернуть, или хотя бы закрыть MyToolBox. Даже по таймеру у меня не получается. Устанавливаю Glo:Kod = 0 в Embed пункта меню «свернуть в трэй», главное окно сворачивается, а Glo:Kod так и остался при прежнем значении, соответственно и MyToolBox осталось висеть на экране.  Может быть как-нибудь по-иному?
Вот, собственно, и все вопросы. Если это реализовано в примерах, тоже ничего, надеюсь – разберусь.
Да, С55, АВС
Спасибо.
Иметься:
1. Main (Frame) окно. В нем, помимо всего прочего, есть пункт меню «Свернуть в трэй». Из Main запускается:
2. MyBrowse. Из него кодом: loc:ToolBoxThread = Start(MyToolBox,25000) запускается:
3. панель инструментов MyToolBox, в котором иметься ToolBoxBrowse, который фильтруется исходя из значений выбранных перемещением по списку MyBrowse (передается через Glo:Kod)
Вопросы:
1. Как, при перемещении курсора в MyBrowse перерисовывать ToolBoxBrowse? Glo:Kod поменялся, но в MyToolBox этого не видно. Если же отслеживать по таймеру, но заметны задержки, от которых хотелось бы уйти.
2. Надо из MyBrowse закрыть MyToolBox. Наверное, как-нибудь через Post(Event:…, а то через таймер тормозит.
3. Надо из Main, при его сворачивании в трэй, свернуть, или хотя бы закрыть MyToolBox. Даже по таймеру у меня не получается. Устанавливаю Glo:Kod = 0 в Embed пункта меню «свернуть в трэй», главное окно сворачивается, а Glo:Kod так и остался при прежнем значении, соответственно и MyToolBox осталось висеть на экране.  Может быть как-нибудь по-иному?
Вот, собственно, и все вопросы. Если это реализовано в примерах, тоже ничего, надеюсь – разберусь.
Да, С55, АВС
Спасибо.
- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
1. Попробуй просто в ToolBoxBrowse в настройках добавить GLO:Kod в ResetFields - это список полей при изменении которых должна быть перерисовка(Re-Set) брауза1. Как, при перемещении курсора в MyBrowse перерисовывать ToolBoxBrowse?
2. Если не проканает можно постить Event в известный тебе поток.
Делается примерно так:
в глобалах заведи свое событие
Код: Выделить всё
EVENT:ToolboxRedraw EQUATE(EVENT:User+1)
Код: Выделить всё
POST(EVENT:ToolboxRedraw,,loc:ToolBoxThread)
Код: Выделить всё
of EVENT:ToolboxRedraw
BRWxxx.ResetQueue(Reset:Queue)
! или ThisWindow.Reset(TRUE) или BRWxxx.ResetSort() и т.п.
удачи
Написал: PAA(27)
Огромное спасибо за столь оперативную помощь!
Почти что все получилось. Получилось закрывать ToolBox из MyBrowse и из Main, и даже (немного не так, как планировалось) мгновенно перестраивать таблицу в ToolBox при перемещении по таблице в MyBrowse. Как и советывалось, в TakeNewSelection Browse MyBrowse был прописан код:
Glo:Kod = MB:Kod
POST(EVENT:ToolboxRedraw,,GLO:ToolBoxThread)
а в процедуре ToolBox в Embeds->Control Events->?Browse:1->All Events->перед генерацией года был и вставлено:
OF EVENT:ToolboxRedraw
loc:Kod = Glo:Kod
IF Glo:Kod <> loc:Kod
BRW1.ResetSort(True)
End
Так вот, при таком раскладе не то что не работает, но и иметься такое подозрение, что сюда даже и не заглядывается. Может не туда был вставлен этот код? Вот если MyToolBoxBrowse фильтровать не по loc:kod a по Glo:Kod, то все работает. Что не так?
А дальше – хуже. Вернее – интереснее!
Хотелось бы, что бы этот самый тулбокс прилип намертво (или почти намертво) к Main. И при перемещении последнее, неотрывно следовал за ним. Логически я думал поступить так. Если совсем красиво, то даже не знаю как (зацепили мышкой главный фрэйм, чуть переместили, но мышку не отпустили, и тулбокс переместился), а если не очень, то: переместили главное окно – где-то в нем отловили этот процесс (окно перемещено), послали сообщение тулхоксу – оно приклеилось на прежнее место. Но так как я не нашел, где это самое событие в главном окне отловить, то пошел по иному пути (по всей видимости не самому лучшему, зато простому). На тулбоксе поставил таймер в 50 и написал в Windows Events->Timer:
IF ThisWindow{PROP:XPos} <> Xpos# or ThisWindow{PROP:YPos} <> YPos#
ThisWindow{PROP:XPos} = XPos#
ThisWindow{PROP:YPos} = YPos#
end
Все работает, но вопрос, а есть ли смысл дергать процессор каждые полсекунды на это?
Но и это еще не все!
При запуске тулбокса кодом:
GLO:ToolBoxThread = Start(ToolBow,25000)
Фокус перемещается на тулбокс и обратно не возвращаеться. А это, в моем случае, печально. В окне ToolBox галочка ToolBox поставлена. Где копать?
Ну и последнее:
Сворачиваю главное окно Main в трэй:
ThisWindow{PROP:Iconize} = True
при этом посылаю тулбоксу сообщение стать невидимым:
Settarget(,GLO:ToolBoxThread)
0{PROP:Hide} = True
Settarget()
Все ок.
Затем вызываю программу из трэя. Вопрос, где отловить это событие, что бы опять сделать тулбокс видимым? По OpenWindow, GainFocus не получается. Тогда где?
Заранее благодарен и жду - не дождусь ответов!
Почти что все получилось. Получилось закрывать ToolBox из MyBrowse и из Main, и даже (немного не так, как планировалось) мгновенно перестраивать таблицу в ToolBox при перемещении по таблице в MyBrowse. Как и советывалось, в TakeNewSelection Browse MyBrowse был прописан код:
Glo:Kod = MB:Kod
POST(EVENT:ToolboxRedraw,,GLO:ToolBoxThread)
а в процедуре ToolBox в Embeds->Control Events->?Browse:1->All Events->перед генерацией года был и вставлено:
OF EVENT:ToolboxRedraw
loc:Kod = Glo:Kod
IF Glo:Kod <> loc:Kod
BRW1.ResetSort(True)
End
Так вот, при таком раскладе не то что не работает, но и иметься такое подозрение, что сюда даже и не заглядывается. Может не туда был вставлен этот код? Вот если MyToolBoxBrowse фильтровать не по loc:kod a по Glo:Kod, то все работает. Что не так?
А дальше – хуже. Вернее – интереснее!
Хотелось бы, что бы этот самый тулбокс прилип намертво (или почти намертво) к Main. И при перемещении последнее, неотрывно следовал за ним. Логически я думал поступить так. Если совсем красиво, то даже не знаю как (зацепили мышкой главный фрэйм, чуть переместили, но мышку не отпустили, и тулбокс переместился), а если не очень, то: переместили главное окно – где-то в нем отловили этот процесс (окно перемещено), послали сообщение тулхоксу – оно приклеилось на прежнее место. Но так как я не нашел, где это самое событие в главном окне отловить, то пошел по иному пути (по всей видимости не самому лучшему, зато простому). На тулбоксе поставил таймер в 50 и написал в Windows Events->Timer:
IF ThisWindow{PROP:XPos} <> Xpos# or ThisWindow{PROP:YPos} <> YPos#
ThisWindow{PROP:XPos} = XPos#
ThisWindow{PROP:YPos} = YPos#
end
Все работает, но вопрос, а есть ли смысл дергать процессор каждые полсекунды на это?
Но и это еще не все!
При запуске тулбокса кодом:
GLO:ToolBoxThread = Start(ToolBow,25000)
Фокус перемещается на тулбокс и обратно не возвращаеться. А это, в моем случае, печально. В окне ToolBox галочка ToolBox поставлена. Где копать?
Ну и последнее:
Сворачиваю главное окно Main в трэй:
ThisWindow{PROP:Iconize} = True
при этом посылаю тулбоксу сообщение стать невидимым:
Settarget(,GLO:ToolBoxThread)
0{PROP:Hide} = True
Settarget()
Все ок.
Затем вызываю программу из трэя. Вопрос, где отловить это событие, что бы опять сделать тулбокс видимым? По OpenWindow, GainFocus не получается. Тогда где?
Заранее благодарен и жду - не дождусь ответов!
- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
неа, WindowManager/TakeWindowEvent/после CASE EVENT()а в процедуре ToolBox в Embeds->Control Events->?Browse:1->All Events
если работает значит этот код вообще не нужен, пусть работает по GLOВот если MyToolBoxBrowse фильтровать не по loc:kod a по Glo:Kod, то все работает
в настройках окна после выставления галки toolbox появляются доп настройки в группе DOCK - куда прилипать, к какой стороне, и InitialState - куда изначально должно быть прилеплено окно, или можно использовать свойства Prop:Dock, Prop:Dockedтулбокс прилип намертво
не помню точно, вроде в кларе нет события такого - окно передвинулось, есть виндовое событие WM_MOVE, его можно отлавливать через сабклассинг, вскореНо так как я не нашел, где это самое событие в главном окне отловить

дануФокус перемещается на тулбокс и обратно не возвращаеться


а на кой settarget делать, также все посылай EVENT:HideToolbox и на обработке события MyToolbox{Prop:Hide}=TRUESettarget(,GLO:ToolBoxThread)
смотря каким образом ты работаешь с треем, если сторонней тулзой, то там скорее всего есть возможность отловить восстановление из трея, например, известно, что кликнули мышой два раза, или выбрали пункт меню, соответственно можно будет добавить опять таки твое событие EVENT:ShowToolbox, хотя кажется если ты воспользуешься DOCK, то об этом можно будет не думатьЗатем вызываю программу из трэя. Вопрос, где отловить это событие, что бы опять сделать тулбокс видимым?
если там такого нет, ... хотя должно быть.... смотри текста этого кода для трея, там должно быть определено событие в структуре для трэя NOTIFYICONDATA (поле uCallbackMessage), тебе нужно знать что это за событие, обычно это Event:NIM EQUATE(Мое число), тогда можно сабклассить окно(фрэйм) и отлавливать это событие, разбирать W_PARAM .....много вообщем выходит

удачи

Написал: PAA(27)
Спасибо всем, кто откликнулся!
1. И в самом деле, если отлавливать событие в нужном месте (WindowManager/TakeWindowEvent/после CASE EVENT()), то все работает на ура.
2. Да, это моя вина, я не указал, что действительно применил шаблоны третей фирмы работы с трэем ABCFree API:System Tray Icon (Class-Based) и программно сворачиваю главное окно кодом: 0{PROP:Iconize} = True. Действительно, там присутствуют точки вставки, в которых можно отловить какой кнопкой мышки сколько раз щелкнули. А вот как отловить то, когда щелчком правой кнопки мышки по иконке в трэе всплывает меню, а в нем пользователь выбирает пункт (мной созданный) Restore. Как отследить этот момент я там не нашел. Вот и подумал, что может быть можно будет поймать его в самом главном окне?
3. На счет фокуса на Тулбаре. Меня ввело в заблуждение то, что в нем отсутствовал заголовок с иконкой, и поэтому я не видел, что (когда я прописал название этого тулбара) синяя полосочка при запуске этого бара, оставалась серой. Впрочем, как и полоса на главном окне. Итак, при запуске программы:
a. Открывается главное окно программы Main
b. Из него запускается MyBrowse (Start(MyBrowse,50000))– окно с List Box (стандартный Browse). В этом окне отсутствует заголовок с иконкой и оно жестко закреплено на Fraime (если это имеет значение)
c. Из MyBrowse командой GLO:ToolBoxThread = Start(ToolBow,25000) запускается MyToolBox – окно со стандартным Browse. В этом моменте серая полоска названия окон как в Main, так и в MyToolBox
d. Нажимаю стрелку вверх (вниз) – происходит перемещение по списку в MyToolBox
e. Щелкаю мышкой по окну (неважно где) MyToolBox – фокус передается (возвращается?) на Main, и следующее нажатие на стрелки вверх-вниз перемещает курсор уже в списке MyBrowse.
f. И что это такое и как с этим жить дальше, если так жить больше нельзя?
4. Все вышеприведенные советы по поводу крепежа тулбокса к родительскому окну были бы верны (по моему мнению) в том случае, если бы тулбокс нужно было бы крепить изнутри. А в моем же случае (прошу прощения, что не указал изначально этот факт) нужно его прикрепить снаружи. В связи с этим, вопрос по прежнему остается для меня открытым.___________________________________________________
Наш первый бой – он трудный самый. Почти (С)
1. И в самом деле, если отлавливать событие в нужном месте (WindowManager/TakeWindowEvent/после CASE EVENT()), то все работает на ура.
2. Да, это моя вина, я не указал, что действительно применил шаблоны третей фирмы работы с трэем ABCFree API:System Tray Icon (Class-Based) и программно сворачиваю главное окно кодом: 0{PROP:Iconize} = True. Действительно, там присутствуют точки вставки, в которых можно отловить какой кнопкой мышки сколько раз щелкнули. А вот как отловить то, когда щелчком правой кнопки мышки по иконке в трэе всплывает меню, а в нем пользователь выбирает пункт (мной созданный) Restore. Как отследить этот момент я там не нашел. Вот и подумал, что может быть можно будет поймать его в самом главном окне?
3. На счет фокуса на Тулбаре. Меня ввело в заблуждение то, что в нем отсутствовал заголовок с иконкой, и поэтому я не видел, что (когда я прописал название этого тулбара) синяя полосочка при запуске этого бара, оставалась серой. Впрочем, как и полоса на главном окне. Итак, при запуске программы:
a. Открывается главное окно программы Main
b. Из него запускается MyBrowse (Start(MyBrowse,50000))– окно с List Box (стандартный Browse). В этом окне отсутствует заголовок с иконкой и оно жестко закреплено на Fraime (если это имеет значение)
c. Из MyBrowse командой GLO:ToolBoxThread = Start(ToolBow,25000) запускается MyToolBox – окно со стандартным Browse. В этом моменте серая полоска названия окон как в Main, так и в MyToolBox
d. Нажимаю стрелку вверх (вниз) – происходит перемещение по списку в MyToolBox
e. Щелкаю мышкой по окну (неважно где) MyToolBox – фокус передается (возвращается?) на Main, и следующее нажатие на стрелки вверх-вниз перемещает курсор уже в списке MyBrowse.
f. И что это такое и как с этим жить дальше, если так жить больше нельзя?
4. Все вышеприведенные советы по поводу крепежа тулбокса к родительскому окну были бы верны (по моему мнению) в том случае, если бы тулбокс нужно было бы крепить изнутри. А в моем же случае (прошу прощения, что не указал изначально этот факт) нужно его прикрепить снаружи. В связи с этим, вопрос по прежнему остается для меня открытым.___________________________________________________
Наш первый бой – он трудный самый. Почти (С)
Спасибо, Михаил, совсем выпустил из виду тот факт, что если не стоит галочка в чекбоксе Immediate, и точек вставки Restore и Restored не будет видно в Ended’ах.
Но тем не менее, это не привило к успеху. Restore вообще не обрабатывается ни при сворачивании в трэей, ни при восстановлении. А вот код, помещенный в Restored (в до и после генерации кода) срабатывает ТОЛЬКО при сворачивании программы в трэй. А ведь была надежда….
Но тем не менее, это не привило к успеху. Restore вообще не обрабатывается ни при сворачивании в трэей, ни при восстановлении. А вот код, помещенный в Restored (в до и после генерации кода) срабатывает ТОЛЬКО при сворачивании программы в трэй. А ведь была надежда….