我继承TCustomComboBox后做了一个控件,叫TNoteCombo
TNoteCombo = class(TCustomComboBox)
private
...
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
published
...
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
在install component成功。
在我的程序里有如下代码
MyObj := TNoteCombo.Create (self);
(MyObj as TNoteCombo).OnMouseDown := CtrlMouseDown;
...procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Shift = [ssLeft] then //直接用鼠标左键点击
begin
showmessage('ok');
end;
if ...
...
end;问题是我在TNoteCombo上单击鼠标点击,反应都没,说明没执行上面的代码,何故?
TNoteCombo = class(TCustomComboBox)
private
...
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
...
published
...
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
在install component成功。
在我的程序里有如下代码
MyObj := TNoteCombo.Create (self);
(MyObj as TNoteCombo).OnMouseDown := CtrlMouseDown;
...procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Shift = [ssLeft] then //直接用鼠标左键点击
begin
showmessage('ok');
end;
if ...
...
end;问题是我在TNoteCombo上单击鼠标点击,反应都没,说明没执行上面的代码,何故?
procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
showmessage('ok');
end;
SHIFT是一个集合阿~集合能比较相等吗?你这样写不行吗?
if ssleft in shift then
...
----
根本不执行
procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Shift = [ssLeft] then //直接用鼠标左键点击
begin
showmessage('ok');
end;
if ...
...
end;
我还创建了另外一个控件
MyObj := TNoteEdit.Create (self);
(MyObj as TNoteEdit).OnMouseDown := CtrlMouseDown;就执行CtrlMouseDown
就是如下代码根本执行不到(设了断点,没停顿),
procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Shift = [ssLeft] then //直接用鼠标左键点击
begin
showmessage('ok');
end;
if ...
...
end;
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
这个属性,如果你的代码添加了断点之后没有执行,那么只有一种解释,那就是并没有给你的OnMouseDown属性赋上值,看下面的代码就清楚了
///////////////////////////////////////////////
procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True;
if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);
end;
////////////////////////////////////////////////
procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
////////////////////////////////////////
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
上面是程序得到windows传来的WM_LBUTTONDOWN等鼠标按下的消息时做的一系列反应,只看最后一个函数你就会明白,在鼠标单击之后,程序要先检查FOnMouseDown这个私有变量有没有赋值(这个私有变量记录的是OnMouseDown属性的处理函数的入口),如果赋值了就执行...
OnMouseDown:=Label1MouseDown;我的就可以啊。。MyObj.OnMouseDown := CtrlMouseDown;
这样写试试?
你可以把断点添加到VCL源码里面去看看,就是我给你的那三个函数就可以,然后定位了问题之后,别人才能帮你,你不说明白,大家都是在帮你猜问题,效率太低...
-----
断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢
你有QQ吗,想跟你聊聊。我的本意是在运行阶段能够调整控件的位置。
////////////
看来是我搞错了,确实没有办法添加断点。
我已经加了你的QQ,直接聊吧...
use Debug Dcus