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

解决方案 »

  1.   

    看这样行不行
    procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      showmessage('ok');
    end;
      

  2.   

    if Shift = [ssLeft] then //直接用鼠标左键点击这样写是不对的吧?
    SHIFT是一个集合阿~集合能比较相等吗?你这样写不行吗?
    if ssleft in shift then
    ...
      

  3.   

    单步跟踪一下看看
    ----
    根本不执行
    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
      

  4.   

    楼上诸位还没明白我的意思还是没讲清楚
    就是如下代码根本执行不到(设了断点,没停顿),
    procedure TForm1.CtrlMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Shift = [ssLeft] then //直接用鼠标左键点击
        begin
          showmessage('ok');
        end;
      if ...
      ...
    end;
      

  5.   

    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属性的处理函数的入口),如果赋值了就执行...
      

  6.   

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

  7.   


    OnMouseDown:=Label1MouseDown;我的就可以啊。。MyObj.OnMouseDown := CtrlMouseDown;
    这样写试试?
      

  8.   

    heluqing(鉴之小河〖挣大钱娶美女〗) ( ) 信誉:100  2005-06-14 09:12:00  得分: 0  
     
     
       你可以把断点添加到VCL源码里面去看看,就是我给你的那三个函数就可以,然后定位了问题之后,别人才能帮你,你不说明白,大家都是在帮你猜问题,效率太低...
      
     
    -----
    断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢
      

  9.   

    heluqing(鉴之小河〖挣大钱娶美女〗) 
    你有QQ吗,想跟你聊聊。我的本意是在运行阶段能够调整控件的位置。
      

  10.   

    断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢
    ////////////
    看来是我搞错了,确实没有办法添加断点。
    我已经加了你的QQ,直接聊吧...
      

  11.   

    断点设在这3处,但是断点符号是叉,那改如何给OnMouseDown属性赋上值呢把这一项选上就可以调VCL源码啦不过还不是全部的源码,一些问题还是解决不了的,呵呵。
    use Debug Dcus