Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-94989
azra3L
2003-04-01 09:06
2003.05.29
winsock


1-94840
etem
2003-05-19 17:32
2003.05.29
% в прогресс баре?


1-94870
Lin
2003-05-20 10:14
2003.05.29
Из string в TStringList


1-94833
BJValentine
2003-05-19 18:11
2003.05.29
Outlook Express


8-94979
real_dimedrol
2003-02-15 12:40
2003.05.29
Помогите разобраться со Scanline





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский