Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: -0.98 c
1-1084715381
RomeoGolf
2004-05-16 17:49
2004.05.30
Free и nil - как корректнее совместить?


11-1073713838
DSP
2004-01-10 08:50
2004.05.30
как в цикле(не поименно) много одинаковых компонент обработать


3-1084031212
Nick-From
2004-05-08 19:46
2004.05.30
DBF (dos) -> DBF (win-1251)


14-1083954192
copyr25
2004-05-07 22:23
2004.05.30
Инагурация Президента.


14-1084447579
Knight
2004-05-13 15:26
2004.05.30
Старые песни о главном... о высокие технологии и тех кто рядом.




   Наверх