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