Форум: "Основная";
Текущий архив: 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.046 c