Текущий архив: 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.49 MB
Время: 0.032 c