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

Вниз

OnMouseLeave   Найти похожие ветки 

 
pasha_golub ©   (2004-03-11 12:51) [0]

Нету такого события у контролов. А странно, почему? И что каждый раз теперь писать procedure ...; WM_MOUSELEAVE;


 
Игорь Шевченко ©   (2004-03-11 13:18) [1]

CM_MOUSELEAVE


 
pasha_golub ©   (2004-03-11 13:20) [2]

Игорь Шевченко ©   (11.03.04 13:18) [1]
Это специально введенный Борландом идентификатор?


 
Игорь Шевченко ©   (2004-03-11 13:37) [3]

pasha_golub ©   (11.03.04 13:20)

Да. И сообщение собственно Борландовское, посылается из Application.Idle


 
pasha_golub ©   (2004-03-11 13:56) [4]

Игорь Шевченко ©   (11.03.04 13:37) [3]

Все-таки не вижу логики. OnMouseMove есть, а OnMouseEnter & OnMouseLeave нету.


 
Игорь Шевченко ©   (2004-03-11 14:13) [5]

pasha_golub ©   (11.03.04 13:56)

Это ко мне вопрос, насчет логики, или к Аллаху ?


 
MBo ©   (2004-03-11 14:37) [6]

>pasha_golub
Или делай наследника нужного контрола с отловом этих сообщений, или могу дать набросок компонентика-"присоски" для отслеживания.


 
pasha_golub ©   (2004-03-11 14:45) [7]

Игорь Шевченко ©   (11.03.04 14:13) [5]
Скорее к Аллаху. :-)

MBo ©   (11.03.04 14:37) [6]
Хотелось бы взглянуть на компонент. Спасибо.


 
MBo ©   (2004-03-11 14:50) [8]


unit MouseLeaveEnter;

interface

uses
 Classes, Controls, Messages;

type
 TMouseLeaveEnter = class(TComponent)
 private
   FActive: boolean;
   FControl: TControl;
   FOldWindowProc: TWndMethod;
   FOnMouseEnter: TNotifyEvent;
   FOnMouseLeave: TNotifyEvent;
   procedure SetActive(const Value: boolean);
   procedure SetControl(const Value: TControl);
   function GetControl: TControl;
   function GetActive: boolean;
   procedure SetWindowProc;
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation);
     override;
   procedure NewWindowProc(var Msg: TMessage);
 published
   property Active: boolean read GetActive write SetActive;
   property Control: TControl read GetControl write SetControl;
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter
     write FOnMouseEnter;
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave
     write FOnMouseLeave;
 end;

procedure Register;

implementation

procedure TMouseLeaveEnter.SetWindowProc;
begin
 FOldWindowProc := FControl.WindowProc;
 FControl.WindowProc := NewWindowProc;
end;

function TMouseLeaveEnter.GetActive: boolean;
begin
 Result := FActive;
end;

function TMouseLeaveEnter.GetControl: TControl;
begin
 Result := FControl;
end;

procedure TMouseLeaveEnter.Notification(AComponent: TComponent;
 Operation: TOperation);
begin
 inherited;
 if (AComponent = FControl) and (Operation = opRemove) then begin
   Control := nil;
   FActive := False;
 end;
end;

procedure TMouseLeaveEnter.SetActive(const Value: boolean);
begin
 if csLoading in ComponentState then
 begin
   FActive := Value;
   Exit;
 end;
 if FActive <> Value then
 begin
   if not Assigned(FControl) then
     Exit;
   if FActive then
     FControl.WindowProc := FOldWindowProc;
   FActive := Value;
   if FActive then
     SetWindowProc;
 end;
end;

procedure TMouseLeaveEnter.SetControl(const Value: TControl);
begin
 if FControl <> Value then
 begin
   if not (csLoading in ComponentState) then
   begin
     if Assigned(FControl) and FActive then
       FControl.WindowProc := FOldWindowProc;
   end;
   FControl := Value;
   if Assigned(FControl) then
   begin
     FControl.FreeNotification(Self);
     if Active then
       SetWindowProc;
   end;
 end;
end;

procedure TMouseLeaveEnter.NewWindowProc(var Msg: TMessage);
begin
 case Msg.Msg of
   CM_MouseLeave: if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
   CM_MouseEnter: if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
 else FOldWindowProc(Msg);
 end;
end;

procedure Register;
begin
 RegisterComponents("Samples", [TMouseLeaveEnter]);
end;

end.



 
MBo ©   (2004-03-11 14:50) [9]

пример использования в Run-Time (в design не тестировал)

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, MouseLeaveEnter, Buttons;

type
 TForm1 = class(TForm)
   SpeedButton1: TSpeedButton;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure SBEnter(Sender: TObject);
   procedure SBLeave(Sender: TObject);
 end;

var
 Form1: TForm1;
 mle: TMouseLeaveEnter;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 mle := TMouseLeaveEnter.Create(Self);
 mle.Control := SpeedButton1;
 mle.OnMouseEnter := SBEnter;
 mle.OnMouseLeave := SBLeave;
 mle.Active := True;
end;

procedure TForm1.SBEnter(Sender: TObject);
begin
 Caption := "Enter " + mle.Control.Name + " " + IntToStr(GetTickCount);
end;

procedure TForm1.SBLeave(Sender: TObject);
begin
 Caption := "Leave " + mle.Control.Name + " " + IntToStr(GetTickCount);
end;

end.



 
pasha_golub ©   (2004-03-11 15:05) [10]

MBo ©   (11.03.04 14:50) [8]
Элегантно. Спасибо.


 
Юрий Зотов ©   (2004-03-11 15:14) [11]

Вообще говоря, достаточно написать всего 2 метода самой формы - обработчики сообщений CM_MOUSEENTER и CM_MOUSELEAVE. Они будут вызываться при входе/выходе мыши не только для самой формы, но и для всех ее контролов. Sender сидит в параметре сообщения (в каком именно - не помню, надо уточнить в коде Controls.pas).


 
pasha_golub ©   (2004-03-11 15:24) [12]

Юрий Зотов ©   (11.03.04 15:14) [11]
Это понятно. Просто вопрос получился скорее риторический. Вроде часто используемые события. Почему их в VCL стандартно не вкрутили?


 
Юрий Зотов ©   (2004-03-11 15:30) [13]

> pasha_golub ©   (11.03.04 15:24) [12]

Сам удивляюсь. Казалось бы, вполне естественно было прикрутить их к TControl - ан, нет.


 
pasha_golub ©   (2004-03-11 15:54) [14]

Юрий Зотов ©   (11.03.04 15:30) [13]
Ну вот, и я к тому же. Мне вот надо людям объяснить на пальцах. А прийдется еще и о перехвате сообщений рассказывать.


 
WebErr ©   (2004-03-11 16:15) [15]

Есть такой Event, только название я никому не скажу, потому что это военная тайна!!! :))))


 
Sentinel ©   (2004-03-11 16:50) [16]


> WebErr ©   (11.03.04 16:15) [15]

Это какой-такой Event? Типа слабо тайну раскрыть?


 
pasha_golub ©   (2004-03-11 16:52) [17]

WebErr ©   (11.03.04 16:15) [15]

ФСБ? КГБ? АБВГД?



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

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

Наверх




Память: 0.51 MB
Время: 0.021 c
6-1074255192
Behemoth
2004-01-16 15:13
2004.03.28
TIdTCPServer - как узнать кол-во подключенных клиентов?


1-1078758642
Гарри Поттер
2004-03-08 18:10
2004.03.28
Поворот картинки


9-1062410426
Cyber Chaynik
2003-09-01 14:00
2004.03.28
3D на основе фото


1-1078673204
Алексей
2004-03-07 18:26
2004.03.28
Показ формы при координатах курсора 0;0


1-1078338627
able
2004-03-03 21:30
2004.03.28
TRIchEdit