Me da la impresión de que colocaste el código en los eventos y no en los manejadores de los mensajes.
Recuerda, los eventos son los que te asigna el IDE cuando das doble click sobre ellos en el inspector de objetos:
Código:
procedure MySpeedButton1MouseEnter(Sender: TObject);
begin
end;
procedure MySpeedButton1MouseLeave(Sender: TObject);
begin
end;
mientras que los manejadores de los mensajes son los que declaras en la componente:
Código:
type
TMySpeedButton = class(TSpeedButton)
private
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;
Los primeros- los eventos - viven en el formulario donde insertas la componente y por ello el compilador no reconoce términos como FOnMouseLeave pues éste pertenece a la componente y no al formulario.
Cuando comentas la línea el compilador no falla pero, dado que estás en el formulario, ClientRect se refiere a éste y no al SpeedButton y de ahí que te pinte el borde en el formulario.
Para que no te confundas ólvidate por ahora de los eventos y concéntrate en los mensajes. El código completo de la componente quedaría así:
Código:
unit MySpeedButton;
interface
uses
Windows, Messages, Classes, Controls, Buttons, Graphics;
type
TMySpeedButton = class(TSpeedButton)
private
procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMySpeedButton]);
end;
procedure TMySpeedButton.CMMouseEnter(var Msg: TMessage);
var
R: TRect;
begin
if not (csDesigning in ComponentState) then
begin
R := ClientRect;
InflateRect(R, -1, -1);
Canvas.Pen.Color := clYellow;
Canvas.Pen.Width := 2;
Canvas.Rectangle(R);
end;
end;
procedure TMySpeedButton.CMMouseLeave(var Msg: TMessage);
begin
Refresh;
end;
end.
Elimina la anterior e instala ésta. Prueba en un nuevo proyecto; si lo haces en donde ya hayas insertado la versión anterior te va a marcar un error por no encontrar OnMouseEnter y OnMouseLeave.
bye