![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Мне нужно создать свой компонент наследник, скажем, 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
|
|||
|
|||
|
А чем тебе обработка сообщения не устраивает? Оно так и реализованно внутри.
|