我从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;

解决方案 »

  1.   

    在property里面声明property
      onmouseleave;
      onmouseenter;
      

  2.   

    声明出错,应该是这样:
    procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;Tlabel没有MouseLeave事件
      

  3.   

    To snowtiger2000(snowtiger) :
       你的声明是不是缺少重载关键字 OverrideTo Wally_wu(韦利):
       你的写法我也试过,系统还是提示找不到事件声明的定义!!!
       还有TLabel里有MouseLeave事件的!
      

  4.   

    如果你要在OnMouseEnter, OnMouseLeave里做自己的事
        procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
        procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
      

  5.   

    楼上,你这样好像是重新添加新的事件?
    为什么不能重载?
    Click就可以重载的!
      

  6.   

    你仔细看一下TCustomLabel怎样产生OnMouseEnter事件,它是响应CM_MOUSEENTER的
    procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
    begin
      inherited;
      if Assigned(FOnMouseEnter) then
        FOnMouseEnter(Self);
    end;Click是TControl的动态方法
     procedure Click; dynamic;
    当然就可以重载
      

  7.   

    请问xzgyb(老达摩):
        照你的意思,自己重新建立一个新的MouseMove事件,那么在设计时期的属性面板里面会不会出现两个相同的的MouseMove事件!
    例如:OnMouseMove(继承来的),OnFMouseMove(自己新增的)这种情况出现呢!
      

  8.   

    我不知你要的是什么效果
    你从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;
      

  9.   

    Sorry!
    是我没有说清楚!
    我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
    由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
      

  10.   

    Sorry!
    是我没有说清楚!
    我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
    由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
      

  11.   

    Sorry!
    是我没有说清楚!
    我继承的目的是想在鼠标处于Label上面时候,鼠标状态自动变成“一只手”的模样,离开Label的范围是变成原来的状态!就类似鼠标在网页连接出上面的样子,所以我必须在上面的两个事件编写代码!但是重载编译时出现了上面的错误!
    由于我是第一次写组件!其中不懂的地方敬请指正!谢谢!
      

  12.   

    明白了,不谢,其是这直接设置Label的Cursor就行了,但变一下字体的样子,就得
    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.
      

  13.   

    明白了,拦截Windows消息加以处理!
    但是CM_MOUSEENTER好像是指控件获得焦点,但是TLabel是无法得到焦点的,而我上面的做法主要是针对鼠标停留在TLabel上时改变鼠标形状!
    那么CM_MOUSEENTER应该改为CM_MOUSEMOVE是不是?
      

  14.   

    CM_MOUSEENTER是在当鼠标进入到TLabel的范围时Delphi内部发送的消息,而不是获得焦点
    不是标准的windows消息
    满足你的要求就是用这一消息
    而且CM_MOUSEMOVE是
    没有这一消息的