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

Вниз

Как написать обработчик CM_MouseLeave?   Найти похожие ветки 

 
Кирилл Ш.   (2003-05-19 10:38) [0]

Хочу доработать TImage. Добавив туда обработчик CM_MouseLeave? как правильнол написать? Я понимаю что вопрос старый, я и сам полгода назад писал и вроде работало, сейчас мучаюсь - никак не получается. Пожалуйста помогите. Код особенно приветствуется. спасибо.


 
Skier ©   (2003-05-19 10:52) [1]

>Кирилл Ш.
Это сообщение посылается наследникам TControl-а
Посмотри VCL...Примерно так будет...


type


TYourImage = class(...)
private
FOnMouseLeave : TNotifyEvent;
//..............
procedure CMMouseLeave(var Message: TMessage); message
CM_MOUSELEAVE;
//..............

published OnMouseLeave : TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end; //TYourImage

//..............................

procedure TControl.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;



 
Юрий Зотов ©   (2003-05-19 11:02) [2]

> Skier © (19.05.03 10:52)
Работать, конечно, будет, но с точки зрения стиля написания компонентов не совсем грамотно. Нужен метод диспетчеризации события.

> Кирилл Ш. (19.05.03 10:38)

В приведенном ниже тексте сделайте глобальную замену PaintBox на Image. Или на Label. Или на что-то еще. В общем, это шаблон для создания компонентов за полминуты методом Copy-Paste-Replace.

unit MyPaintBox;

interface

uses
Messages, Classes, Controls, ExtCtrls;

type
TMyPaintBox = class(TPaintBox)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure MouseEnter; dynamic;
procedure MouseLeave; dynamic;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

procedure Register;

implementation

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

{ TMyPaintBox }

procedure TMyPaintBox.CMMouseEnter(var Message: TMessage);
begin
inherited;
MouseEnter
end;

procedure TMyPaintBox.CMMouseLeave(var Message: TMessage);
begin
inherited;
MouseLeave
end;

procedure TMyPaintBox.MouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self)
end;

procedure TMyPaintBox.MouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self)
end;

end.


 
Skier ©   (2003-05-19 11:02) [3]

Опечатка...
procedure TYourImage.CMMouseLeave(var Message: TMessage);


 
Skier ©   (2003-05-19 11:06) [4]

>Юрий Зотов © (19.05.03 11:02)

> но с точки зрения стиля написания компонентов не совсем
> грамотно. Нужен метод диспетчеризации события.

А если без них, то это плохой стиль ?
Я так понимаю что если есть диспетчеризация события, то
это даёт возможность перекрыть его (MouseEnter & MouseLeave) в потомке ? Это здесь главное ?


 
Skier ©   (2003-05-19 13:45) [5]

Up


 
Юрий Зотов ©   (2003-05-19 13:56) [6]

> Skier © (19.05.03 11:06)
> если есть диспетчеризация события, то это даёт возможность
> перекрыть его (MouseEnter & MouseLeave) в потомке

Да, именно для того методы диспетчеризации и делаются. Обработка самого сообщения может быть достаточно сложной, может использовать приватные поля, глобальные переменные модуля и пр. Поэтому перекрывать обработчик самого сообщения в потомке может быть опасно, трудоемко, а иногда даже и невозможно (хотя и не запрещено, если надо - то никто не мешает). В то же время, перекрыв метод диспетчеризации, потомок может просто и безопасно встроить свой код в обработку события, и даже вообще это событие блокировать (если требуется).

Это и есть стиль Component Writer"а, а не прикладника (раз уж речь идет о написании компонента).


 
Skier ©   (2003-05-19 14:01) [7]

>Юрий Зотов © (19.05.03 13:56)
С этим я понял. Спасибо. Впредь буду учитывать...
Ещё один вопрос : является ли здесь принципиальным
использование именно dynamic, а не virtual ?


 
MBo ©   (2003-05-19 14:06) [8]

>принципиальным использование именно dynamic,
Экономия памяти - такие методы практически никогда не перекрываются.


 
Skier ©   (2003-05-19 14:09) [9]

>MBo © (19.05.03 14:06)

> Экономия памяти

Это-то понятно.
Просто может есть ещё какие-то причины,более хитрые...


 
Юрий Зотов ©   (2003-05-19 14:29) [10]

> Skier © (19.05.03 14:09)

Вроде бы, других причин нет. В конечном счете, для того динамические методы и сделаны.


 
Skier ©   (2003-05-19 14:31) [11]

>Юрий Зотов & MBo
Спасибо !



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
1-94798
Kettle of delphi
2003-05-18 22:20
2003.05.29
Вопрос о компоненте Chart (графики, закладка Additional).


1-94849
td
2003-05-18 23:59
2003.05.29
выход из формы при ошибке


14-95054
Aferist
2003-05-07 20:54
2003.05.29
СисАдмины.


1-94907
tv
2003-05-16 18:30
2003.05.29
Запрет перетаскивания окна


1-94838
I.Ru.Ru
2003-05-19 19:46
2003.05.29
Как поменять цвет заголовка компаненты TabSheet?