![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отловить момент активизации фрейма [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]посылка - ловля сообщений?