Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.032 c
1-1079069069
Layner
2004-03-12 08:24
2004.03.28
Мастера, подскажите, как повесить "горячую клавишу" на процедуру.


14-1078404239
ISP
2004-03-04 15:43
2004.03.28
Skazem PHP - NET!


7-1072706569
andruxin
2003-12-29 17:02
2004.03.28
как отследить выключение монитора.


3-1076933565
Александр
2004-02-16 15:12
2004.03.28
LocateNext


3-1077710951
denmin
2004-02-25 15:09
2004.03.28
Проблема с Smalldatetime





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский