自制组件的事件为什么1次触发却执行2次 ( 积分: 300 )

  • 主题发起人 主题发起人 凤舞九天
  • 开始时间 开始时间

凤舞九天

Unregistered / Unconfirmed
GUEST, unregistred user!
TlpqButton = class(TSpeedButton)
private
FlpqMouseEnter : TNotifyEvent;
FlpqMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure paint;override;
published
property color;
property onLpqMouseEnter : TNotifyEvent read FlpqMouseEnter write FlpqMouseEnter;
end;

procedure TlpqButton.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FlpqMouseEnter) then FlpqMouseEnter(Self);
end;
procedure TlpqButton.paint;
begin
.........
end;

在程序中动态创建此btn,并赋给onMouseEnter事件后,每次鼠标进入,都会触发2次事件,不知道为什么,请大侠们帮帮忙,多谢
 
这样少代码,看不出问题。
 
就这些代码,没别的,再有就是vcl了
 
目前我加了一个FMouseIn的boolean变量 ,标志鼠标是否进入,
暂时解决了问题,但这个2次触发的原因实在是挠头
TLabel的实现和我的一样,但是就没有此问题。。。。。
 
就这个代码看起来没问题的。
你再把MOUSELEAVE事件写上看看有没有问题。
 
在我机器上这样的代码正常啊,不会触发两遍(XPSP2+D7SP1)

你在procedure TlpqButton.CMMouseEnter(var Message: TMessage);中将inherited;注释掉试试。
 
to ufo
leave事件已经加了,还是一样,进入触发2次,leave事件只触发一次
真是邪门,
我怀疑是speedbutton里的其他事件无意调用了此事件,代码太多,头疼。
哪位大侠给号号脉
 
应该没问题的,是不是别的地方调用了
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
procedure MyButtonEnter(Sender: TObject);
procedure MyButtonLeave(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyButton = class(TSpeedButton)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TMyButton }

procedure TMyButton.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;

procedure TMyButton.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyButton.Create(Self) do
begin
Parent := Self;
OnMouseEnter := MyButtonEnter;
OnMouseLeave := MyButtonLeave;
end;
end;

procedure TForm1.MyButtonEnter(Sender: TObject);
begin
Caption := Caption + 'a';
end;

procedure TForm1.MyButtonLeave(Sender: TObject);
begin
Caption := Caption + 'b';
end;

end.
 
呵呵,我来了,其实前面的朋友都说了,是调用的问题。只是没有仔细去看而已。
 
问题是speedbutton的flat:= true后,UpdateTrack触发了此事件,多谢诸位。
thanks to coldew
 

Similar threads

后退
顶部