Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
ВнизКак можно определить момент выхода курсора мыши из компонента Найти похожие ветки
← →
TeNY © (2004-10-03 17:35) [0]Как можно определить момент выхода курсора мыши из компонента
← →
Рыба © (2004-10-03 18:07) [1]CMMouseLeave
← →
TeNY © (2004-10-03 18:45) [2]А подробнее пожалуйста...
:(
← →
TeNY © (2004-10-03 19:36) [3]Ни у одной кнопки нет события MouseLeave или CMMouseLeave
← →
KilkennyCat © (2004-10-03 19:38) [4]добавляем
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
← →
KilkennyCat © (2004-10-03 19:39) [5]
> TeNY © (03.10.04 19:36) [3]
вот в исходник компонента кнопки и добавляем... но лучше написать свой, отталкиваясь от стандартной кнопки.
← →
Zeqfreed © (2004-10-03 19:40) [6]
TForm1 = class(TForm)...
private
procedure CMMouseLeave(var Msg : TMessage); message CM_MouseLeave;
...
procedure TForm1.CMMouseLeave(var Msg : TMessage);
begin
//Здесь твои действия
end;
Писал наизусть... если что не так, извиняй ;)
← →
TeNY © (2004-10-04 05:57) [7]Спасибо!
← →
AlexV (2004-10-04 08:39) [8]А как обработать выход курсора мыши не из формы, а из некоторого другого компоненты, например, memo, который лежит на форме Form1
← →
piople © (2004-10-04 08:43) [9]
> AlexV
Создать данный обработчик события для Memo, который лежит на Form1 ;))))
← →
Wish © (2004-10-04 08:43) [10]Наверху же все написанно, просто подставб свой TMemo и наслаждайся жизнью! =)
← →
AlexV (2004-10-04 08:51) [11]Вот это меня и интересует, как именно создать этот обработчик не для формы, а для Memo.
← →
piople © (2004-10-04 08:54) [12]Удалено модератором
← →
AlexV (2004-10-04 08:56) [13]Ну не знаю, как это делать, что теперь :-(
← →
ЮЮ © (2004-10-04 09:13) [14]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMemo = class(StdCtrls.TMemo)
private
FOnMouseLeave: TNotifyEvent;
FOnMouseEnter: TNotifyEvent;
procedure CMMouseEnter(var Msg : TMessage); message CM_MouseEnter;
procedure CMMouseLeave(var Msg : TMessage); message CM_MouseLeave;
public
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
end;
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure Memo1OnMouseEnter(Sender: TObject);
procedure Memo1OnMouseLeave(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMemo }
procedure TMemo.CMMouseEnter(var Msg: TMessage);
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;
procedure TMemo.CMMouseLeave(var Msg: TMessage);
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;
procedure TForm1.Memo1OnMouseLeave(Sender: TObject);
begin
Caption := "... и выходит";
Memo1.Lines.Add("замечательно выходит");
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.OnMouseEnter := Memo1OnMouseEnter;
Memo1.OnMouseLeave := Memo1OnMouseLeave;
end;
procedure TForm1.Memo1OnMouseEnter(Sender: TObject);
begin
Caption := "Входит ...";
end;
end.
← →
AlexV (2004-10-04 09:40) [15]Спасибо ЮЮ
:-)
← →
TeNY © (2004-10-04 10:46) [16]Это всё очень хорошо,но как можно добавить это свойсво к самому компоненту а то у меня около 10ка кнопок и каждому писать ему обработчик...
Обьясните пожалуйста
← →
TeNY © (2004-10-04 12:10) [17]<><img scr="AY"><>
← →
begin...end © (2004-10-04 14:08) [18]
> [16] TeNY © (04.10.04 10:46)
> как можно добавить это свойсво к самому компоненту
Написать наследника, см. [14].
> каждому писать ему обработчик
Один и тот же обработчик можно назначить 10 кнопкам.
← →
TeNY © (2004-10-05 07:46) [19]А можно в таком случае (если один обработчик)получить от какой кнопки идет вызов.
И я не совсем понял что за см. [14].
← →
begin...end © (2004-10-05 08:06) [20]
> [19] TeNY © (05.10.04 07:46)
> А можно в таком случае (если один обработчик)получить от
> какой кнопки идет вызов.
Можно. Sender: TObject тебе ни о чём не говорит?
> И я не совсем понял что за см. [14].
См. пост № 14 ( ЮЮ © (04.10.04 09:13) )
← →
TeNY © (2004-10-05 08:40) [21]так это он создает компонент а просто добавил событие
а компонент создается в такой формеunit xxx;
interface
uses
xxx;
type
TXXX = class(TXXX)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Standard", [TActionManager1]);
end;
end.
а вот что куда писать чтобы в инспекторе обьектов появилось свойсво mouseleave я не знаяю вот и спрашиваю
← →
ЮЮ © (2004-10-05 09:17) [22]>а вот что куда писать чтобы в инспекторе обьектов появилось свойство
поместить в секцию published (а не в public, как в [14])
Но тогда, по-моему, не прокатит с
TMemo = class(StdCtrls.TMemo)
Класс придется называть иначе, дабы он появился на палитре компонентов, а стало быть правки будет гораздо больше - и в pas и в dfm, чтобы св-во появилось в инспекторе
← →
TeNY © (2004-10-05 19:08) [23]а как Sender: TObject пользоватся обьясните пожалуйста
← →
ЮЮ © (2004-10-06 03:45) [24]Sender - это объект, для которого выполняется код этого обработчика. Для доступа к св-вам этого объекта следеет привести его к нужному типу, удостоверившишь, что такое приведение типов допустимо, например
procedure TForm1.Memo1OnMouseEnter(Sender: TObject);
begin
Caption := "Вошли в объект класса " + Sender.ClassName;
if (Sender is TComponent) and (TComponent(Sender).Name <> "") then
Caption := Caption + " [" TComponent(Sender).Name + "]";
end;
← →
TeNY © (2004-10-06 07:13) [25]Понятно.А можно ли с помощью Sender организовать взаимодейсвие по следующему алгоритме к примеру есть 5 кнопок и у каждой есть обработчик типа BUTOnMouseEnter
...
procedure TForm1.BUTOnMouseEnter(Sender: TObject);
begin
goup(sender)
end;
procedure TForm1.goup(OBJECT: TObject);
begin
////
////
///
end;
procedure TForm1.BUTClick(Sender: TObject);
begin
ShowMessage("It"s OK!")
end;
так как нужно процедуру goup чтобы оно в зависимости от sender вызывала типа ОбьектЩелчок в данном случае BUTClick
← →
ЮЮ © (2004-10-06 07:51) [26]Даже при беглом взгляде видно, что методы Goup и BUTClick ничем не отличаются (за исключением кода), поэтому и вызываются одинаково :)
procedure TForm1.BUTOnMouseEnter(Sender: TObject);
begin
Goup(Sender);
BUTClick(Sender);
// или TButton(Sender).Click;
end;
В первом случае вызывается метод BUTClick, независимо, эта ли процедура назначена в качестве обработчика OnClick кнопки
Во втором же, вызывается именно тот обработчик, который назначен Sender-у
← →
TeNY © (2004-10-06 12:00) [27]А можно ли через sender определить какие сообщения отправляюстя компоненту в частности находится ли над ним мышь
← →
TeNY © (2004-10-06 13:25) [28]У меня возникла проблема следующего плана:Cozdaл компонентне основе SPSKINBUTTON добавив как сказано выше свойсво CM_mouseleave(надо сказать что у него уже было подобное свойсво только оно не работало),надо сказать что кнопка на которую наводиш курсор она цвет меняет,убираешь все возвращается в норму,так вот этого возвращения не происходит то есть событие обрабатывается только моим обработчиком.Вся проблема состоит в том что нет исходников этой кнопки.Так вот как сделать так что событие сначало обработалось одним обработчиком а затем передала упраление родному обработчику
← →
begin...end © (2004-10-06 13:27) [29]
> [28] TeNY © (06.10.04 13:25)
inherited
← →
TeNY © (2004-10-06 13:39) [30]подробнее пожалуйста,я никогда не созлавал своих компонентов поэтому всё в новинку
← →
TeNY © (2004-10-06 19:57) [31]Спасибо,вроде разобрался
← →
TeNY © (2004-10-07 06:08) [32]Ещё одна проблема в случае если в функции MouseLeave Стоит ShowMessage() то обработчик начиент бесконечно отрабатывать её до ошибки переполнения буфера,почему?
← →
ЮЮ © (2004-10-07 06:28) [33]значит убери ShowMessage. Вероятно код в этом обработчике опять приводит к посылке сообщения CM_MOUSELEAVE. А причина - в твоем коде, значит тебе ошибку и искать :)
← →
TeNY © (2004-10-07 11:43) [34]Код по вашему образцу писал, и кроме ShowMessage там ничего больше нет ...
← →
ЮЮ © (2004-10-08 04:42) [35]Может и по образцу, не работающий код все равно никому, кроме тебя не видно. Вот этот например, работает, как и ожидалось, и без рекурсий:
procedure TForm1.Memo1MouseEnter(Sender: TObject);
begin
Caption := "Âõîäèò ...";
Application.MessageBox("MouseEnter", "Memo1", 0);
end;
procedure TForm1.Memo1MouseLeave(Sender: TObject);
begin
Caption := "... è âûõîäèò";
Memo1.Lines.Add("çàìå÷àòåëüíî âûõîäèò");
Application.MessageBox("MouseLeave", "Memo1", 0);
end;
З.Ы. Дикое решение - на движение мыши выкидывать модальную форму: без Alt+F4 не выйти
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.034 c