|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Переопределение события MouseLeave в компоненте
Здравствуйте!
Мне нужно создать свой компонент наследник, скажем, TButton. При этом, если убираем курсор мыши, нужно, чтобы текст у кнопки изменился на другой. Для этого нужно переопределить событие MouseLeave. Так вот, если переопределять событие Click, то всё нормально, т.к. TButton имеет эту процедуру и ее можно переопределить. А что делать с MouseLeave? Код:
unit CountBtn; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TCountBtn = class(TButton) private FCount: integer; protected procedure Click;override; //<---здесь не ругается procedure MouseLeave; override; //<--здесь ругается public procedure ShowCount; published property Count:integer read FCount write FCount; constructor Create(aowner:Tcomponent); override; end; procedure Register; implementation procedure Register; begin RegisterComponents('Mihan Components', [TCountBtn]); end; constructor TCountBtn.Create(aowner:Tcomponent); begin inherited create(Aowner); end; procedure TCountBtn.MouseLeave; begin inherited mouseleave; //<---здесь ругается dec(fcount); end; procedure Tcountbtn.Click; begin inherited click; //<--- здесь не ругается. FCount:=FCount+1; end; procedure TCountBtn.ShowCount; begin Showmessage('По кнопке '+ caption+' вы сделали: '+inttostr(FCount)+' клик(а/ов)'); end; end. |
#2
|
|||
|
|||
Вообще, есть такой DoMouseLeave, но он "сидит" очень глубоко - в TWinControl. Просто обработай сообщение CM_MOUSELEAVE. Как-то так:
Код:
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TButton = class(Vcl.StdCtrls.TButton) private FLeaveCount : Integer; protected procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; TForm1 = class(TForm) Button1: TButton; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TButton } procedure TButton.CMMouseLeave(var Message: TMessage); begin inherited; Inc(FLeaveCount); Caption := Format('Leave %d',[FLeaveCount]); end; end. Что бы не создавать компонент и не регистрировать его, я просто засабклассил его прямо перед формой. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (22.03.2024)
|
#3
|
|||
|
|||
да, я думал над этим, но надеялся, что есть какой-то другой маневр.
|
#4
|
|||
|
|||
А чем тебе обработка сообщения не устраивает? Оно так и реализованно внутри.
|