Ver Mensaje Individual
  #8  
Antiguo 16-03-2005
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Reputación: 22
keyboy Va por buen camino
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
Responder Con Cita