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

Вниз

Когда уходит и приходит Handle...   Найти похожие ветки 

 
Mantic0re   (2004-03-19 11:20) [0]

Пишу VCL компонент ..

Как отловить когда Handle уже есть ?
И когда его уже нет ?
А точнее, моменты сразу же после его создания и непосредственно перед его уходом.

AfterConstruction и BeforeDestruction не подходят..

1-й момент я отлавливаю при 1-м вызове PaintWindow, а как отловить 2-й ?


 
Reindeer Moss Eater ©   (2004-03-19 11:22) [1]

Хендл обычно приходит после вызова конструктора
А уходит в деструкторе обычно.


 
MBo ©   (2004-03-19 11:24) [2]

В конструкторе наследника TWinControl окна еще нет, а в CreateWnd уже есть.
DestroyWindowHandle.

З.Ы. окно может пересоздаваться (RecreateWnd)


 
Mantic0re   (2004-03-19 11:26) [3]

Про конструктор и деструктор - нет.
MBo - спасибо, я поспешил сюда вопрос выкладывать..
Сам уже нашел:

procedure CreateHandle; virtual;
procedure DestroyWindowHandle; virtual;

А когда окно может пересоздаваться ?
(Без моего участия, конечно..)


 
Юрий Зотов ©   (2004-03-19 11:26) [4]

Если речь идет о хэндле окна, то создается он в CreateWindowHandle, а уничтожается в DestroyWindowHandle. Заместите эти методы и все отловите. А проверить можно вызовом HadleAllocated.


 
Digitman ©   (2004-03-19 11:29) [5]

посмотри, сколько виртуальных методов на эту тему у TWinControl

   procedure CreateWindowHandle(const Params: TCreateParams); virtual;
   procedure CreateWnd; virtual;
   procedure DestroyWindowHandle; virtual;
   procedure DestroyWnd; virtual;

неужели мало ?!

переопределяй нужные Create/Destroy-методы в своем наследнике - и всех делов !


 
Юрий Зотов ©   (2004-03-19 11:29) [6]

> Mantic0re   (19.03.04 11:26) [3]
> А когда окно может пересоздаваться?

Когда вызывается метод RecreateWnd. Обычно он вызывается, когда изменение какого-то свойства связано с измененим стиля окна.


 
Reindeer Moss Eater ©   (2004-03-19 11:46) [7]

Все вы конечно же правы, но хендл все же появляется в конструкторе, а исчезает в деструкторе.

Значение же в нем содеращееся не всегда равно валидому дескриптору окна. Отсюда: правильно заданный вопрос - половина ответа на него.
Как проверить, что handlе содержит валидный хендл?
Сравнить с каким-то предопределенным значением, например INVALID_HANDLE_VALUE


 
Юрий Зотов ©   (2004-03-19 12:19) [8]

> Reindeer Moss Eater ©   (19.03.04 11:46) [7]

> хендл все же появляется в конструкторе, а исчезает в
> деструкторе.

В конструкторе (еще точнее, в NewInstance) появляется (вместе с самим объектом), а в деструкторе (точнее, в FreeInstance) исчезает (тоже вместе с самим объектом) ПОЛЕ FHandle, а не сам хэндл.

> Как проверить, что handlе содержит валидный хендл?
> Сравнить с каким-то предопределенным значением, например
> INVALID_HANDLE_VALUE

То есть,
if Handle <> INVALID_HANDLE_VALUE then...

Вот так? Если нет, то не могли бы Вы написать пример?

Только сначала загляните в TWinControl - как там объявлено свойство Handle. Дело в том, что есть нюанс, из-за которого Ваш совет не пройдет - любое обращение к свойству Handle даст ПРАВИЛЬНЫЙ хэндл окна.


 
Reindeer Moss Eater ©   (2004-03-19 12:31) [9]

В конструкторе я делаю fHandle := INVALID_HANDLE_VALUE

И что, до создания окна (fHandle = INVALID_HANDLE_VALUE) не вернет мне True?


 
Юрий Зотов ©   (2004-03-19 12:34) [10]

> Reindeer Moss Eater ©   (19.03.04 12:31) [9]

В конструкторе Вы не сможете сделать
FHandle := INVALID_HANDLE_VALUE
из-за того, у Вас нет прямого доступа к приватному полю. А далее по той же Вы не сможете проверить это поле напрямую.


 
Reindeer Moss Eater ©   (2004-03-19 12:37) [11]

Я в исходном вопросе что-то ничего про чью-то приватную секцию не видел.
И про то, от кого наследован новый VCL компонент - тоже


 
Юрий Зотов ©   (2004-03-19 12:47) [12]

> Reindeer Moss Eater ©   (19.03.04 12:37) [11]

В исходном вопросе упоминается PaintWindow. Для понимания сути вопроса этого вполне достаточно.



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

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

Наверх




Память: 0.49 MB
Время: 0.028 c
7-1073904528
revo
2004-01-12 13:48
2004.04.04
Как перегрузить программу


14-1078689202
Seriouss
2004-03-07 22:53
2004.04.04
Новый портал о железе! оцените?


3-1078474240
Laymer
2004-03-05 11:10
2004.04.04
И опять про Access


1-1079361906
ki11er
2004-03-15 17:45
2004.04.04
Как получить выделенный в IE кусок текста?


3-1078686579
zyurik
2004-03-07 22:09
2004.04.04
Проблема с удалением