ToolBox покоя не дает.

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию 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, АВС
Спасибо.
Аватара пользователя
StillZero
Ветеран
Сообщения: 458
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Поблагодарили: 1 раз
Контактная информация:

Сообщение StillZero »

1. Как, при перемещении курсора в MyBrowse перерисовывать ToolBoxBrowse?
1. Попробуй просто в ToolBoxBrowse в настройках добавить GLO:Kod в ResetFields - это список полей при изменении которых должна быть перерисовка(Re-Set) брауза
2. Если не проканает можно постить Event в известный тебе поток.
Делается примерно так:
в глобалах заведи свое событие

Код: Выделить всё

EVENT:ToolboxRedraw EQUATE(EVENT:User+1)
при изменении переменной GLO:Kod, это видимо будет на MyBrowse на NewSelection посылай событие в ToolBoxBrowse, это будет так:

Код: Выделить всё

 POST(EVENT:ToolboxRedraw,,loc:ToolBoxThread)
а в окне ToolBoxBrowse отлавливай это событие в точке TakeWindowEvent на CASE

Код: Выделить всё

 of EVENT:ToolboxRedraw
    BRWxxx.ResetQueue(Reset:Queue) 
    ! или ThisWindow.Reset(TRUE) или BRWxxx.ResetSort()  и т.п.
насчет закрытия при сворачивании в трэй - аналогично, посылай мессагу Event:CloseWindow в известный тебе поток

удачи
Написал: 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 не является MDI Child'ом
Аватара пользователя
StillZero
Ветеран
Сообщения: 458
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Поблагодарили: 1 раз
Контактная информация:

Сообщение StillZero »

а в процедуре ToolBox в Embeds->Control Events->?Browse:1->All Events
неа, WindowManager/TakeWindowEvent/после CASE EVENT()
Вот если MyToolBoxBrowse фильтровать не по loc:kod a по Glo:Kod, то все работает
если работает значит этот код вообще не нужен, пусть работает по GLO
тулбокс прилип намертво
в настройках окна после выставления галки toolbox появляются доп настройки в группе DOCK - куда прилипать, к какой стороне, и InitialState - куда изначально должно быть прилеплено окно, или можно использовать свойства Prop:Dock, Prop:Docked
Но так как я не нашел, где это самое событие в главном окне отловить
не помню точно, вроде в кларе нет события такого - окно передвинулось, есть виндовое событие WM_MOVE, его можно отлавливать через сабклассинг, вскоре :) может сегодня даже, на zero.clarionlife.net выложу статью как сабклассить через классы, если нет - читайте стд help по свойству Prop:WndProc и здесь http://www.pisoft.ru/verstak/Insider/col_subclass.htm
Фокус перемещается на тулбокс и обратно не возвращаеться
дану :) черт знает, у меня такого нет, наоборот, хрен фокус на него поставишь :)
Settarget(,GLO:ToolBoxThread)
а на кой settarget делать, также все посылай EVENT:HideToolbox и на обработке события MyToolbox{Prop:Hide}=TRUE
Затем вызываю программу из трэя. Вопрос, где отловить это событие, что бы опять сделать тулбокс видимым?
смотря каким образом ты работаешь с треем, если сторонней тулзой, то там скорее всего есть возможность отловить восстановление из трея, например, известно, что кликнули мышой два раза, или выбрали пункт меню, соответственно можно будет добавить опять таки твое событие EVENT:ShowToolbox, хотя кажется если ты воспользуешься DOCK, то об этом можно будет не думать

если там такого нет, ... хотя должно быть.... смотри текста этого кода для трея, там должно быть определено событие в структуре для трэя NOTIFYICONDATA (поле uCallbackMessage), тебе нужно знать что это за событие, обычно это Event:NIM EQUATE(Мое число), тогда можно сабклассить окно(фрэйм) и отлавливать это событие, разбирать W_PARAM .....много вообщем выходит :) надо знать как вообще трэй работает, разбирать код и т.п.

удачи :)
Написал: PAA(27)
Гость

Сообщение Гость »

Добрый день.
Цитата:
>Затем вызываю программу из трэя. Вопрос, где отловить это событие, >что бы опять сделать тулбокс видимым?

Не из трея, а из панели задач? (раз prop:iconize).
Можно попробовать по Event:Restored главного окна (должен быть установлен IMM)

Михаил
Гость

Сообщение Гость »

Спасибо всем, кто откликнулся!

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 (в до и после генерации кода) срабатывает ТОЛЬКО при сворачивании программы в трэй. А ведь была надежда….
Ответить