Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно отлавить изменение Handle компонента? [D7, Win95/98, WinXP]


Страницы:   1 2 3

MegaVolt ©   (2006-11-09 12:10:00) 

Некоторые компоненты при изменении свойств пересоздают себя и в результате изменяется их Handle. В результате другой компонент который слал сообщения первому уже не знает правильный Handle и следовательно сообщения уже не доходят.
Например Listiew при переключении в OwnerDraw...

Как правильно перехватить моменты до и после изменения Handle?


MegaVolt   (2006-11-09 14:19:00) [21]

>ты будешь смеяться: этот тултип вовсе не Borland рисует.
Рисует не борланд всё правильно. Хотя мог бы быть стандартный Hint :) Так что это нормально когда один компонент исспользует разные подсказки.

>А вообще задача бессмысленная. Если в каком-то месте хранится голый хендл (целое) причем хендл может стать неактуальным, значит нужна функция, возвращающая хендл, а не просто переменная , проинициализированная однажды.

Это к MicroSoft претензии? Чем я могу могу помочь? ToolTip при настройке принимает Handle окна с которого он перехватывает сообщения мыши. Он внутри себя хранит. Если же я что то меняю у ListView у него меняется Handle и ToolTip перестаёт работать как положено.

Подскажите в каком месте ListView происходит это изменение.


Ketmar   (2006-11-09 14:00:00) [22]

>[21] MegaVolt(c) 9-Nov-2006, 13:30
>Все претензии к Борланд. Возьми TListView и посмотри
ты будешь смеяться: этот тултип вовсе не Borland рисует.


Reindeer Moss Eater   (2006-11-09 13:32:00) [23]

А вообще задача бессмысленная.

Если в каком-то месте хранится голый хендл (целое) причем хендл может стать неактуальным, значит нужна функция, возвращающая хендл, а не
просто переменная , проинициализированная однажды.

Идем дальше.

Компонентов много а не один.
У функции появляется параметр, идентифицирующий нужный нам компонент.

Итого: у нас есть или ссылка на сам компонент, или имя, по которому мы его сможем найти.

Вопрос:

нафига нам хранить хендл сбоку, если мы его можем спросить у самого найденного компонента?


MegaVolt   (2006-11-09 13:30:00) [24]

>обалдеть. вся программа использует стандартные хинты (возможно, с расширеным функционалом), а один "крутой" компонент как обычно ведёт себя некультурно. такие компоненты надо отправлять в топку. а авторов больно бить ногами.

Спасибо. Но если есть желание бить ногами милости просим. Все претензии к Борланд. Возьми TListView и посмотри какой стандартный Hint там вылазит когда текст в ячейку не влазит. Если не знаешь то там вылазит как раз ToolTip и смотрится он там очень кстати и до сих пор никто не жаловался что он там плохо смотрится.

>Храни его каком-нибудь глобальном списке.
Например прямо в модуле своего чудо-компонента

Я кажется не спрашиваю где хранить я спрашиваю как отловить изменение.

>Зачем такой изврат?

Спасибо за понимание.

>Компонет что, не знает когда он разрушется?

Знает только вот где именно это происходит я не совсем понимаю. Компонент стандартный ListView.

Очень поже что тут:
procedure TCustomListView.ResetExStyles;
...
ListView_SetExtendedListViewStyle(Handle, Styles);
...

или после вызова RecreateWnd


DVM   (2006-11-09 13:28:00) [25]


> Он же (компонент) без таймера абсолютно точно знает когда
> у него новый хендл создается.

Да я с этим согласен полностью.


Reindeer Moss Eater   (2006-11-09 13:27:00) [26]

Ты сам не понял идеи.

Зачем комоненту самому себя мониторить таймером?
Он же (компонент) без таймера абсолютно точно знает когда у него новый хендл создается.


DVM   (2006-11-09 13:26:00) [27]

Хотя сообщения от таймера должны тоже окну приходить, а хэндл измениться может, так что опять те же яйца только в профиль :)


DVM   (2006-11-09 13:24:00) [28]


> А что это за такой полезный компонент получится, если пользователю
> надо будет самому отслеживать таймером чего-то там внутренне
> происходящее внутри этого компонента?

Ты верно не понял идеи. Зачем пользователю что-то там отслеживать?

Компонент в своем конструкторе создает таймер, в деструкторе уничтожает. Между ними пользуется.


Reindeer Moss Eater   (2006-11-09 13:22:00) [29]

А что это за такой полезный компонент получится, если пользователю надо будет самому отслеживать таймером чего-то там внутренне происходящее внутри этого компонента?

Это недоразумение, а не компонент.


DVM   (2006-11-09 13:19:00) [30]


> Компонет что, не знает когда он разрушется?

Компонент то знает. Автор вопроса нет.
А еще никто кроме автора не знает что за компонент и.т.д.
Потому я предложил простой и рабочий на все случаи вариант.


Reindeer Moss Eater   (2006-11-09 13:15:00) [31]

Добавь в свой компонент таймер.

Зачем такой изврат?
Компонет что, не знает когда он разрушется?
Не может без таймера обновить значение хендла своего окна в списке?


DVM   (2006-11-09 13:13:00) [32]


> >  пишу наследника от компонента поэтому должны быть нормальные
>
> > культурные методы.

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


Reindeer Moss Eater   (2006-11-09 13:10:00) [33]

Как правильно перехватить моменты до и после изменения Handle?

Храни его каком-нибудь глобальном списке.
Например прямо в модуле своего чудо-компонента


Ketmar   (2006-11-09 13:10:00) [34]

обалдеть. вся программа использует стандартные хинты (возможно, с расширеным функционалом), а один "крутой" компонент как обычно ведёт себя некультурно. такие компоненты надо отправлять в топку. а авторов больно бить ногами.


DVM   (2006-11-09 13:09:00) [35]


>  пишу наследника от компонента поэтому должны быть нормальные
> культурные методы.

А чем данный подход некультурен?

> Самому отрисовывать?

Погляди: http://rouse.drkb.ru/files/fwhint.zip


Ketmar   (2006-11-09 13:08:00) [36]

>[5] MegaVolt(c) 9-Nov-2006, 13:02
>Внешним видом.
???


MegaVolt   (2006-11-09 13:08:00) [37]

>А что внешний вид стандартного хинта нельзя изменить?
Самому отрисовывать? А зачем мне это? ToolTip великолепно работает, прост в использовании.


MegaVolt   (2006-11-09 13:05:00) [38]

>Самый тупой и простой способ периодически проверять по таймеру.

Я пишу наследника от компонента поэтому должны быть нормальные культурные методы.

Например в лоб. До и после изменения свойств которые вызывают изменение Handle.

Но нутром чувствую что можно просто перекрыть какую то функцию. Например CreateParam и получить нужный результат. Только я не уверен в правильности такого подхода.


DVM   (2006-11-09 13:03:00) [39]


> Внешним видом.

А что внешний вид стандартного хинта нельзя изменить?


MegaVolt   (2006-11-09 13:02:00) [40]

Внешним видом.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо