Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.053 c
3-1083572933
ss300
2004-05-03 12:28
2004.05.30
Странное поведение TClientDataset


14-1084361214
kombat
2004-05-12 15:26
2004.05.30
Как правильно проектировать программу


1-1084723276
Федя Мегатронов
2004-05-16 20:01
2004.05.30
Скорость закачки - как ?


1-1084859905
dim-
2004-05-18 09:58
2004.05.30
получить результат из dll


4-1082549473
alexproger
2004-04-21 16:11
2004.05.30
Отсылка сообщения окну





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский