带OnMouseUp、OnMouseDown、OnMouseMove事件的TrackBar控件

来源:互联网 发布:清迈打车软件 编辑:程序博客网 时间:2024/06/05 02:18

 写一个播放器,用了Delphi自带的TTrackBar,实时显示当前播放进度,以及响应用户通过鼠标或者键盘来调整当前的播放进度。

    起初这两个事件我都是在TTrackBar.OnChange里处理的。然而实际使用当中你会发现,这样的播放效果是在是让人难以恭维,因为啥,你看看:

    我用一Timer来定期取当前的播放进度,在播放函数里:

    procedure OnPlay();

    begin

        TrackBar1.Position := FilePlayedPos;

    end;

    在Onchange里:

   procedure TTrackBar1.OnChange();

    begin

        FilePlayedPos := TrackBar1.Position;

    end;

    这样你看到了吧,在播放的时候同时触发了TrackBar的OnChange事件,而OnChange事件又调整了当前播放进度,那么实际的效果肯定是“卡”,卡的厉害。。。。。。

   回头想了想,总觉着在OnChange里手动调整播放进度不大合适,要是能够只在每次用户抬起鼠标左键这个事件里去实现似乎更加合理。然而让人费解的是,VCL里的TrackBar竟然没有OnMouse家族事件。得,这次可得想想法子。在TTrackBar上按着Ctrl加鼠标左键跳到了ComCtrls单元,原来TrackBar的老祖宗是TComponent->TControl->TWinControl,这下好办了,TComponent老祖宗那儿可都有这些个事件,只不过声明成了protected成员罢了,那么通过类继承方式来发布这些受保护的事件属性应该就是个可行的办法了。具体做法如下:

    首先写个单元:

   

unit untMyTrackBar;

interface

uses
  Classes, ComCtrls;

Type
  TDerryTrackBar = class(TTrackBar) //从   TTrackBar   类继承
  protected
  public
  published
    property OnMouseDown;  //声明   OnMouseDown
    property OnMouseUp;    //声明   OnMouseMove
    property OnMouseMove;  //声明   OnMouseUp
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Win32', [TDerryTrackBar]); //安装到   [Win32]   页中
end;

end.

    然后在你的工程中,选择“Componet->Install Component”选中这个单元编译一下,把这个控件注册到Win32面板上,哈哈,你看看在属性页面里是不是看到那可爱的OnMouse了?

    这个问题困扰了我半天,中间也曾心灰意冷打算换其他控件。可几经求证之后还是找到了解决办法。看来以后遇到问题还是要小心求证,不急不躁,顺藤摸瓜,坚持真理才对啊。。。。。。

转自:http://blog.csdn.net/derryzhang/article/details/1675784