请教:为什么我的控件不响应单击事件?

inforum 2005-06-13 10:06:04
我继承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上单击鼠标点击,反应都没,说明没执行上面的代码,何故?

...全文
294 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyguo 2005-06-16
  • 打赏
  • 举报
回复
断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢

把这一项选上就可以调VCL源码啦。。。不过还不是全部的源码,一些问题还是解决不了的,呵呵。


use Debug Dcus
inforum 2005-06-16
  • 打赏
  • 举报
回复
谁是高手,我把代码发给他调。
silentbug 2005-06-16
  • 打赏
  • 举报
回复
不明白,帮你顶!
何鲁青 2005-06-16
  • 打赏
  • 举报
回复
没找到毛病,UP...
inforum 2005-06-16
  • 打赏
  • 举报
回复
虽然问题没解决,分还是要给的
呵呵
inforum 2005-06-14
  • 打赏
  • 举报
回复
heluqing(鉴之小河〖挣大钱娶美女〗)
你有QQ吗,想跟你聊聊。

我的本意是在运行阶段能够调整控件的位置。
inforum 2005-06-14
  • 打赏
  • 举报
回复
heluqing(鉴之小河〖挣大钱娶美女〗) ( ) 信誉:100 2005-06-14 09:12:00 得分: 0


你可以把断点添加到VCL源码里面去看看,就是我给你的那三个函数就可以,然后定位了问题之后,别人才能帮你,你不说明白,大家都是在帮你猜问题,效率太低...


-----
断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢
lyguo 2005-06-14
  • 打赏
  • 举报
回复

OnMouseDown:=Label1MouseDown;

我的就可以啊。。

MyObj.OnMouseDown := CtrlMouseDown;
这样写试试?
herman~~ 2005-06-14
  • 打赏
  • 举报
回复
学习
何鲁青 2005-06-14
  • 打赏
  • 举报
回复
你可以把断点添加到VCL源码里面去看看,就是我给你的那三个函数就可以,然后定位了问题之后,别人才能帮你,你不说明白,大家都是在帮你猜问题,效率太低...
何鲁青 2005-06-14
  • 打赏
  • 举报
回复
TControl的下面定义的
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属性的处理函数的入口),如果赋值了就执行...
inforum 2005-06-14
  • 打赏
  • 举报
回复
这么简单的问题,没人会?
可怜我的分
何鲁青 2005-06-14
  • 打赏
  • 举报
回复
断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢
////////////
看来是我搞错了,确实没有办法添加断点。
我已经加了你的QQ,直接聊吧...
lovend 2005-06-13
  • 打赏
  • 举报
回复
帮你顶拉。
inforum 2005-06-13
  • 打赏
  • 举报
回复
单步跟踪一下看看
----
根本不执行
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
bluejing0 2005-06-13
  • 打赏
  • 举报
回复
if Shift = [ssLeft] then //直接用鼠标左键点击

这样写是不对的吧?
SHIFT是一个集合阿~集合能比较相等吗?

你这样写不行吗?
if ssleft in shift then
...
cnmaxu 2005-06-13
  • 打赏
  • 举报
回复
源码拿出来,帮你调一下。
lyguo 2005-06-13
  • 打赏
  • 举报
回复
单步跟踪一下看看
或用楼上的方法试试
cdsgajxlp 2005-06-13
  • 打赏
  • 举报
回复
看这样行不行
procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
showmessage('ok');
end;
inforum 2005-06-13
  • 打赏
  • 举报
回复
楼上诸位还没明白我的意思还是没讲清楚
就是如下代码根本执行不到(设了断点,没停顿),
procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Shift = [ssLeft] then //直接用鼠标左键点击
begin
showmessage('ok');
end;
if ...
...
end;

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧