Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отловить момент активизации фрейма [D7]


Ega23 ©   (2007-11-08 11:39:00) 

Есть класс фрейма. В какой-то момент был создан экземпляр класса. В какой-то моент этому фрейму был назначен Parent (например, какая-то форма). В момент назначения парента нанная форма была, например, Hide.

Вопрос: как на уровне класса фрейма узнать, что его парент стал видимым (форме сделали Show, или паретном была панель и уже ей назначили парент), а также обратная ситуация - стал невидимым (форме Hide сделали, или у панели паренту nil присвоили)?

Пока единственное, что приходит в голову - перекрытие CreateWnd и DestroyWnd.
Но как-то не нравится... Есть ли другие способы, или именно этот и является "штатным" для такой ситуации?


jack128_   (2007-11-09 13:56:00) [1]


> Не, там привязка к DataSet'у, при изменениях курсора - разная
> графика должна рисоваться.

ну и делай Invalidate при изменении курсора.. Причем тут родители и прочая дребедень??


MsGuns   (2007-11-09 11:28:00) [2]

Я в подобных случаях пользовал такую технологию:
В самойм фрэйме определена процедура, выполняющая действия, аналогичные тем, которые делаются, например, в событии OnCreate формы. Эта процедура выполняется "парентским" лбъектом-контейнером (например, TForm), который сохдает экземляр фрэйма и кладет его на себя или куда там еще.
При необходимости повторной инициализации фрэйма эта процедура вызывается извне либо из самого фрэйма.
Если надо отлавливать еще и получение (потерю) фокуса некоторыми элементами фрэйма (например, для переключения контекстных меню), то пишется еще одна процедура фрэйма, которая выполняется по событиям OnEnter/OnExit соответствующих контролов фрэйма


Ega23   (2007-11-09 10:26:00) [3]


> Видишь ли, однозначный способ определить, виден ли твой
> фрейм в определенный момент времени, может быть довольно
> затруднительным.


ОК, буду иметь ввиду.
Тогда подумаю над другой логикой программирования GUI.


Игорь Шевченко   (2007-11-09 09:47:00) [4]

Ega23 ©   (08.11.07 17:58) [12]

Видишь ли, однозначный способ определить, виден ли твой фрейм в определенный момент времени, может быть довольно затруднительным. Не лучше ли положиться на GDI - ему всяко виднее, когда и куда рисовать


Leonid Troyanovsky   (2007-11-09 09:31:00) [5]


> Loginov Dmitry ©   (09.11.07 07:49) [14]

> Событие "необходимости" отрисовки у него может возникнуть
> гораздо позже, чем это необходимо )

Потрудитесь изъясняться точнее.

--
Regards, LVT.


Loginov Dmitry   (2007-11-09 07:49:00) [6]

> При изменениях курсора только должно определяться, какого
> рода графика должна рисоваться при необходимости отрисовки.


Событие "необходимости" отрисовки у него может возникнуть гораздо позже, чем это необходимо )


ЮЮ   (2007-11-09 02:52:00) [7]

> при изменениях курсора - разная графика должна рисоваться

При изменениях курсора только должно определяться, какого рода графика должна рисоваться при необходимости отрисовки. А рисоваться все должно именно тогда, как и положено рисоваться.
Тогда невидимый фрем не будет "рисоваться" ни при какаих изменениях DataSet-а.


Ega23   (2007-11-08 17:58:00) [8]


> ы графику свою по таймеру обновляешь или как ?
>


Не, там привязка к DataSet'у, при изменениях курсора - разная графика должна рисоваться. Просто не хочется её рисовать тогда, когда фрейм с графикой неактивен.


Игорь Шевченко   (2007-11-08 17:21:00) [9]


> но для его решения кроме как перекрытие CreateWnd и DestroyWnd
> я пока ничего не вижу.


не поможет оно тебе.


> как на уровне класса фрейма узнать, что его парент стал
> видимым


А оно тебе надо ? А оно какая разница тебе ?
Ты графику свою по таймеру обновляешь или как ?


clickmaker   (2007-11-08 17:05:00) [10]

можно же ведь в том месте, где происходит "нугрубо говоря, графика, обновление которой - накладная операция", просто проверять: видим ли фрейм, не свернуто ли окно и т.п.


jack128_   (2007-11-08 17:01:00) [11]


> Да дело не в графике. Меня принципиальный вопрос интересует:
>  как отловить момент изменения Parent не у своего "парента",
>  а у "парета парента", или ещё дальше.
> На уровне TFrame.

ИМХО - никак.  Может какими нить полухакнутыми способами, но нормально - никак..

Ты опиши задачу, в которой те такая хрень понадобилась. Потому что пример с графикой - не убедителен. Для него ничего такого отлавливать не нужно..


Leonid Troyanovsky   (2007-11-08 15:34:00) [12]


> Ega23 ©   (08.11.07 12:46) [7]

>  как отловить момент изменения Parent не у своего "парента",
>  а у "парета парента", или ещё дальше.

Напоминает bad design.

--
Regards, LVT.


Ega23   (2007-11-08 12:46:00) [13]


>
> Неужели находясь на невидимом TabSheet-е будет постояноо
> рисоваться?
>
> Какого типа графика, что обновление так накладно??


Да дело не в графике. Меня принципиальный вопрос интересует: как отловить момент изменения Parent не у своего "парента", а у "парета парента", или ещё дальше.
На уровне TFrame.


ЮЮ   (2007-11-08 12:36:00) [14]

> на данном фрейме находится, нугрубо говоря, графика, обновление
> которой - накладная операция


Неужели находясь на невидимом TabSheet-е будет постояноо рисоваться?

Какого типа графика, что обновление так накладно??


Ega23   (2007-11-08 12:33:00) [15]

Посмотрел. Не совсем понятно, как это к моей ситуации можно прикрутить.
Сейчас попробую тест написать.


Ega23   (2007-11-08 12:32:00) [16]

Сейчас посмотрю


Правильный_Вася   (2007-11-08 12:30:00) [17]

может?
procedure Notification(AComponent: TComponent; Operation: TOperation); override;


Ega23   (2007-11-08 12:10:00) [18]


> посылка - ловля сообщений?


Не годится. Смотри, ситуация такая: есть фрейм, который описывает некий фукционально-законченый кусок программы. Причём на данном фрейме находится, нугрубо говоря, графика, обновление которой - накладная операция. Т.е. не хотелось бы обновлять эту графику тогда, когда фрейм скыт.
Допустим, фрейм лежит на панели, которая лежит на TabSheet, который привязан к какому-то PageControl.
Я хочу начать работу с графикой только тогда, когда данный TabSheet стал активным.
Причём основная программа вообще ничего про данный фрейм не знает (ну кроме того, что это потомок TFrame и его парент - данная панель).
Либо придётся создавать "свои" потомки TTabSheet и TPanel, в которых описывать событие OnActivate и OnDeactivate, либо тупо попытаться всё это дело словить на уровне класса фрейма.
Второй вариант как-то более предпочтителен, но для его решения кроме как перекрытие CreateWnd и DestroyWnd я пока ничего не вижу.


Приавильный_Вася   (2007-11-08 11:50:00) [19]

посылка - ловля сообщений?


Наверх

Титульная страница Поиск, карта сайта Написать письмо