Текущий архив: 2004.05.30;
Скачать: CL | DM;
ВнизMouseEnter & MouseLeave Найти похожие ветки
← →
IrBisoff © (2004-05-19 09:25) [0]Уважаемые мастера ! Можно ли каким-нибудь образом обработать сабжевые события для TImage, при том что сам компонент свойств OnMouseEnter & OnMouseLeave не имеет ? Пытался через OnMouseMove, но при быстром перемещении мыши это бесполезно - не всегда мышь попадает в последний пиксел картинки. =\
← →
Думкин © (2004-05-19 09:35) [1]
CM_MOUSEENTER
CM_MOUSELEAVE
TImage23 = class(TImage)
procedure MouseLeave(var Msg : TMessage); message CM_MOUSELEAVE;
end;
← →
Silver Alex © (2004-05-19 09:39) [2]можно перехватывать события таким образом.
private
old: TWndMethod;
procedure newWNDProc(var Msg: TMessage);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
old:=Image2.WindowProc;
Image2.WindowProc:=newWNDProc;
end;
procedure TForm1.newWNDProc(var Msg: TMessage);
begin
old(Msg);
if Msg.Msg =CM_MOUSELEAVE then
begin
Label1.Caption:="no mouse";
end
else if Msg.Msg =CM_MOUSEENTER then
begin
Label1.Caption:="mouse";
end ;
end;
← →
Silver Alex © (2004-05-19 09:40) [3]поправлюсь, сообщения ,а не события конечно
← →
pasha_golub © (2004-05-19 09:50) [4]Silver Alex © (19.05.04 09:39) [2]
Этот метод уже обсуждался и признан небезопасным.
От себя добавлю, что если без создания своего наследника, то ловить WM_MOUSELEAVE & WM_MOUSEMOVE. В таком случае следует обратить внимание на поимку сообщений WM_MOUSELEAVE, потому как для них предусмотрен механизм подписки. Подробнее см. MSDN.
Если с созданием своего наследника, то Думкин © (19.05.04 09:35) [1] однозначно.
← →
Silver Alex © (2004-05-19 10:09) [5]
> pasha_golub © (19.05.04 09:50) [4]
кем обсуждался и что здесь небезопасного?
← →
NAlexey © (2004-05-19 10:11) [6]>pasha_golub © (19.05.04 09:50) [4]
Почему же, можно Думкин © (19.05.04 09:35) [1] но без наследника:
procedure TForm1.MouseEnter(var Msg: TMessage);
begin
if Msg.LParam = Integer(Image1) then
Caption := "Enter";
end;
procedure TForm1.MouseLeave(var Msg: TMessage);
begin
if Msg.LParam = Integer(Image1) then
Caption := "Leave";
end;
← →
pasha_golub © (2004-05-19 10:19) [7]Silver Alex © (19.05.04 10:09) [5]
Обсуждалась схожая тема. Написание компонента-обертки, подменяющего чью-то оконную процедуру.
В этом примере вроде все ок. Но, лично для себя, я этот путь приемлимым более не считаю.
С уважением.
← →
NAlexey © (2004-05-19 10:21) [8]>pasha_golub © (19.05.04 10:19) [7]
>я этот путь приемлимым более не считаю.
А почему если не секрет? Может и я после объяснения не буду считать его приемлимым?
← →
pasha_golub © (2004-05-19 10:25) [9]NAlexey © (19.05.04 10:21) [8]
Ы-ы-ы, ок. Поищу. Объяснения по этому поводу давал Юрий Зотов.
← →
NAlexey © (2004-05-19 10:28) [10]>pasha_golub © (19.05.04 10:25) [9]
Ок.
← →
Silver Alex © (2004-05-19 10:38) [11]
> pasha_golub © (19.05.04 10:19) [7]
я не думаю что здесь может быть что-то небезопасное, потому как везде у всех наследников TControl есть виртуальный метод WndProc который на Create присваивается событию WindowProc.А теперь запусти поиск по слову "WndProc" и посмотри везде как этот метод переопределяется.Но там как правило вместо того что я написал old(Msg) пишут inherited, но реально происходит тоже самое.Так что ты хочешь сказать везде пишут неверно и не безопасно.Я думаю ты просто не до конца разобрался или высказал не свою мысль.
← →
Александр Иванов © (2004-05-19 10:56) [12]Есть еще один вариант, он не совсем корректный, но работать должен. Накладывается компонент, обрабатывающий эти события и делается невидимым и размером с исходный TImage.
← →
NAlexey © (2004-05-19 11:10) [13]>Александр Иванов © (19.05.04 10:56) [12]
Не в обиду... За несовсем корректный вариант здесь могут придать анафеме. Берегись:)
← →
pasha_golub © (2004-05-19 12:48) [14]Silver Alex © (19.05.04 10:38) [11]
Я думаю, что есть разница в вызове кода из потомка и не из такового.
В данном примере, признаю, все нормально. Проблема которую я вспомнил, носила чуток другой оттенок. Как я сказал, имелся компонент, который подменял оконную процедуру у другого компонента на форме. Найти я эту ветку не могу, она ушла в архив. Но суть была, насколько я помню, в том, что при удалении компонента, у которого подменялась процедура, ссылка на процедуру (в вашем случае old) указывала в никуда. Вообщем простите за сбивчивое объяснение, сам я смутно помню процесс обсуждения, а запомнил только вывод. Но, повторюсь, в данном Вами примере все чисто. :-)
Страницы: 1 вся ветка
Текущий архив: 2004.05.30;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.035 c