Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

Отловить момент активизации фрейма   Найти похожие ветки 

 
Ega23 ©   (2007-11-08 11:39) [0]

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

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

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


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

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


 
Ega23 ©   (2007-11-08 12:10) [2]


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


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


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

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


 
Ega23 ©   (2007-11-08 12:32) [4]

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


 
Ega23 ©   (2007-11-08 12:33) [5]

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


 
ЮЮ ©   (2007-11-08 12:36) [6]

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


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

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


 
Ega23 ©   (2007-11-08 12:46) [7]


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


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


 
Leonid Troyanovsky ©   (2007-11-08 15:34) [8]


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

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

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

--
Regards, LVT.


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


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

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

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


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

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


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


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


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


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


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


 
Ega23 ©   (2007-11-08 17:58) [12]


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


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


 
ЮЮ ©   (2007-11-09 02:52) [13]

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

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


 
Loginov Dmitry ©   (2007-11-09 07:49) [14]

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


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


 
Leonid Troyanovsky ©   (2007-11-09 09:31) [15]


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

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

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

--
Regards, LVT.


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

Ega23 ©   (08.11.07 17:58) [12]

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


 
Ega23 ©   (2007-11-09 10:26) [17]


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


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


 
MsGuns ©   (2007-11-09 11:28) [18]

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.023 c
2-1194694877
IOrist
2007-11-10 14:41
2007.12.02
глюки с TThread


15-1193238690
Рекрутер
2007-10-24 19:11
2007.12.02
Программист-пенсионер - кто он?


2-1194708408
anonymous
2007-11-10 18:26
2007.12.02
Как добавить все столбцы в TDBGrid Run-Time?


15-1193493795
Denis__
2007-10-27 18:03
2007.12.02
Aнимация


15-1193210153
xayam
2007-10-24 11:15
2007.12.02
вопрос по php