我想要给TScrollBar增加MouseUp事件,通过同名控件派生来实现。但不知为啥没有起作用,请各位大牛给看看哪错了。编译环境:D6, OS:XP SP3代码如下:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;type
  TScrollBar = class(StdCtrls.TScrollBar)
  private
    FOnMouseUp: TMouseEvent;
  protected
    // 重载一个方法
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  public
    // 新定义一个事件
    property On_MouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
  end;  TForm1 = class(TForm)
    sb: TScrollBar;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OnSBMouseUp(Sender: TObject;Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TScrollBar }
procedure TScrollBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  if Assigned(FOnMouseUp) then
     FOnMouseUp(Self, Button, Shift, X, Y);
end;{ TForm1 }
procedure TForm1.OnSBMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ShowMessage('2');//没执行到
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  // 新增加的事件在运行期动态关联
  sb.On_MouseUp := OnSBMouseUp;
end;end.

解决方案 »

  1.   

    mouseup没这么麻烦,直接在publish里加 property OnMouseUp;就行。
    这个只能捕获右键弹起,左键弹起的加procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;消息
      

  2.   

    我不是要重新写组件,我只是对原有组建加上一个鼠标事件。不值得写个组件注册吧?仅仅是个小修改。有个从同名控件派生派生的技巧,不知我的为啥不行?哪位Delphi大牛给看看
      

  3.   

    CSDN里没人会吗?看来这个技巧很少有人用啊 呵呵 搞笑
      

  4.   

    type
      TScrollBar = class(StdCtrls.TScrollBar)
      TForm1 = class(TForm)
        sb: TScrollBar;form里的控件,是ide加的,是有dfm和pas对应的,pas里知道有一个更近的同名类替换标准的类,但是dfm还不知道此控件的属性其实已经不是标准控件的属性了吧
        sb: TScrollBar;完全代码创建会不会好一点?我想给Ttreenode增加一个DataString:String;的属性,现在是通过修改标准unit实现的
      

  5.   


    这个是可行的. 只是楼主的控件是否响应这个代码的问题.因为有个例子是PAGECONTROL加双击的事件,是跟这代码差不多,只是多了一个构造函数,重写的构造函数里增了了双击的style. 即 controlstyle. 楼主可以试试从这方面着手.
      

  6.   

    加了构造函数也不行啊,代码如下。总感觉TScrollBar 没有响应到鼠标事件似的。constructor TScrollBar.Create(AOwner: TComponent);
    begin
      inherited;
      ControlStyle := [csClickEvents,csDoubleClicks];
    end;另外TForm1.FormCreate的构造函数也做了修改procedure TForm1.FormCreate(Sender: TObject);
    begin
      // 新增加的事件在运行期动态关联
      ScrollBar1 := TScrollBar.Create(Self);
      ScrollBar1.On_MouseUp := OnSBMouseUp;
    end;不是非得注册组件才行吧,本质上还是函数指针啊。感觉应该还是代码的问题,实在不会了,高手看看吧。
      

  7.   

    总好像那个重载的MouseUp方法没起作用