Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
15-1193680169
SQL555
2007-10-29 20:49
2007.12.02
Проблема с процедурой SQL


2-1194508018
Nucer
2007-11-08 10:46
2007.12.02
TTimer


11-1178473386
Dmitry___
2007-05-06 21:43
2007.12.02
KOLProject - Build := TRUE


11-1178365523
Даддитс
2007-05-05 15:45
2007.12.02
Пример работы с компонентом XXSocket


2-1194353830
Azize
2007-11-06 15:57
2007.12.02
перевод из Двоичного кода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский