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

Вниз

Как отловить событи, когда курсор вышел за пределы фотографии?   Найти похожие ветки 

 
xkiller   (2004-11-09 14:35) [0]

Как отловить событие, когда курсор только-только вышел за пределы фотографии?


 
Digitman ©   (2004-11-09 14:42) [1]

нанять Штирлица в качестве частного сыскного агента.


 
begin...end ©   (2004-11-09 14:46) [2]

WM_MOUSELEAVE ?


 
begin...end ©   (2004-11-09 14:47) [3]

Т.е. CM_MOUSELEAVE


 
Symb   (2004-11-09 14:57) [4]

Перемещение курсора не проходит бесследно. Не только если он вышел за пределы фотографии, но и при неосторожном задевании мышки ногой, системой генерируются всяческие события, оповещающие заинтересованные формы и контролы о новых координатах указателя. Зная координаты фотографии, несложно определить, вышел ли он за ее границы. А "только-только" означает, что при прошлой проверке он еще был на ней, а теперь -- уже нет.


 
xkiller   (2004-11-09 15:12) [5]

begin...end Это API сообщение? Как мне его обрабатывать? Помоги плиз!


 
xkiller   (2004-11-09 15:41) [6]

Удалено модератором


 
begin...end ©   (2004-11-09 15:48) [7]

xkiller   (09.11.04 15:12) [5]

Что-то вроде этого, не проверял...

type
 TMyImage = class(TImage)
 protected
   procedure CMMouseLeave(Message: TMessage); message CM_MOUSELEAVE;
 end;

...

procedure TMyImage.CMMouseLeave(Message: TMessage);
begin
 // Мышь ушла, реагируем на это
end.


 
Digitman ©   (2004-11-09 17:08) [8]


> begin...end


TImage = "фотография" ?

ришпекты телепатам.


 
begin...end ©   (2004-11-09 19:10) [9]

Digitman ©   (09.11.04 17:08) [8]


>TImage = "фотография" ?

Спорим? :-)))


 
xkiller   (2004-11-11 17:34) [10]

Значит надо написать свой компонент? Я пишу:

unit MyImage;

interface

uses
 SysUtils, Classes, Controls, ExtCtrls, Messages;

type
 TMyImage = class(TImage)
 private
   { Private declarations }
 protected
   { Protected declarations }
   procedure CMMouseLeave(Message: TMessage); message CM_MOUSELEAVE;
 public
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("MyVCL", [TMyImage]);
end;

end.


а в программе обрабатывать событие:

procedure TMyImage.CMMouseLeave(Message: TMessage);
begin
// Мышь ушла, реагируем на это
end.


Я вроде так понял... Написал этот компонент (см. выше) но у меня почему-то он не ставится выдвет ошибку в строке
procedure CMMouseLeave(Message: TMessage); message CM_MOUSELEAVE;

Что делать?


 
begin...end ©   (2004-11-11 17:47) [11]

xkiller   (11.11.04 17:34) [10]

Извиняюсь.

procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE

И в реализации:

procedure TMyImage.CMMouseLeave(var Message: TMessage)

Сообщите о результатах.


 
debuger ©   (2004-11-11 17:55) [12]

[0]
Lingvo X.0 + Win32 Developers Reference -> Find -> WM_MOUSELEAVE
see: TrackMouseEvent  // NT only

[10]
>> Что делать?
Смотреть хелп! Разве существует CM_MOUSELEAVE ???

[9]
Вы уверены, что фотография это не коврик для мыши?


 
xkiller   (2004-11-11 18:09) [13]

опять ошибка в этой строке
"[Error] MyImage.pas(14): Unsatisfied forward or external declaration: "TMyImage.CMMouseLeave""


 
begin...end ©   (2004-11-11 18:09) [14]

debuger ©   (11.11.04 17:55) [12]

> Смотреть хелп! Разве существует CM_MOUSELEAVE ???

Представьте себе, - существует.

> Вы уверены, что фотография это не коврик для мыши?

Почему-то уверен.


 
begin...end ©   (2004-11-11 18:12) [15]

xkiller   (11.11.04 18:09) [13]

Приведите весь код, так я не могу сказать.


 
xkiller   (2004-11-11 18:14) [16]

код компонента:

unit MyImage;

interface

uses
 SysUtils, Classes, Controls, ExtCtrls, Messages;

type
 TMyImage = class(TImage)
 private
   { Private declarations }
 protected
   { Protected declarations }
   procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
 public
   { Public declarations }
 published
   { Published declarations }
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("MyVCL", [TMyImage]);
end;

end.


 
begin...end ©   (2004-11-11 18:20) [17]

xkiller   (11.11.04 18:14) [16]

Ну и где реализация CMMouseLeave()?

Пишите в этом же модуле, в секции implementation:

procedure TMyImage.CMMouseLeave(var Message: TMessage);
begin
 // Здесь описываете действия, которые должен выполнить Ваш компонент, когда в него придёт сообщение
end


 
xkiller   (2004-11-11 18:23) [18]

а как мне сделать, чтобы то что нужно сделать делала программа а не компонент? Т.е. чтобы это было событие для программы


 
Sun bittern ©   (2004-11-11 18:27) [19]

Посмотрите пример реализации в исходниках TLabel для свойства OnMouseLeave.


 
xkiller   (2004-11-11 18:30) [20]

Sun bittern А где мне найти исходник TLabel? Он в Delphi в какой папке?


 
Sun bittern ©   (2004-11-11 18:42) [21]

Кинем на форму TLabel и после этого ищем чето подобное

type
 TForm1 = class(TForm)
   Label1: TLabel; << Зажав клавишу Ctrl щелкнем по TLabel мышкой

Перейдем сюда
TLabel = class(TCustomLabel)
зажав клавишу Ctrl щелкнем по TCustomLabel мышкой

перейдем сюда
TCustomLabel = class(TGraphicControl)

и смотрим реализацию

 TCustomLabel = class(TGraphicControl)
 private
...
FOnMouseLeave: TNotifyEvent;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
...
 public
...
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
 end;

procedure TCustomLabel.CMMouseLeave(var Message: TMessage);
begin
 inherited;
 if Assigned(FOnMouseLeave) then
   FOnMouseLeave(Self);
end;

Далее регестрируете компонент в дельфи и данное событие будет доступно в инспекторе объектов. Теперь пишите в этом событии чего пожелаете.


 
Sun bittern ©   (2004-11-11 19:03) [22]

Поправка

public
...
  property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;

нужно так:

published
...
  property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;


 
debuger ©   (2004-11-11 19:39) [23]

[14]
>> Смотреть хелп! Разве существует CM_MOUSELEAVE ???

>Представьте себе, - существует.

В моем апишном хелпе ее нет. Де оно описано? (мне, что бы в будущем не париться)


 
begin...end ©   (2004-11-11 19:47) [24]

debuger ©   (11.11.04 19:39) [23]

Её и не должно быть в апишном хелпе. Оно описано в Controls.pas.


 
debuger ©   (2004-11-11 19:51) [25]

snx


 
xkiller   (2004-11-11 19:52) [26]

У меня все получилось! Событие возникает! Но как сделать чтобы оно выполнялось один раз после того как курсор выйдет за пределы Image, а не несколько раз? Я тут просто в событие OnMouseLeave поставил ShowMessage("Test"), так вот я эти все сообщения еле закрыл...:))) Можно конечно так:


var
b: boolean;

.....

procedure TForm1.MyImage1.MouseMove;
begin
b:=true;
end;

procedure TForm1.MyImage1.MouseLeave;
begin
if b=true then
 begin
 ShowMessage("Test");
 b:=false;
 end;
end;


но это в самой программе... а какнибудь в коде самого компонента можно это осуществить?


 
KilkennyCat ©   (2004-11-11 20:02) [27]

мда... showmessage - это просто лучше некуда...


 
Sun bittern ©   (2004-11-11 20:03) [28]

Поменяйте местами строки

ShowMessage("Test");
b:=false;


 
xkiller   (2004-11-11 20:04) [29]

KilkennyCat Я ради эксперимента :)


 
KilkennyCat ©   (2004-11-11 20:05) [30]


> xkiller   (11.11.04 20:04) [29]


это очень неудачный эксперимент, так как всплывающее окно забирает себе фокус, это раз, заставляет реагировать на него, это два. Могу еще добавить, но и этих двух вполне.


 
begin...end ©   (2004-11-11 20:08) [31]

xkiller   (11.11.04 19:52) [26]

Поставьте вместо ShowMessage что-нибудь другое. Например, Beep.


 
xkiller   (2004-11-11 20:08) [32]

У меня тут одна мысль пришла :) Можно ли создать компонент на основе Image... чтобы это была своего рода скинообразная кнопка? Т.е. по умолчанию у нее одна фотография, при наведении мышки другая (загорелась кнопочка), а при нажатии нажалась...:)


 
begin...end ©   (2004-11-11 20:15) [33]

xkiller   (11.11.04 20:08) [32]

Можно. Но лучше, ИМХО, создать на основе кнопки с картинкой - TSpeedButton, например.


 
grom   (2004-11-11 21:16) [34]

xkiller   (11.11.04 20:08) [32]
Скачай исходник Hit The Rat
http://delphigfx.mastak.ru/game.htm
и посмотри как там сделаны кнопки на основе Image



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.042 c
4-1097673559
AlexG
2004-10-13 17:19
2004.11.28
Application.ProcessMessages и обработка сообщений.


14-1100363592
Dimedrol
2004-11-13 19:33
2004.11.28
AVI-шки для TAnimate


3-1099224584
denis24
2004-10-31 15:09
2004.11.28
Поле типа OLE в базе mdb


4-1097814067
petvv
2004-10-15 08:21
2004.11.28
Просмотреть запущенные процессы, найти нужный и убить его


4-1097839922
Leaner
2004-10-15 15:32
2004.11.28
Местонахождение WINDOWS SYSTEM32 DRIVERS





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский