Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.048 c
3-1083836197
Pul
2004-05-06 13:36
2004.05.30
DBGrid и редактирование lookup полей


7-1082542073
Внук
2004-04-21 14:07
2004.05.30
Проверка существования учетной записи


1-1084595929
IrBisoff
2004-05-15 08:38
2004.05.30
Как правильно очистить массив элементов ?


1-1084363991
dim-
2004-05-12 16:13
2004.05.30
tree и Data


14-1084088162
Cerber
2004-05-09 11:36
2004.05.30
Интерненет