Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2011, 12:04   #1
8adim
Пользователь
 
Регистрация: 25.01.2011
Сообщений: 12
Счастье Курсор мыши над формой

Хочу как-то словить событие, когда курсор мыши уходит с формы.
Кроме как по таймеру определять позицию мыши на экране и сравнивать с координатами формы,
ничего другого пока в голову не приходит.
8adim вне форума Ответить с цитированием
Старый 02.02.2011, 12:17   #2
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
  ReleaseCapture
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
  If GetCapture=0 then SetCapture(Form1.Handle);
  if PtInRect(Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, 
                                        Form1.Top + Form1.Height), ClientToScreen(Point(x, y))) 
    then Form1.Caption := 'Мышка на форме' 
    else Form1.Caption := 'Мышка за пределами формы'
end;
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 04.02.2011, 10:47   #3
8adim
Пользователь
 
Регистрация: 25.01.2011
Сообщений: 12
Печаль

Цитата:
Сообщение от Grag Посмотреть сообщение
Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
  ReleaseCapture
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
  If GetCapture=0 then SetCapture(Form1.Handle);
  if PtInRect(Rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width, 
                                        Form1.Top + Form1.Height), ClientToScreen(Point(x, y))) 
    then Form1.Caption := 'Мышка на форме' 
    else Form1.Caption := 'Мышка за пределами формы'
end;
Не срабатывает, когда вся форма завалена другими компонентами
8adim вне форума Ответить с цитированием
Старый 04.02.2011, 15:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А пожалуй по таймеру будет самое удобное. Честное слово.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.02.2011, 15:05   #5
ParaSenok
 
Регистрация: 03.08.2010
Сообщений: 9
По умолчанию

кидаешь на форму таймер

Код:
var point:tpoint;

procedure tform1.timer(sender:tobject);
var mousex,mousey:integer;
begin
  getcursorpos(point);
   MouseX:=point.X;
   MouseY:=point.Y;

 if (mousex<form1.left)or(mousex>form1.left+form1.Width) or
   (mousey<form1.top)or(mousey>form1.top+form1.Height)
    then caption:='за пределами формы' else
    caption:='курсор на форме';
end
по другому врятли получиться.. потому что компоненты на форме.. будут перекрывать саму форму..и так фиг отловишь

Последний раз редактировалось Stilet; 05.02.2011 в 14:03.
ParaSenok вне форума Ответить с цитированием
Старый 04.02.2011, 17:06   #6
8adim
Пользователь
 
Регистрация: 25.01.2011
Сообщений: 12
Хорошо

Цитата:
Сообщение от ParaSenok Посмотреть сообщение
кидаешь на форму таймер

var point:tpoint;

procedure tform1.timer(sender:tobject);
var mousex,mousey:integer;
begin
getcursorpos(point);
MouseX:=point.X;
MouseY:=point.Y;

if (mousex<form1.left)or(mousex>form1. left+form1.Width) or
(mousey<form1.top)or(mousey>form1.t op+form1.Height)
then caption:='за пределами формы' else
caption:='курсор на форме';
end


по другому врятли получиться.. потому что компоненты на форме.. будут перекрывать саму форму..и так фиг отловишь
Да, так и получилось через таймер.
Наиболее надежный способ.
Спасибо всем.
8adim вне форума Ответить с цитированием
Старый 05.02.2011, 12:35   #7
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

А не проще события использовать?
Код:
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
...
 
procedure TForm1.MouseLeave(var Msg: TMessage);
begin
  Caption:='Leave';
end;
 
procedure TForm1.MouseEnter(var Msg: TMessage);
begin
  Caption:='Enter';
end;
x128 вне форума Ответить с цитированием
Старый 05.02.2011, 14:04   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А не проще события использовать?
Не всегда. Иногда когда форму покрывают полностью другие контролы-контейнеры это событие просто может не наступить для формы, или если мышкой быстро двинуть оно так же может не наступить. ИМХО таймер тут самое оно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.02.2011, 09:43   #9
8adim
Пользователь
 
Регистрация: 25.01.2011
Сообщений: 12
Счастье

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не всегда. Иногда когда форму покрывают полностью другие контролы-контейнеры это событие просто может не наступить для формы, или если мышкой быстро двинуть оно так же может не наступить. ИМХО таймер тут самое оно.
Да, это был первый (неудачный) вариант, который я попробовал.
Как только мышь, двигаясь по форме, доползает до первого попавшегося Timage, для нее наступает событие MouseLeave, к сожалению.
8adim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие при нажатии кнопки мыши за формой Izlom Помощь студентам 4 21.07.2010 16:02
listbox над каким элементов находится курсор Gumer Компоненты Delphi 3 13.04.2010 19:08
курсор мыши у чужого окна STRELOK-2007 Общие вопросы Delphi 1 06.08.2009 23:17
Курсор мыши gfksx Общие вопросы C/C++ 4 21.04.2009 13:36
Курсор над DBGrid. Какая колонка? Nowichok Компоненты Delphi 3 05.02.2007 16:51