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