Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Как можно определить момент выхода курсора мыши из компонента   Найти похожие ветки 

 
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 := "&#194;&#245;&#238;&#228;&#232;&#242; ...";
 Application.MessageBox("MouseEnter", "Memo1", 0);
end;

procedure TForm1.Memo1MouseLeave(Sender: TObject);
begin
 Caption := "... &#232; &#226;&#251;&#245;&#238;&#228;&#232;&#242;";
 Memo1.Lines.Add("&#231;&#224;&#236;&#229;&#247;&#224;&#242;&#229;&#235;&#252;&#237;&#238; &#226;&#251;&#245;&#238;&#228;&#232;&#242;");
 Application.MessageBox("MouseLeave", "Memo1", 0);
end;


З.Ы. Дикое решение - на движение мыши выкидывать модальную форму: без Alt+F4 не выйти



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

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.037 c
1-1097276047
saNat
2004-10-09 02:54
2004.10.24
StringGrid


14-1097133970
Aleksey V.P.
2004-10-07 11:26
2004.10.24
Глюк или я тормоз?


14-1096545927
Александр Иванов
2004-09-30 16:05
2004.10.24
Нужна консультация врача


1-1097505960
gigabyte
2004-10-11 18:46
2004.10.24
Как работать с Microsoft Agent?


3-1096350232
Нович[Ок]
2004-09-28 09:43
2004.10.24
Использование БД при написании системы "СКЛАД"