Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];
ВнизКак написать обработчик 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c