MMSpin.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:42k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 20.01.1998 - 18:00:00 $                                      =}
  24. {========================================================================}
  25. Unit MMSpin;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29. {$IFDEF WIN32}
  30.     Windows,
  31. {$ELSE}
  32.     WinTypes,
  33.     WinProcs,
  34. {$ENDIF}
  35.     SysUtils,
  36.     Messages,
  37.     Classes,
  38.     Graphics,
  39.     Controls,
  40.     Forms,
  41.     Dialogs,
  42.     ExtCtrls,
  43.     StdCtrls,
  44.     Menus,
  45.     Buttons,
  46.     MMSystem,
  47.     MMObj,
  48.     MMUtils,
  49.     MMString,
  50.     MMButton;
  51. type
  52.   TMMTimeBtnState = set of (tbFocusRect, tbAllowTimer, tbDragging);
  53.   TMMFocusStyle   = (fsNone,fsSolid,fsDot);
  54.   TMMOrientation  = (orVertical,orHorizontal);
  55.   {== TMMTimerSpeedButton ================================================}
  56.   TMMTimerSpeedButton = class(TMMSpeedButton)
  57.   private
  58.     FButtonFace  : Boolean;
  59.     FFocusColor  : TColor;
  60.     FFocusStyle  : TMMFocusStyle;
  61.     FRepeatTimer : TTimer;
  62.     FTimeBtnState: TMMTimeBtnState;
  63.     procedure TimerExpired(Sender: TObject);
  64.     procedure FocusLine(X1,Y1,X2,Y2: integer);
  65.     procedure SetButtonFace(aValue: Boolean);
  66.     procedure SetEnabled(aValue: Boolean);
  67.     function  GetEnabled: Boolean;
  68.   protected
  69.     procedure Paint; override;
  70.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  71.                         X, Y: Integer); override;
  72.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  73.                       X, Y: Integer); override;
  74.   public
  75.     constructor Create(aOwner: TComponent); override;
  76.     destructor Destroy; override;
  77.     property TimeBtnState: TMMTimeBtnState read FTimeBtnState write FTimeBtnState;
  78.     property FocusColor: TColor read FFocusColor write FFocusColor;
  79.     property FocusStyle: TMMFocusStyle read FFocusStyle write FFocusStyle default fsSolid;
  80.     property Enabled: Boolean read GetEnabled write SetEnabled default True;
  81.     property ButtonFace: Boolean read FButtonFace write SetButtonFace default False;
  82.   end;
  83.   {== TMMCustomSpinButton ===============================================}
  84.   TMMCustomSpinButton = class(TMMCustomControl)
  85.   private
  86.     FUpButton      : TMMTimerSpeedButton;
  87.     FDownButton    : TMMTimerSpeedButton;
  88.     FFastButton    : TMMTimerSpeedButton;
  89.     FFocusedButton : TMMTimerSpeedButton;
  90.     FFocusControl  : TWinControl;
  91.     FFocusColor    : TColor;
  92.     FFocusStyle    : TMMFocusStyle;
  93.     FButtonFace    : Boolean;
  94.     FMiddleButton  : Boolean;
  95.     FOrientation   : TMMOrientation;
  96.     FIncrement     : LongInt;
  97.     FMinValue      : LongInt;
  98.     FMaxValue      : LongInt;
  99.     FValue         : Longint;
  100.     FStartValue    : Longint;
  101.     FOldPos        : integer;
  102.     FOldWndProc     : TFarProc;
  103.     FHookWnd        : HWND;
  104.     FOnUpClick     : TNotifyEvent;
  105.     FOnDownClick   : TNotifyEvent;
  106.     FOnChange      : TNotifyEvent;
  107.     function  CreateButton: TMMTimerSpeedButton;
  108.     function  GetUpGlyph: TBitmap;
  109.     function  GetDownGlyph: TBitmap;
  110.     procedure SetUpGlyph(Value: TBitmap);
  111.     procedure SetUpNumGlyphs(Value: TNumGlyphs);
  112.     function  GetUpNumGlyphs: TNumGlyphs;
  113.     procedure SetDownGlyph(Value: TBitmap);
  114.     procedure SetDownNumGlyphs(Value: TNumGlyphs);
  115.     function  GetDownNumGlyphs: TNumGlyphs;
  116.     procedure SetFocusColor(Value: TColor);
  117.     procedure SetFocusStyle(Value: TMMFocusStyle);
  118.     procedure SetFocusControl(aControl: TWinControl);
  119.     procedure SetEnabled(Value: Boolean);
  120.     function  GetEnabled: Boolean;
  121.     procedure SetButtonFace(Value: Boolean);
  122.     procedure SetMiddleButton(Value: Boolean);
  123.     procedure SetOrientation(aValue: TMMOrientation);
  124.     procedure SetIncrement(aValue: Longint);
  125.     procedure SetMaxValue(aValue: Longint);
  126.     procedure SetMinValue(aValue: Longint);
  127.     procedure SetValue(aValue: Longint);
  128.     procedure BtnClick(Sender: TObject);
  129.     procedure BtnMouseDown(Sender: TObject; Button: TMouseButton;
  130.                            Shift: TShiftState; X, Y: Integer);
  131.     procedure BtnMouseMove(Sender: TObject; Shift: TShiftState;
  132.                            X, Y: Integer);
  133.     procedure BtnMouseUp(Sender: TObject; Button: TMouseButton;
  134.                          Shift: TShiftState; X, Y: Integer);
  135.     procedure SetFocusBtn(Btn: TMMTimerSpeedButton);
  136.     procedure UpdateMiddleButton;
  137.     procedure AdjustBounds;
  138.     procedure AdjustSize (var W, H: Integer);
  139.     procedure WMSize(var Message: TWMSize);  message WM_SIZE;
  140.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  141.     procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  142.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  143.     procedure HookWndProc(var Message : TMessage);
  144.     function  ProcessKeys(Wnd: HWND; Msg, Key: Word): Boolean;
  145.     procedure UpdateButtonState;
  146.   protected
  147.     procedure Loaded; override;
  148.     procedure Changed; override;
  149.     procedure Paint; override;
  150.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  151.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  152.     procedure Notification(aComponent: TComponent; Operation: TOperation); override ;
  153.     procedure UpClicked; dynamic;
  154.     procedure DownClicked; dynamic;
  155.     procedure Change; dynamic;
  156.   public
  157.     constructor Create(AOwner: TComponent); override;
  158.     destructor Destroy; override;
  159.     procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  160.     property  UpButton: TMMTimerSpeedButton read FUpButton write FUpButton;
  161.     property  DownButton: TMMTimerSpeedButton read FDownButton write FDownButton;
  162.     property  FocusStyle: TMMFocusStyle read FFocusStyle write SetFocusStyle default fsSolid;
  163.   protected
  164.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  165.     property OnDownClick: TNotifyEvent read FOnDownClick write FOnDownClick;
  166.     property OnUpClick: TNotifyEvent read FOnUpClick write FOnUpClick;
  167.     { Orientation must be the first }
  168.     property Orientation: TMMOrientation read FOrientation write SetOrientation default orVertical;
  169.     property DownGlyph: TBitmap read GetDownGlyph write SetDownGlyph;
  170.     property DownNumGlyphs: TNumGlyphs read GetDownNumGlyphs write SetDownNumGlyphs;
  171.     property Enabled: Boolean read GetEnabled write SetEnabled default True;
  172.     property FocusColor: TColor read FFocusColor write SetFocusColor default clBlack;
  173.     property FocusControl: TWinControl read FFocusControl write SetFocusControl;
  174.     property TabStop default True;
  175.     property UpGlyph: TBitmap read GetUpGlyph write SetUpGlyph;
  176.     property UpNumGlyphs: TNumGlyphs read GetUpNumGlyphs write SetUpNumGlyphs;
  177.     property Width default 21;
  178.     property Height default 28;
  179.     property ButtonFace: Boolean read FButtonFace write SetButtonFace default False;
  180.     property MiddleButton: Boolean read FMiddleButton write SetMiddleButton default False;
  181.     property Increment: Longint read FIncrement write SetIncrement default 1;
  182.     property MaxValue: LongInt read FMaxValue write SetMaxValue default 100;
  183.     property MinValue: LongInt read FMinValue write SetMinValue default 0;
  184.     property Value: Longint read FValue write SetValue default 0;
  185.   end;
  186.   {== TMMCustomSpinButton ===============================================}
  187.   TMMSpinButton = class(TMMCustomSpinButton)
  188.   published
  189.     property OnChange;
  190.     property OnDownClick;
  191.     property OnUpClick;
  192.     property Bevel;
  193.     property Orientation;
  194.     property DownGlyph;
  195.     property DownNumGlyphs;
  196.     property DragCursor;
  197.     property DragMode;
  198.     property Enabled;
  199.     property FocusColor;
  200.     property FocusControl;
  201.     property ParentShowHint;
  202.     property PopupMenu;
  203.     property ShowHint;
  204.     property TabStop;
  205.     property TabOrder;
  206.     property UpGlyph;
  207.     property UpNumGlyphs;
  208.     property Visible;
  209.     property Width;
  210.     property Height;
  211.     property ButtonFace;
  212.     property MiddleButton;
  213.     property Increment;
  214.     property MaxValue;
  215.     property MinValue;
  216.     property Value;
  217.   end;
  218. implementation
  219. {$IFDEF WIN32}
  220.   {$R MMSPIN.D32}
  221. {$ELSE}
  222.   {$R MMSPIN.D16}
  223. {$ENDIF}
  224. const
  225.      InitialPause = 400;  { time in ms before first repeat occurs }
  226.      RepeatPause  = 50;   { time in ms between subsequent repeats }
  227.      HookList: TList = nil;
  228. {== TMMTimerSpeedButton ==================================================}
  229. constructor TMMTimerSpeedButton.Create(aOwner: TComponent);
  230. begin
  231.      inherited Create(aOwner);
  232.      FFocusColor := clBlack;
  233.      FFocusStyle := fsSolid;
  234.      FRepeatTimer:= Nil;
  235.      FButtonFace := False;
  236.      Enabled := True;
  237. end;
  238. {-- TMMTimerSpeedButton --------------------------------------------------}
  239. destructor TMMTimerSpeedButton.Destroy;
  240. begin
  241.      if (FRepeatTimer <> Nil) then
  242.         FRepeatTimer.Free;
  243.      inherited Destroy;
  244. end;
  245. {-- TMMTimerSpeedButton --------------------------------------------------}
  246. procedure TMMTimerSpeedButton.SetButtonFace(aValue: Boolean);
  247. begin
  248.    if (aValue <> FButtonFace) then
  249.    begin
  250.       FButtonFace := aValue;
  251.       Invalidate;
  252.    end;
  253. end;
  254. {-- TMMTimerSpeedButton --------------------------------------------------}
  255. procedure TMMTimerSpeedButton.SetEnabled(aValue: Boolean);
  256. begin
  257.      if (aValue <> inherited Enabled) then
  258.      begin
  259.           {$IFNDEF BUILD_ACTIVEX}
  260.           if Not (csDesigning in ComponentState) then
  261.           begin
  262.                { Win31 makes problems without this }
  263.                if (Parent <> Nil) And (FState = bsDown) then
  264.                begin
  265.                     Parent.Enabled := not Parent.Enabled;
  266.                     Parent.Enabled := not Parent.Enabled;
  267.                     Parent.SetFocus;
  268.                end;
  269.           end;
  270.           {$ENDIF}
  271.           inherited Enabled := aValue;
  272.      end;
  273. end;
  274. {-- TMMTimerSpeedButton --------------------------------------------------}
  275. function TMMTimerSpeedButton.GetEnabled: Boolean;
  276. begin
  277.      Result := inherited Enabled;
  278. end;
  279. {-- TMMTimerSpeedButton --------------------------------------------------}
  280. procedure TMMTimerSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
  281.   X, Y: Integer);
  282. begin
  283.      inherited MouseDown (Button, Shift, X, Y);
  284.      if tbAllowTimer in FTimeBtnState then
  285.      begin
  286.           if (FRepeatTimer = Nil) then
  287.           begin
  288.              FRepeatTimer := TTimer.Create(Self);
  289.              FRepeatTimer.OnTimer := TimerExpired;
  290.           end;
  291.           FRepeatTimer.Interval := InitialPause;
  292.           FRepeatTimer.Enabled  := True;
  293.      end;
  294. end;
  295. {-- TMMTimerSpeedButton --------------------------------------------------}
  296. procedure TMMTimerSpeedButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  297.                                   X, Y: Integer);
  298. begin
  299.      inherited MouseUp (Button, Shift, X, Y);
  300.      FRepeatTimer.Free;
  301.      FRepeatTimer := Nil;
  302. end;
  303. {-- TMMTimerSpeedButton --------------------------------------------------}
  304. procedure TMMTimerSpeedButton.TimerExpired(Sender: TObject);
  305. begin
  306.      FRepeatTimer.Interval := RepeatPause;
  307.      if (FState = bsDown) And MouseCapture then
  308.      begin
  309.           try
  310.              Click;
  311.           except
  312.              FRepeatTimer.Enabled := False;
  313.              raise;
  314.           end;
  315.      end;
  316. end;
  317. {-- TMMTimerSpeedButton --------------------------------------------------}
  318. procedure TMMTimerSpeedButton.FocusLine(X1,Y1,X2,Y2: integer);
  319. Var
  320.    i: integer;
  321. begin
  322.    if (FFocusStyle = fsDot) then
  323.    begin
  324.      if (X1 = X2) then
  325.      begin
  326.           i := Y1;
  327.           while i < Y2 do
  328.           begin
  329.                Canvas.Pixels[X1, i] := FFocusColor;
  330.                inc(i,2)
  331.           end;
  332.      end
  333.      else if (Y1 = Y2) then
  334.      begin
  335.           i := X1;
  336.           while i < X2 do
  337.           begin
  338.                Canvas.Pixels[i, Y1] := FFocusColor;
  339.                inc(i,2)
  340.           end;
  341.      end;
  342.    end
  343.    else if (FFocusStyle = fsSolid) then
  344.    begin
  345.         Canvas.MoveTo(X1, Y1);
  346.         Canvas.LineTo(X2, Y2);
  347.    end;
  348. end;
  349. {-- TMMTimerSpeedButton --------------------------------------------------}
  350. procedure TMMTimerSpeedButton.Paint;
  351. Var
  352.    R: TRect;
  353. begin
  354.    if (Not Enabled) And Not(csDesigning in ComponentState) then
  355.    begin
  356.       FState := bsDisabled;
  357.       FDragging := False;
  358.    end
  359.    else if FState = bsDisabled then
  360.    FState := bsUp;
  361.    with Canvas do
  362.    begin
  363.       R := ClientRect;
  364.       Brush.Color := clBtnFace;
  365.       FillRect(R);
  366.       if FButtonFace then
  367.       begin
  368.          if (FState in [bsDown]) or (tbDragging in FTimeBtnState) then
  369.          begin
  370.             OffsetRect(R,1,1);
  371.             DrawGlyph(Canvas, R);
  372.             OffsetRect(R,-1,-1);
  373.             Frame3D(Canvas, R, clBtnShadow, clBtnFace, 1);
  374.             Pixels[R.Left-1,R.Bottom] := clBtnShadow;
  375.             Pixels[R.Right,R.Top-1] := clBtnShadow;
  376.          end
  377.          else
  378.          begin
  379.             Frame3D(Canvas, R, clBtnHighLight,clBtnShadow,1);
  380.             DrawGlyph(Canvas, R);
  381.          end;
  382.       end
  383.       else DrawGlyph(Canvas, R);
  384.       if Parent.Focused and not TMMCustomSpinButton(Parent).FButtonFace then
  385.       begin
  386.          R := Bounds(0, 0, Width-1, Height-1);
  387.          InflateRect(R, -1, -1);
  388.          Pen.Color := FFocusColor;
  389.          if (TMMCustomSpinButton(Parent).Orientation = orVertical) then
  390.          begin
  391.             if (Self = TMMCustomSpinButton(Parent).FUpButton) then
  392.             begin
  393.                FocusLine(R.Left, R.Top, R.Left, R.Bottom+2);
  394.                FocusLine(R.Left+1, R.Top, R.Right, R.Top);
  395.                FocusLine(R.Right, R.Top, R.Right, R.Bottom+2);
  396.             end
  397.             else if (Self = TMMCustomSpinButton(Parent).FDownButton) then
  398.             begin
  399.                FocusLine(R.Left, R.Top-1, R.Left, R.Bottom);
  400.                FocusLine(R.Left, R.Bottom, R.Right+1, R.Bottom);
  401.                FocusLine(R.Right, R.Top-1, R.Right, R.Bottom);
  402.             end
  403.             else
  404.             begin
  405.                R := Bounds(0, 0, Width-1, Height-1);
  406.                FocusLine(R.Left, R.Top, R.Left, R.Bottom+1);
  407.                FocusLine(R.Right, R.Top, R.Right, R.Bottom+1);
  408.             end;
  409.          end
  410.          else
  411.          begin
  412.             if (Self = TMMCustomSpinButton(Parent).FUpButton) then
  413.             begin
  414.                FocusLine(R.Left-1, R.Top, R.Right+1, R.Top);
  415.                FocusLine(R.Right, R.Top, R.Right, R.Bottom);
  416.                FocusLine(R.Left-1, R.Bottom, R.Right+1, R.Bottom);
  417.             end
  418.             else if (Self = TMMCustomSpinButton(Parent).FDownButton) then
  419.             begin
  420.                FocusLine(R.Left, R.Top, R.Right+2, R.Top);
  421.                FocusLine(R.Left, R.Top, R.Left, R.Bottom);
  422.                FocusLine(R.Left, R.Bottom, R.Right+2, R.Bottom);
  423.             end
  424.             else
  425.             begin
  426.                R := Bounds(0, 0, Width-1, Height-1);
  427.                FocusLine(R.Left, R.Top, R.Right+1, R.Top);
  428.                FocusLine(R.Left, R.Bottom, R.Right+1, R.Bottom);
  429.             end;
  430.          end;
  431.       end;
  432.    end;
  433. end;
  434. {== TMMCustomSpinButton =================================================}
  435. constructor TMMCustomSpinButton.Create(AOwner: TComponent);
  436. begin
  437.      inherited Create(AOwner);
  438.      ControlStyle := ControlStyle - [csAcceptsControls, csSetCaption,csDoubleClicks];
  439.      FValue := 0;
  440.      FMinValue := 0;
  441.      FMaxValue := 100;
  442.      FIncrement := 1;
  443.      FFocusColor := clBlack;
  444.      FFocusStyle := fsSolid;
  445.      FButtonFace := False;
  446.      FMiddleButton := False;
  447.      FUpButton := CreateButton;
  448.      FDownButton := CreateButton;
  449.      FDownButton.Enabled := False;
  450.      FFastButton := nil;
  451.      FOrientation := orVertical;
  452.      UpGlyph := nil;
  453.      DownGlyph := nil;
  454.      FOldWndProc := nil;
  455.      FHookWnd    := 0;
  456.      Enabled := True;
  457.      Width := 21;
  458.      Height := 28;
  459.      FFocusedButton := FUpButton;
  460.      TabStop := True;
  461.      ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
  462.      if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
  463. end;
  464. {-- TMMCustomSpinButton -------------------------------------------------}
  465. destructor TMMCustomSpinButton.Destroy;
  466. begin
  467.    FocusControl := nil;
  468.    inherited Destroy;
  469. end;
  470. {-- TMMCustomSpinButton -------------------------------------------------}
  471. procedure TMMCustomSpinButton.Notification(aComponent: TComponent; Operation: TOperation);
  472. begin
  473.    inherited Notification(aComponent,Operation);
  474.    if (Operation = opRemove) then
  475.    begin
  476.       if FocusControl = aComponent then FocusControl := nil;
  477.    end;
  478. end;
  479. {-- TMMCustomSpinButton -------------------------------------------------}
  480. procedure TMMCustomSpinButton.HookWndProc(var Message: TMessage);
  481.    procedure Default;
  482.    begin
  483.       with Message do
  484.       Result := CallWindowProc(FOldWndProc,FHookWnd,Msg,wParam,lParam);
  485.    end;
  486. begin
  487.    with Message do
  488.    begin
  489.       if (csLButtonDown in FUpButton.ControlState) or
  490.          (csLButtonDown in FDownButton.ControlState) or
  491.          not ProcessKeys(FHookWnd,Msg, wParam) then default;
  492.    end;
  493. end;
  494. {-- TMMCustomSpinButton -------------------------------------------------}
  495. function TMMCustomSpinButton.ProcessKeys(Wnd: HWND; Msg, Key: Word): Boolean;
  496. begin
  497.     Result := True;
  498.     begin
  499.        case Msg of
  500.         WM_KEYDOWN:
  501.              if ((Key = VK_UP) and (FOrientation = orVertical)) or
  502.                 ((Key = VK_RIGHT) and (FOrientation = orHorizontal)) then
  503.              begin
  504.                 SetFocusBtn(FUpButton);
  505.                 if (bsDown <> FUpButton.FState) and FUpButton.Enabled then
  506.                 begin
  507.                    FUpButton.FState := bsDown;
  508.                    FUpButton.Refresh;
  509.                 end;
  510.                 FUpButton.Click;
  511.                 exit;
  512.              end
  513.              else if ((Key = VK_DOWN) and (FOrientation = orVertical)) or
  514.                      ((Key = VK_LEFT) and (FOrientation = orHorizontal)) then
  515.              begin
  516.                 SetFocusBtn(FDownButton);
  517.                 if (bsDown <> FDownButton.FState)  and FDownButton.Enabled then
  518.                 begin
  519.                    FDownButton.FState := bsDown;
  520.                    FDownButton.Refresh;
  521.                 end;
  522.                 FDownButton.Click;
  523.                 exit;
  524.              end;
  525.           WM_KEYUP:
  526.              case Key of
  527.                  VK_UP,
  528.                  VK_DOWN,
  529.                  VK_LEFT,
  530.                  VK_RIGHT:
  531.                  if (FFocusedButton <> nil) then
  532.                  begin
  533.                     FFocusedButton.FState := bsUp;
  534.                     FFocusedButton.Refresh;
  535.                     exit;
  536.                  end;
  537.              end;
  538.           VK_SPACE: if (Wnd = Handle) then FFocusedButton.Click;
  539.        end;
  540.     end;
  541.     Result := False;
  542. end;
  543. {-- TMMCustomSpinButton -------------------------------------------------}
  544. function TMMCustomSpinButton.CreateButton: TMMTimerSpeedButton;
  545. begin
  546.      Result := TMMTimerSpeedButton.Create(Self);
  547.      Result.Parent        := Self;
  548.      Result.OnClick       := BtnClick;
  549.      Result.OnMouseDown   := BtnMouseDown;
  550.      Result.OnMouseUp     := BtnMouseUp;
  551.      Result.OnMouseMove   := BtnMouseMove;
  552.      Result.Visible       := True;
  553.      Result.ParentShowHint:= False;
  554.      Result.TimeBtnState  := [tbAllowTimer];
  555.      Result.NumGlyphs     := 1;
  556.      Result.Enabled       := True;
  557. end;
  558. {-- TMMCustomSpinButton -------------------------------------------------}
  559. procedure TMMCustomSpinButton.UpdateMiddleButton;
  560. begin
  561.    if FMiddleButton and (FFastButton <> nil) then
  562.    begin
  563.       FFastButton.Enabled     := Enabled;
  564.       FFastButton.ButtonFace  := True;
  565.       FFastButton.FocusColor  := FFocusColor;
  566.       FFastButton.FocusStyle  := FFocusStyle;
  567.       FFastButton.TimeBtnState:= [];
  568.    end;
  569. end;
  570. {-- TMMCustomSpinButton -------------------------------------------------}
  571. procedure TMMCustomSpinButton.SetMiddleButton(Value: Boolean);
  572. begin
  573.    if (Value <> FMiddleButton) then
  574.    begin
  575.       if (FFastButton <> nil) then
  576.       begin
  577.          FFastButton.Free;
  578.          FFastButton := nil;
  579.       end;
  580.       FMiddleButton := Value;
  581.       if FMiddleButton then
  582.       begin
  583.          FFastButton := CreateButton;
  584.          FFastButton.GroupIndex := 0;
  585.          FFastButton.Glyph := nil;
  586.          UpdateMiddleButton;
  587.       end;
  588.       AdjustBounds;
  589.    end;
  590. end;
  591. {-- TMMCustomSpinButton -------------------------------------------------}
  592. procedure TMMCustomSpinButton.SetFocusControl(aControl: TWinControl);
  593. begin
  594.    if (aControl <> FFocusControl) then
  595.    begin
  596.       { unhook the controls WndProc }
  597.       if FHookWnd <> 0 then
  598.       begin
  599.          FreeObjectInstance(TFarProc(SetWindowLong(FHookWnd,GWL_WNDPROC,LongInt(FOldWndProc))));
  600.          FHookWnd := 0;
  601.          if (FFocusControl <> nil) and (HookList <> nil) then
  602.          begin
  603.             HookList.Remove(FFocusControl);
  604.             HookList.Pack;
  605.             if (HookList.Count = 0) then
  606.             begin
  607.                HookList.Free;
  608.                HookList := nil;
  609.             end;
  610.          end;
  611.       end;
  612.       FFocusControl := aControl;
  613.       if (FFocusControl <> nil) and (FFocusControl is TCustomEdit) then
  614.       begin
  615.          { is Control already Hooked ? }
  616.          if (HookList <> nil) and (HookList.IndexOf(FFocusControl) >= 0) then
  617.          begin
  618.             FFocusControl := nil;
  619.             MessageDlg('Control is already Hooked', mtError, [mbOK],0);
  620.             exit;
  621.          end;
  622.          if (HookList = nil) then HookList := TList.Create;
  623.          { Add the control to the Hook list }
  624.          HookList.Add(FFocusControl);
  625.          { hook the controls WndProc }
  626.          FHookWnd    := FFocusControl.Handle;
  627.          FOldWndProc := TFarProc(SetWindowLong(FHookWnd,GWL_WNDPROC,
  628.                         LongInt(MakeObjectInstance(HookWndProc))));
  629.       end;
  630.    end;
  631. end;
  632. {-- TMMCustomSpinButton -------------------------------------------------}
  633. procedure TMMCustomSpinButton.SetOrientation(aValue: TMMOrientation);
  634. begin
  635.    if (aValue <> FOrientation) then
  636.    begin
  637.       FOrientation := aValue;
  638.       if (csDesigning in ComponentState) then
  639.       begin
  640.          UpGlyph      := nil;
  641.          DownGlyph    := nil;
  642.       end;
  643.       AdjustBounds;
  644.    end;
  645. end;
  646. {-- TMMCustomSpinButton -------------------------------------------------}
  647. procedure TMMCustomSpinButton.AdjustSize (var W, H: Integer);
  648. var
  649.    Bev,Size: integer;
  650. begin
  651.      if (FUpButton = nil) or
  652.         (csLoading in ComponentState) or
  653.         (csReading in ComponentState) then Exit;
  654.      Bev := BevelExtend;
  655.      if (FOrientation = orVertical) then
  656.      begin
  657.         if FButtonFace then
  658.         begin
  659.            if FMiddleButton then
  660.            begin
  661.               Size := 5;
  662.               W := Max(W,2*Bev+2+UpGlyph.Width div UpNumGlyphs);
  663.               H := Max(H,2*Bev+4+UpGlyph.Height+DownGlyph.Height+1+Size);
  664.               FUpButton.SetBounds(Bev, Bev, W-2*Bev, (H-2*Bev-Size) div 2);
  665.               FDownButton.SetBounds(Bev, FUpButton.Height+Bev+1+Size, W-2*Bev, (H-2*Bev-Size) - FUpButton.Height-1);
  666.               FFastButton.SetBounds(Bev, FUpButton.Height+Bev+1, W-2*Bev, Size-1);
  667.            end
  668.            else
  669.            begin
  670.               W := Max(W,2*Bev+2+UpGlyph.Width div UpNumGlyphs);
  671.               H := Max(H,2*Bev+4+UpGlyph.Height+DownGlyph.Height+1);
  672.               FUpButton.SetBounds(Bev, Bev, W-2*Bev, (H-2*Bev) div 2);
  673.               FDownButton.SetBounds(Bev, FUpButton.Height+Bev+1, W-2*Bev, (H-2*Bev) - FUpButton.Height-1);
  674.            end;
  675.         end
  676.         else
  677.         begin
  678.            if FMiddleButton then
  679.            begin
  680.               Size := 6;
  681.               W := Max(W,2*Bev+UpGlyph.Width div UpNumGlyphs);
  682.               H := Max(H,2*Bev+UpGlyph.Height+DownGlyph.Height+Size);
  683.               FUpButton.SetBounds (Bev, Bev, W-2*Bev, (H-2*Bev-Size) div 2);
  684.               FDownButton.SetBounds (Bev, FUpButton.Height+Bev+Size, W-2*Bev, (H-2*Bev-Size) - FUpButton.Height);
  685.               FFastButton.SetBounds(Bev+1, FUpButton.Height+Bev+1, W-2*Bev-2, Size-2);
  686.            end
  687.            else
  688.            begin
  689.               W := Max(W,2*Bev+UpGlyph.Width div UpNumGlyphs);
  690.               H := Max(H,2*Bev+UpGlyph.Height+DownGlyph.Height);
  691.               FUpButton.SetBounds (Bev, Bev, W-2*Bev, (H-2*Bev) div 2);
  692.               FDownButton.SetBounds (Bev, FUpButton.Height+Bev, W-2*Bev, (H-2*Bev) - FUpButton.Height);
  693.            end;
  694.         end;
  695.      end
  696.      else
  697.      begin
  698.         if FButtonFace then
  699.         begin
  700.            if FMiddleButton then
  701.            begin
  702.               Size := 5;
  703.               W := Max(W,2*Bev+4+DownGlyph.Width div DownNumGlyphs+UpGlyph.Width div UpNumGlyphs+1+Size);
  704.               H := Max(H,2*Bev+2+DownGlyph.Height);
  705.               FDownButton.SetBounds(Bev, Bev, (W-2*Bev-Size) div 2, H-2*Bev);
  706.               FUpButton.SetBounds(Bev+FDownButton.Width+1+Size, Bev, (W-2*Bev-Size)-FDownButton.Width-1, H-2*Bev);
  707.               FFastButton.SetBounds(Bev+FDownButton.Width+1, Bev, Size-1, H-2*Bev);
  708.            end
  709.            else
  710.            begin
  711.               W := Max(W,2*Bev+4+DownGlyph.Width div DownNumGlyphs+UpGlyph.Width div UpNumGlyphs+1);
  712.               H := Max(H,2*Bev+2+DownGlyph.Height);
  713.               FDownButton.SetBounds(Bev, Bev, (W-2*Bev) div 2, H-2*Bev);
  714.               FUpButton.SetBounds(Bev+FDownButton.Width+1, Bev, (W-2*Bev)-FDownButton.Width-1, H-2*Bev);
  715.            end;
  716.         end
  717.         else
  718.         begin
  719.            if FMiddleButton then
  720.            begin
  721.               Size := 6;
  722.               W := Max(W,2*Bev+DownGlyph.Width div DownNumGlyphs+UpGlyph.Width div UpNumGlyphs+Size);
  723.               H := Max(H,2*Bev+DownGlyph.Height);
  724.               FDownButton.SetBounds(Bev, Bev, (W-2*Bev-Size) div 2, H-2*Bev);
  725.               FUpButton.SetBounds(Bev+FDownButton.Width+Size, Bev, (W-2*Bev-Size)-FDownButton.Width, H-2*Bev);
  726.               FFastButton.SetBounds(Bev+FDownButton.Width+1, Bev+1, Size-2, H-2*Bev-2);
  727.            end
  728.            else
  729.            begin
  730.               W := Max(W,2*Bev+DownGlyph.Width div DownNumGlyphs+UpGlyph.Width div UpNumGlyphs);
  731.               H := Max(H,2*Bev+DownGlyph.Height);
  732.               FDownButton.SetBounds(Bev, Bev, (W-2*Bev) div 2, H-2*Bev);
  733.               FUpButton.SetBounds(Bev+FDownButton.Width, Bev, (W-2*Bev)-FDownButton.Width, H-2*Bev);
  734.            end;
  735.         end;
  736.      end;
  737. end;
  738. {-- TMMCustomSpinButton -------------------------------------------------}
  739. procedure TMMCustomSpinButton.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  740. var
  741.   W, H: Integer;
  742. begin
  743.      W := AWidth;
  744.      H := AHeight;
  745.      AdjustSize (W, H);
  746.      inherited SetBounds (ALeft, ATop, W, H);
  747. end;
  748. {-- TMMCustomSpinButton -------------------------------------------------}
  749. procedure TMMCustomSpinButton.AdjustBounds;
  750. var
  751.   W, H: Integer;
  752. begin
  753.      W := Width;
  754.      H := Height;
  755.      AdjustSize (W, H);
  756.      if (W <> Width) or (H <> Height) then
  757.         inherited SetBounds(Left, Top, W, H)
  758.      else Invalidate;
  759. end;
  760. {-- TMMCustomSpinButton -------------------------------------------------}
  761. procedure TMMCustomSpinButton.Changed;
  762. begin
  763.      AdjustBounds;
  764. end;
  765. {-- TMMCustomSpinButton -------------------------------------------------}
  766. procedure TMMCustomSpinButton.WMSize(var Message: TWMSize);
  767. begin
  768.      inherited;
  769.      AdjustBounds;
  770.      Message.Result := 0;
  771. end;
  772. {-- TMMCustomSpinButton -------------------------------------------------}
  773. procedure TMMCustomSpinButton.WMSetFocus(var Message: TWMSetFocus);
  774. begin
  775.      FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState + [tbFocusRect];
  776.      Invalidate;
  777. end;
  778. {-- TMMCustomSpinButton -------------------------------------------------}
  779. procedure TMMCustomSpinButton.WMKillFocus(var Message: TWMKillFocus);
  780. begin
  781.      FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState - [tbFocusRect];
  782.      Invalidate;
  783. end;
  784. {-- TMMCustomSpinButton -------------------------------------------------}
  785. procedure TMMCustomSpinButton.KeyDown(var Key: Word; Shift: TShiftState);
  786. begin
  787.    ProcessKeys(Handle,WM_KEYDOWN,Key);
  788. end;
  789. {-- TMMCustomSpinButton -------------------------------------------------}
  790. procedure TMMCustomSpinButton.KeyUp(var Key: Word; Shift: TShiftState);
  791. begin
  792.    ProcessKeys(Handle,WM_KEYUP,Key);
  793. end;
  794. {-- TMMCustomSpinButton -------------------------------------------------}
  795. procedure TMMCustomSpinButton.BtnMouseDown(Sender: TObject; Button: TMouseButton;
  796.                                      Shift: TShiftState; X, Y: Integer);
  797. begin
  798.    if (Button = mbLeft) then
  799.    begin
  800.       if (Sender = FFastButton) then
  801.       with FFastButton do
  802.       begin
  803.          FTimeBtnState := FTimeBtnState + [tbDragging];
  804.          FStartValue := Value;
  805.          if (FOrientation = orVertical) then
  806.          begin
  807.             SetCursor(Screen.Cursors[crVSplit]);
  808.             FOldPos := Y;
  809.          end
  810.          else
  811.          begin
  812.             SetCursor(Screen.Cursors[crHSplit]);
  813.             FOldPos := X;
  814.          end;
  815.       end
  816.       else
  817.       begin
  818.          SetFocusBtn(TMMTimerSpeedButton(Sender));
  819.       end;
  820.       if (FFocusControl <> nil) AND FFocusControl.TabStop AND
  821.           FFocusControl.CanFocus then
  822.       begin
  823.          if (GetFocus <> FFocusControl.Handle) then
  824.              FFocusControl.SetFocus
  825.       end
  826.       else if TabStop AND (GetFocus <> Handle) AND CanFocus then SetFocus;
  827.    end;
  828. end;
  829. {-- TMMCustomSpinButton -------------------------------------------------}
  830. procedure TMMCustomSpinButton.BtnMouseMove(Sender: TObject; Shift: TShiftState;
  831.                                            X, Y: Integer);
  832. begin
  833.    if (Sender = FFastButton) then
  834.    begin
  835.       if (FOrientation = orVertical) then
  836.       begin
  837.          if (tbDragging in FFastButton.FTimeBtnState) then
  838.          begin
  839.             Value := FStartValue + Trunc((FOldPos - Y) * (MaxValue-MinValue)/100) ;
  840.          end
  841.          else SetCursor(Screen.Cursors[crVSplit])
  842.       end
  843.       else
  844.       begin
  845.          if (tbDragging in FFastButton.FTimeBtnState) then
  846.          begin
  847.             Value := FStartValue + Trunc((FOldPos - X) * (MaxValue-MinValue)/100) ;
  848.          end
  849.          else SetCursor(Screen.Cursors[crHSplit])
  850.       end;
  851.    end;
  852. end;
  853. {-- TMMCustomSpinButton -------------------------------------------------}
  854. procedure TMMCustomSpinButton.BtnMouseUp(Sender: TObject; Button: TMouseButton;
  855.                                    Shift: TShiftState; X, Y: Integer);
  856. begin
  857.    if (Button = mbLeft) and (Sender = FFastButton) then
  858.    with FFastButton do
  859.    begin
  860.       FTimeBtnState := FTimeBtnState - [tbDragging];
  861.    end;
  862. end;
  863. {-- TMMCustomSpinButton -------------------------------------------------}
  864. procedure TMMCustomSpinButton.BtnClick(Sender: TObject);
  865. begin
  866.    if (Sender = FUpButton) then
  867.       UpClicked
  868.    else if (Sender = FDownButton) then
  869.       DownClicked;
  870. end;
  871. {-- TMMCustomSpinButton -------------------------------------------------}
  872. procedure TMMCustomSpinButton.UpClicked;
  873. begin
  874.    Value := Value + FIncrement;
  875.    if Assigned(FOnUpClick) then FOnUpClick(Self);
  876. end;
  877. {-- TMMCustomSpinButton -------------------------------------------------}
  878. procedure TMMCustomSpinButton.DownClicked;
  879. begin
  880.    Value := Value - FIncrement;
  881.    if Assigned(FOnDownClick) then FOnDownClick(Self);
  882. end;
  883. {-- TMMCustomSpinButton -------------------------------------------------}
  884. procedure TMMCustomSpinButton.Change;
  885. begin
  886.    if (csLoading in ComponentState) or
  887.       (csReading in ComponentState) then exit;
  888.    if Assigned(FOnChange) then FOnChange(Self);
  889. end;
  890. {-- TMMCustomSpinButton -------------------------------------------------}
  891. procedure TMMCustomSpinButton.SetFocusBtn (Btn: TMMTimerSpeedButton);
  892. begin
  893.    if TabStop AND CanFocus AND (Btn <> FFocusedButton) AND (Btn <> FFastButton) then
  894.    begin
  895.       if (FFocusedButton <> nil) then
  896.       begin
  897.          FFocusedButton.FState := bsUp;
  898.          FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState - [tbFocusRect];
  899.          FFocusedButton.Refresh;
  900.       end;
  901.       FFocusedButton := Btn;
  902.       if (GetFocus = Handle) then
  903.       begin
  904.          FFocusedButton.TimeBtnState := FFocusedButton.TimeBtnState + [tbFocusRect];
  905.          Invalidate;
  906.       end;
  907.    end;
  908.    {$IFDEF WIN32}
  909.    {$IFDEF TRIAL}
  910.    {$DEFINE _HACK3}
  911.    {$I MMHACK.INC}
  912.    {$ENDIF}
  913.    {$ENDIF}
  914. end;
  915. {-- TMMCustomSpinButton -------------------------------------------------}
  916. procedure TMMCustomSpinButton.WMGetDlgCode(var Message: TWMGetDlgCode);
  917. begin
  918.    Message.Result := DLGC_WANTARROWS;
  919. end;
  920. {-- TMMCustomSpinButton -------------------------------------------------}
  921. procedure TMMCustomSpinButton.Loaded;
  922. begin
  923.   inherited Loaded;
  924.   UpdateButtonState;
  925.   AdjustBounds;
  926. end;
  927. {-- TMMCustomSpinButton -------------------------------------------------}
  928. function TMMCustomSpinButton.GetUpGlyph: TBitmap;
  929. begin
  930.   Result := FUpButton.Glyph;
  931. end;
  932. {-- TMMCustomSpinButton -------------------------------------------------}
  933. procedure TMMCustomSpinButton.SetUpGlyph(Value: TBitmap);
  934. begin
  935.    if (Value <> nil) then FUpButton.Glyph := Value
  936.    else
  937.    begin
  938.       if (FOrientation = orVertical) then
  939.           FUpButton.Glyph.Handle := LoadBitmap(HInstance, 'MMSPINUPV')
  940.       else
  941.           FUpButton.Glyph.Handle := LoadBitmap(HInstance, 'MMSPINUPH');
  942.       FUpButton.NumGlyphs := 3;
  943.       FUpButton.Invalidate;
  944.    end;
  945. end;
  946. {-- TMMCustomSpinButton -------------------------------------------------}
  947. function TMMCustomSpinButton.GetDownGlyph: TBitmap;
  948. begin
  949.    Result := FDownButton.Glyph;
  950. end;
  951. {-- TMMCustomSpinButton -------------------------------------------------}
  952. procedure TMMCustomSpinButton.SetDownGlyph(Value: TBitmap);
  953. begin
  954.    if Value <> nil then FDownButton.Glyph := Value
  955.    else
  956.    begin
  957.       if (FOrientation = orVertical) then
  958.           FDownButton.Glyph.Handle := LoadBitmap(HInstance, 'MMSPINDOWNV')
  959.       else
  960.           FDownButton.Glyph.Handle := LoadBitmap(HInstance, 'MMSPINDOWNH');
  961.       FDownButton.NumGlyphs := 3;
  962.       FDownButton.Invalidate;
  963.    end;
  964.    {$IFDEF WIN32}
  965.    {$IFDEF TRIAL}
  966.    {$DEFINE _HACK1}
  967.    {$I MMHACK.INC}
  968.    {$ENDIF}
  969.    {$ENDIF}
  970. end;
  971. {-- TMMCustomSpinButton -------------------------------------------------}
  972. procedure TMMCustomSpinButton.SetDownNumGlyphs(Value: TNumGlyphs);
  973. begin
  974.    FDownButton.NumGlyphs := Value;
  975. end;
  976. {-- TMMCustomSpinButton -------------------------------------------------}
  977. function TMMCustomSpinButton.GetDownNumGlyphs: TNumGlyphs;
  978. begin
  979.    Result := FDownButton.NumGlyphs;
  980. end;
  981. {-- TMMCustomSpinButton -------------------------------------------------}
  982. procedure TMMCustomSpinButton.SetUpNumGlyphs(Value: TNumGlyphs);
  983. begin
  984.    FUpButton.NumGlyphs := Value;
  985. end;
  986. {-- TMMCustomSpinButton -------------------------------------------------}
  987. function TMMCustomSpinButton.GetUpNumGlyphs: TNumGlyphs;
  988. begin
  989.    Result := FUpButton.NumGlyphs;
  990. end;
  991. {-- TMMCustomSpinButton -------------------------------------------------}
  992. procedure TMMCustomSpinButton.SetButtonFace(Value: Boolean);
  993. begin
  994.    if (Value <> FButtonFace) then
  995.    begin
  996.       FButtonFace := Value;
  997.       FUpButton.ButtonFace := Value;
  998.       FDownButton.ButtonFace := Value;
  999.       UpdateMiddleButton;
  1000.       AdjustBounds;
  1001.       Invalidate;
  1002.    end;
  1003. end;
  1004. {-- TMMCustomSpinButton -------------------------------------------------}
  1005. procedure TMMCustomSpinButton.SetFocusColor(Value: TColor);
  1006. begin
  1007.    if (Value <> FFocusColor) then
  1008.    begin
  1009.       FFocusColor := Value;
  1010.       FUpButton.FocusColor := Value;
  1011.       FDownButton.FocusColor := Value;
  1012.       UpdateMiddleButton;
  1013.       Invalidate;
  1014.    end;
  1015. end;
  1016. {-- TMMCustomSpinButton -------------------------------------------------}
  1017. procedure TMMCustomSpinButton.SetFocusStyle(Value: TMMFocusStyle);
  1018. begin
  1019.    if (Value <> FFocusStyle) then
  1020.    begin
  1021.       FFocusStyle := Value;
  1022.       FUpButton.FocusStyle := Value;
  1023.       FDownButton.FocusStyle := Value;
  1024.       UpdateMiddleButton;
  1025.       Invalidate;
  1026.    end;
  1027. end;
  1028. {-- TMMCustomSpinButton -------------------------------------------------}
  1029. procedure TMMCustomSpinButton.UpdateButtonState;
  1030. begin
  1031.    if (FValue = FMinValue) then FDownButton.Enabled := False
  1032.    else if Enabled then FDownButton.Enabled := True;
  1033.    if (FValue = FMaxValue) then FUpButton.Enabled := False
  1034.    else if Enabled then FUpButton.Enabled := True;
  1035. end;
  1036. {-- TMMCustomSpinButton -------------------------------------------------}
  1037. procedure TMMCustomSpinButton.SetEnabled(Value: Boolean);
  1038. begin
  1039.    if (Value <> inherited Enabled) then
  1040.    begin
  1041.       inherited Enabled := Value;
  1042.       UpdateMiddleButton;
  1043.       if Enabled then UpdateButtonState
  1044.       else
  1045.       begin
  1046.          FUpButton.Enabled := Enabled;
  1047.          FDownButton.Enabled := Enabled;
  1048.       end;
  1049.    end;
  1050.    {$IFDEF WIN32}
  1051.    {$IFDEF TRIAL}
  1052.    {$DEFINE _HACK2}
  1053.    {$I MMHACK.INC}
  1054.    {$ENDIF}
  1055.    {$ENDIF}
  1056. end;
  1057. {-- TMMCustomSpinButton -------------------------------------------------}
  1058. function TMMCustomSpinButton.GetEnabled: Boolean;
  1059. begin
  1060.      Result := inherited Enabled;
  1061. end;
  1062. {-- TMMCustomSpinButton -------------------------------------------------}
  1063. procedure TMMCustomSpinButton.SetIncrement(aValue: Longint);
  1064. begin
  1065.    if (aValue <> FIncrement) then
  1066.    begin
  1067.       FIncrement := aValue;
  1068.    end;
  1069. end;
  1070. {-- TMMCustomSpinButton -------------------------------------------------}
  1071. procedure TMMCustomSpinButton.SetMinValue(aValue: Longint);
  1072. begin
  1073.      if (aValue <> FMinValue) then
  1074.      begin
  1075.           FMinValue := aValue;
  1076.           if (FValue < FMinValue) then Value := FMinValue;
  1077.           UpdateButtonState;
  1078.      end;
  1079. end;
  1080. {-- TMMCustomSpinButton -------------------------------------------------}
  1081. procedure TMMCustomSpinButton.SetMaxValue(aValue: Longint);
  1082. begin
  1083.      if (aValue <> FMaxValue) then
  1084.      begin
  1085.           FMaxValue := aValue;
  1086.           if (FValue > FMaxValue) then Value := FMaxValue;
  1087.           UpdateButtonState;
  1088.      end;
  1089. end;
  1090. {-- TMMCustomSpinButton -------------------------------------------------}
  1091. procedure TMMCustomSpinButton.SetValue(aValue: Longint);
  1092. begin
  1093.      aValue := MinMax(aValue, FMinValue, FMaxValue);
  1094.      if (aValue <> FValue) then
  1095.      begin
  1096.         FValue := aValue;
  1097.         UpdateButtonState;
  1098.         Change;
  1099.      end;
  1100. end;
  1101. {-- TMMCustomSpinButton -------------------------------------------------}
  1102. procedure TMMCustomSpinButton.Paint;
  1103. var
  1104.    Bev: integer;
  1105. begin
  1106.    { paint the Bevel }
  1107.    inherited Paint;
  1108.    with Canvas do
  1109.    begin
  1110.       Pen.Color := clBlack;
  1111.       Bev := BevelExtend;
  1112.       if (FOrientation = orVertical) then
  1113.       begin
  1114.          if FButtonFace then
  1115.          begin
  1116.             MoveTo(Bev,Bev+FUpButton.Height);
  1117.             LineTo(Width-Bev,Bev+FUpButton.Height);
  1118.             if FMiddleButton then
  1119.             begin
  1120.                MoveTo(Bev,Bev+FUpButton.Height+FFastButton.Height+1);
  1121.                LineTo(Width-Bev,Bev+FUpButton.Height+FFastButton.Height+1);
  1122.             end;
  1123.          end
  1124.          else if FMiddleButton then
  1125.          begin
  1126.             MoveTo(Bev,Bev+FUpButton.Height);
  1127.             LineTo(Width-Bev,Bev+FUpButton.Height);
  1128.             MoveTo(Bev,Bev+FUpButton.Height);
  1129.             LineTo(Bev,Bev+FUpButton.Height+FFastButton.Height+1);
  1130.             MoveTo(Width-Bev-1,Bev+FUpButton.Height);
  1131.             LineTo(Width-Bev-1,Bev+FUpButton.Height+FFastButton.Height+1);
  1132.             MoveTo(Bev,Bev+FUpButton.Height+FFastButton.Height+1);
  1133.             LineTo(Width-Bev,Bev+FUpButton.Height+FFastButton.Height+1);
  1134.          end;
  1135.       end
  1136.       else
  1137.       begin
  1138.          if FButtonFace then
  1139.          begin
  1140.             MoveTo(Bev+FDownButton.Width,Bev);
  1141.             LineTo(Bev+FDownButton.Width,Height-Bev);
  1142.             if FMiddleButton then
  1143.             begin
  1144.                MoveTo(Bev+FDownButton.Width+FFastButton.Width+1,Bev);
  1145.                LineTo(Bev+FDownButton.Width+FFastButton.Width+1,Height-Bev);
  1146.             end;
  1147.          end
  1148.          else if FMiddleButton then
  1149.          begin
  1150.             MoveTo(Bev+FDownButton.Width,Bev);
  1151.             LineTo(Bev+FDownButton.Width,Height-Bev);
  1152.             MoveTo(Bev+FDownButton.Width+FFastButton.Width+1,Bev);
  1153.             LineTo(Bev+FDownButton.Width+FFastButton.Width+1,Height-Bev);
  1154.             MoveTo(Bev+FDownButton.Width+1,Bev);
  1155.             LineTo(Bev+FDownButton.Width+FFastButton.Width+1,Bev);
  1156.             MoveTo(Bev+FDownButton.Width+1,Height-Bev-1);
  1157.             LineTo(Bev+FDownButton.Width+FFastButton.Width+1,Height-Bev-1);
  1158.          end
  1159.       end;
  1160.    end;
  1161. end;
  1162. end.