我从TLabel继承写了一个自己的控件,其中继承了TLabel的OnClick、OnMouseMove和OnMouseLeave,但是编译时OnClick能够通过,而OnMouseMove和OnMouseLeave却无法通过,系统提示找不到这两个事件的定义!其中代码的写法是:
type
TCLabel = Class(TLabel)
...
Publice
procedure Click; override;
procedure MouseMove; override;
procedure MouseLeave; override;
...
end;procedure TCLabel.Clic;
begin
inherrited Click;
...
end;procedure TCLabel.MouseMove;
begin
inherrited MouseMovee;
...
end;procedure TCLabel.MouseLeave;
begin
inherrited MouseLeave;
...
end;
type
TCLabel = Class(TLabel)
...
Publice
procedure Click; override;
procedure MouseMove; override;
procedure MouseLeave; override;
...
end;procedure TCLabel.Clic;
begin
inherrited Click;
...
end;procedure TCLabel.MouseMove;
begin
inherrited MouseMovee;
...
end;procedure TCLabel.MouseLeave;
begin
inherrited MouseLeave;
...
end;
onmouseleave;
onmouseenter;
procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;Tlabel没有MouseLeave事件
你的声明是不是缺少重载关键字 OverrideTo Wally_wu(韦利):
你的写法我也试过,系统还是提示找不到事件声明的定义!!!
还有TLabel里有MouseLeave事件的!
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
为什么不能重载?
Click就可以重载的!
procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;Click是TControl的动态方法
procedure Click; dynamic;
当然就可以重载
照你的意思,自己重新建立一个新的MouseMove事件,那么在设计时期的属性面板里面会不会出现两个相同的的MouseMove事件!
例如:OnMouseMove(继承来的),OnFMouseMove(自己新增的)这种情况出现呢!
你从TLabel继承的话,TLabel的OnMouseEnter,OnMouseLeave都被Published出去
在设计期直接出现
另外
MouseMove不是事件,也是一个动态方法
procedure TControl.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseMove) then FOnMouseMove(Self, Shift, X, Y);
end;
实质就是调用FOnMouseMove,可能我刚才没理解你的意思,如果你想在鼠标移动时作自己的事
重载这个行,但你的那个缺参数 procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
是我没有说清楚!
我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
是我没有说清楚!
我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
是我没有说清楚!
我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
CM_MOUSEENTER,CM_MOUSELEAVE了unit Unit1Cursor;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMyLabel = class(TLabel)
private
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
constructor Create(AOwner: TComponent); override;
end;
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;implementation{$R *.dfm}{ TMyLabel }procedure TMyLabel.CMMouseEnter(var Message: TMessage);
begin
Font.Color := clBlue;
Font.Style := Font.Style + [fsUnderLine, fsItalic];
end;procedure TMyLabel.CMMouseLeave(var Message: TMessage);
begin
Font.Color := clBlack;
Font.Style := Font.Style - [fsUnderLine, fsItalic];
end;constructor TMyLabel.Create(AOwner: TComponent);
begin
inherited;
Cursor := crHandPoint;
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
with TMyLabel.Create(Self) do
begin
SetBounds(20, 30, 50, 50);
Caption := 'Hello, Hello';
Parent := Self;
end;
end;end.
但是CM_MOUSEENTER好像是指控件获得焦点,但是TLabel是无法得到焦点的,而我上面的做法主要是针对鼠标停留在TLabel上时改变鼠标形状!
那么CM_MOUSEENTER应该改为CM_MOUSEMOVE是不是?
不是标准的windows消息
满足你的要求就是用这一消息
而且CM_MOUSEMOVE是
没有这一消息的