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

Delphi控件源码

开发平台:

Delphi

  1. {
  2. //
  3. // Components : TfcTrackBar
  4. //
  5. // Copyright (c) 2003 by Woll2Woll Software
  6. //
  7. }
  8. unit fctrackbar;
  9. interface
  10. {$i fcIfdef.pas}
  11. uses
  12.   Consts, Messages, Windows, SysUtils, CommCtrl, Classes, Controls, Forms, Menus,
  13.   Graphics, StdCtrls, ImgList, ExtCtrls, ComCtrls,
  14.   dbctrls, db, fcpanel,
  15.   {$ifdef fcDelphi7Up}
  16.    themes, uxtheme,
  17.   {$endif}
  18.   {$ifdef ThemeManager}
  19.   thememgr, themesrv, uxtheme,
  20.   {$endif}
  21.   fccommon;
  22. type
  23. { TfcTrackBar }
  24.   TfcTrackBarOrientation = (trfcHorizontal, trfcVertical);
  25.   TfcTickMark = (tmfcBottomRight, tmfcTopLeft, tmfcBoth);
  26.   TfcTickStyle = (tsfcNone, tsfcAuto, tsfcManual);
  27.   TfcTrackBarTextPosition = (tbtLeft, tbtRight, tbtTop, tbtBottom);
  28.   TfcTrackBar = class;
  29.   TfcTrackBarText = class(TPersistent)
  30.   private
  31.      FShowText: boolean;
  32.      FPosition: TfcTrackBarTextPosition;
  33.      FOffsetX, FOffsetY: integer;
  34.      FDisplayFormat: string;
  35.      FTickLabelFrequency: integer;
  36.      FTickDisplayFormat: string;
  37.      procedure SetFont(Value: TFont);
  38.      function GetFont: TFont;
  39.      procedure SetPosition(Value: TfcTrackBarTextPosition);
  40.      procedure SetOffsetX(Value: integer);
  41.      procedure SetOffsetY(Value: integer);
  42.      procedure SetDisplayFormat(Value: String);
  43.      procedure  SetShowText(Value: boolean);
  44.      procedure SetTickLabelFrequency(Value: integer);
  45.      procedure SetTickDisplayFormat(Value: string);
  46.   public
  47.      Owner: TfcTrackBar;
  48.      constructor Create(AOwner: TComponent);
  49.   published
  50.      property Position : TfcTrackBarTextPosition read FPosition write SetPosition default tbtLeft;
  51.      property OffsetX: integer read FOffsetX write SetOffsetX default 0;
  52.      property OffsetY: integer read FOffsetY write SetOffsetY default 0;
  53.      property Font: TFont read GetFont write SetFont;
  54.      property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;
  55.      property ShowText: boolean read FShowText write SetShowText default False;
  56.      property TickLabelFrequency: integer read FTickLabelFrequency write SetTickLabelFrequency default 0;
  57.      property TickDisplayFormat: string read FTickDisplayFormat write SetTickDisplayFormat;
  58.   end;
  59.   TfcTrackIcon = class(TGraphicControl)
  60.   private
  61.      TrackBmp: TBitmap;
  62.      FOnEndDrag: TNotifyEvent;
  63.      procedure MouseLoop_Drag(X, Y: Integer);
  64.   protected
  65.      DraggingThumb: boolean;
  66.      procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  67.        X, Y: Integer); override;
  68.      Procedure Paint; override;
  69.      procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  70.   public
  71.      TrackBar: TfcTrackBar;
  72.      constructor Create(AOwner: TComponent); override;
  73.      destructor Destroy; override;
  74.   published
  75.      property OnEndDrag: TNotifyEvent read FOnEndDrag write FOnEndDrag;
  76.   end;
  77.   TfcTrackRepeatTimer = class (TTimer)
  78.   private
  79.      Increment: Double;
  80.   end;
  81.   TfcDrawTickTextEvent =
  82.      procedure (Sender: TObject; TickValue: Double;
  83.                 var ATickText: string; var ARect: TRect;
  84.                 var DoDefault: boolean) of object;
  85.   TfcTrackBar = class(TfcCustomPanel) //WinControl)
  86. //  TfcTrackBar = class(TWinControl)
  87.   private
  88.     FTextAttributes: TfcTrackBarText;
  89.     FOrientation: TfcTrackBarOrientation;
  90.     FTickMarks: TfcTickMark;
  91.     FTickStyle: TfcTickStyle;
  92.     FIncrement: Double;
  93.     FPageSize: Integer;
  94.     FThumbLength: Integer;
  95.     FThumbThickness: Integer;
  96.     FSliderVisible: Boolean;
  97.     FMin: Double;
  98.     FMax: Double;
  99.     FFrequency: Double;
  100.     FPosition: Double;
  101.     FSelStart: Double;
  102.     FSelEnd: Double;
  103.     FOnChange: TNotifyEvent;
  104.     FDataLink: TFieldDataLink;
  105.     TrackButton: TfcTrackIcon;
  106.     FTrackThumbIcon: TBitmap;
  107.     FThumbTrackSeparation: integer;
  108.     FThumbColor: TColor;
  109.     FTrackColor: TColor;
  110.     FTrackPartialFillColor: TColor;
  111.     FRepeatTimer: TfcTrackRepeatTimer;
  112.     FSpacingLeftTop: integer;
  113.     FSpacingRightBottom: integer;
  114.     FSpacingEdgeTrackbar: integer;
  115.     FReadOnly: boolean;
  116.     FInverted: boolean;
  117.     FOnDrawTickText: TfcDrawTickTextEvent;
  118.     FDisableThemes: boolean;
  119.     SkipEdit: boolean;
  120.     procedure PositionChanging; virtual;
  121.     procedure TimerExpired(Sender: TObject); virtual;
  122.     procedure SetThumbColor(val: TColor);
  123.     function GetThumbLength: Integer;
  124.     function GetThumbThickness: Integer;
  125.     procedure SetOrientation(Value: TfcTrackBarOrientation);
  126.     procedure SetParams(APosition, AMin, AMax: Double);
  127.     procedure SetPosition(Value: Double);
  128.     procedure SetMin(Value: Double);
  129.     procedure SetMax(Value: Double);
  130.     procedure SetFrequency(Value: Double);
  131.     procedure SetTickStyle(Value: TfcTickStyle);
  132.     procedure SetTickMarks(Value: TfcTickMark);
  133.     procedure SetIncrement(Value: Double);
  134.     procedure SetPageSize(Value: Integer);
  135.     procedure SetThumbLength(Value: Integer);
  136.     procedure SetThumbThickness(Value: Integer);
  137.     procedure SetSliderVisible(Value: Boolean);
  138.     procedure SetSelStart(Value: Double);
  139.     procedure SetSelEnd(Value: Double);
  140.     procedure UpdateSelection;
  141.     procedure UpdateFromButton(Sender: TObject);
  142.     procedure CNHScroll(var Message: TWMHScroll); message CN_HSCROLL;
  143.     procedure CNVScroll(var Message: TWMVScroll); message CN_VSCROLL;
  144.     procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
  145.     procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  146.     function GetDataField: string;
  147.     function GetDataSource: TDataSource;
  148.     procedure SetDataField(const Value: string);
  149.     procedure SetDataSource(Value: TDataSource);
  150.     function GetField: TField;
  151.     procedure SetThumbIcon(Value: TBitmap);
  152.     Function GetThumbIcon: TBitmap;
  153.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  154.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  155.     procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  156.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  157.     procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  158.     procedure SetSpacingLeftTop(Value: integer);
  159.     procedure SetSpacingRightBottom(Value: integer);
  160.     procedure SetSpacingEdgeTrackbar(Value: integer);
  161.     Function GetDBValue: Double;
  162.     procedure SetTrackColor(Value: TColor);
  163.     procedure SetTrackPartialFillColor(Value: TColor);
  164.   protected
  165.     procedure DrawTickText(TickValue: Double; TickText: string; ARect: TRect); virtual;
  166.     procedure UpdateRecord;
  167.     procedure UpdateData(Sender: TObject); virtual;
  168.     function EffectiveReadOnly: Boolean; virtual;
  169.     function EditCanModify: Boolean; virtual;
  170.     procedure PaintThumb(ALeft, ATop: integer); virtual;
  171.     function getPosition: Double; virtual;
  172.     function GetTrackBarRect: TRect;
  173.     procedure CreateParams(var Params: TCreateParams); override;
  174.     procedure CreateWnd; override;
  175.     procedure DestroyWnd; override;
  176.     procedure Changed; dynamic;
  177.     procedure DataChange(Sender: TObject); virtual;
  178.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  179.     procedure Paint; override;
  180.     function ValToPixel(Val: Extended): integer;
  181.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  182.       X, Y: Integer); override;
  183.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  184.                                   X, Y: Integer); override;
  185.     procedure KeyDown(var Key: word; Shift: TShiftState); override;
  186.   public
  187.     constructor Create(AOwner: TComponent); override;
  188.     destructor Destroy; override;
  189. //    procedure UpdateSelection;
  190. //    procedure SetTick(Value: Integer);
  191.     property DataLink: TFieldDataLink read FDataLink;
  192.     property Field: TField read GetField;
  193.   published
  194.     property DisableThemes : boolean read FDisableThemes write FDisableThemes default False;
  195.     property TextAttributes: TfcTrackBarText read FTextAttributes write FTextAttributes;
  196.     property TrackThumbIcon: TBitmap read GetThumbIcon write SetThumbIcon;
  197.     property ThumbColor: TColor read FThumbColor write SetThumbColor;
  198.     property SpacingLeftTop: integer read FSpacingLeftTop write SetSpacingLeftTop default 5;
  199.     property SpacingRightBottom: integer read FSpacingRightBottom write SetSpacingRightBottom default 5;
  200.     property SpacingEdgeTrackbar: integer read FSpacingEdgeTrackbar write SetSpacingEdgeTrackbar default 2;
  201.     property ReadOnly: boolean read FReadOnly write FReadOnly;
  202.     property Inverted: boolean read FInverted write FInverted default False;
  203.     property TrackColor: TColor read FTrackColor write SetTrackColor default clWhite;
  204.     property TrackPartialFillColor: TColor read FTrackPartialFillColor write SetTrackPartialFillColor default clNone;
  205.     property Align;
  206.     property Anchors;
  207.     property BorderWidth;
  208.     property Ctl3D;
  209.     property DragCursor;
  210.     property DragKind;
  211.     property DragMode;
  212.     property Enabled;
  213.     property Constraints;
  214.     property Increment: Double read FIncrement write SetIncrement;
  215.     property Max: Double read FMax write SetMax;
  216.     property Min: Double read FMin write SetMin;
  217.     property Orientation: TfcTrackBarOrientation read FOrientation write SetOrientation default trfcHorizontal;
  218.     property ParentCtl3D;
  219.     property ParentShowHint;
  220.     property PageSize: Integer read FPageSize write SetPageSize default 2;
  221.     property PopupMenu;
  222.     property Frequency: Double read FFrequency write SetFrequency;
  223.     property Position: Double read GetPosition write SetPosition;
  224.     property SliderVisible: Boolean read FSliderVisible write SetSliderVisible default True;
  225.     property SelEnd: Double read FSelEnd write SetSelEnd;
  226.     property SelStart: Double read FSelStart write SetSelStart;
  227.     property ShowHint;
  228.     property TabOrder;
  229.     property TabStop default True;
  230.     property ThumbLength: Integer read GetThumbLength write SetThumbLength default 20;
  231.     property ThumbThickness: Integer read GetThumbThickness write SetThumbThickness default 10;
  232.     property TickMarks: TfcTickMark read FTickMarks write SetTickMarks default tmfcBottomRight;
  233.     property TickStyle: TfcTickStyle read FTickStyle write SetTickStyle default tsfcAuto;
  234.     property Visible;
  235.     property OnContextPopup;
  236.     property OnDrawTickText : TfcDrawTickTextEvent read FOnDrawTickText write FOnDrawTickText;
  237.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  238.     property OnDragDrop;
  239.     property OnDragOver;
  240.     property OnEndDock;
  241.     property OnEndDrag;
  242.     property OnEnter;
  243.     property OnExit;
  244.     property OnKeyDown;
  245.     property OnKeyPress;
  246.     property OnKeyUp;
  247.     property OnStartDock;
  248.     property OnStartDrag;
  249.     property DataField: string read GetDataField write SetDataField;
  250.     property DataSource: TDataSource read GetDataSource write SetDataSource;
  251.   end;
  252. implementation
  253. const
  254.   MaxAutoTicks = 10000;
  255.   InitRepeatPause = 400;  { pause before repeat timer (ms) }
  256.   RepeatPause     = 100;  { pause before hint window displays (ms)}
  257. constructor TfcTrackIcon.Create(AOwner: TComponent);
  258. begin
  259.   inherited Create(AOwner);
  260.   ControlStyle := ControlStyle + [csReplicatable];
  261.   TrackBar:= AOwner as TfcTrackBar;
  262.   TrackBmp:= TBitmap.create;
  263.   ControlStyle:= ControlStyle - [csOpaque];
  264. end;
  265. destructor TfcTrackIcon.Destroy;
  266. begin
  267.    TrackBmp.Free;
  268.    TrackBmp:= nil;
  269.    inherited Destroy;
  270. end;
  271. procedure TfcTrackIcon.WMPaint(var Message: TWMPaint);
  272. begin
  273.    inherited;
  274. //   message.result:=1;
  275. end;
  276. Procedure TfcTrackIcon.Paint;
  277. begin
  278.    exit;
  279. end;
  280.    function TfcTrackBar.ValToPixel(Val: Extended): Integer;
  281.    var PixelVal: Extended;
  282.        tr: TRect;
  283.    begin
  284.       tr:= GetTrackBarRect;
  285.       if orientation = trfcHorizontal then
  286.       begin
  287.          if Inverted then
  288.            PixelVal:= (tr.Right-tr.left) - (tr.Right-tr.Left)/
  289.                    (Max-Min) * (Val-Min)
  290.          else
  291.            PixelVal:= (tr.Right-tr.Left)/
  292.                    (Max-Min) * (Val-Min)
  293.       end
  294.       else begin
  295.         if Inverted then
  296.           PixelVal:= (tr.Bottom - tr.Top) - (tr.Bottom-tr.Top)/
  297.                      (Max-Min) * (Val-Min)
  298.         else
  299.           PixelVal:= (tr.Bottom-tr.Top)/
  300.                      (Max-Min) * (Val-Min);
  301.       end;
  302.       result:=Trunc(PixelVal);
  303.    end;
  304. procedure TfcTrackIcon.MouseLoop_Drag(X, Y: Integer);
  305. var ACursor: TPoint;
  306.     Msg: TMsg;
  307.     FirstTime: boolean;
  308.     CaptureHandle: HWND;
  309.     DragOffset: integer;
  310.    function PixelToVal(PixelVal: integer): Extended;
  311.    var val : Extended;
  312.        tr: TRect;
  313.    begin
  314.       with TrackBar do
  315.       begin
  316.          tr:= GetTrackBarRect;
  317.          if TrackBar.orientation = trfcHorizontal then
  318.          begin
  319.             if Inverted then
  320.             begin
  321.                val:= Min + (Max-Min) / (tr.Right-tr.Left) * PixelVal;
  322.                val:= (Max+Min) - val;
  323.             end
  324.             else
  325.                val:= Min + (Max-Min) / (tr.Right-tr.Left) * PixelVal
  326.          end
  327.          else begin
  328.             if Inverted then
  329.             begin
  330.               Val:= Min + (Max-Min) / (tr.Bottom-tr.top) * PixelVal;
  331.               val:= (Max+Min) - val;
  332.             end
  333.             else
  334.               val:= Min + (Max-Min) / (tr.Bottom-tr.top) * PixelVal
  335.          end;
  336.       end;
  337.       result:=val;
  338.    end;
  339.    procedure SetValue(PixelVal: integer);
  340.    var val: Double;
  341.        valStr: string;
  342.    begin
  343. //       val:= Trunc(PixelToVal(PixelVal));
  344. //       val:= Round(PixelToVal(PixelVal));
  345.        val:= Trackbar.Increment*Round(PixelToVal(PixelVal)/Trackbar.Increment);
  346.        if (val<TrackBar.Min) then
  347.           val:= TrackBar.Min
  348.        else if (val>TrackBar.Max) then
  349.           val:= TrackBar.Max;
  350.        valstr:= floattostr(val);
  351.        TrackBar.Position:=val;
  352.    end;
  353. begin
  354.    CaptureHandle:= GetParentForm(self).Handle;
  355.    SetCapture(CaptureHandle);
  356.    FirstTime:= True;
  357.    DragOffset:=0; // Make compiler happy
  358.    try
  359.       while GetCapture = CaptureHandle do
  360.       begin
  361.          GetCursorPos(ACursor);
  362.          ACursor := ScreenToClient(ACursor);
  363.          case Integer(GetMessage(Msg, 0, 0, 0)) of
  364.            -1: Break;
  365.            0: begin PostQuitMessage (Msg.WParam); Break; end;
  366.          end;
  367.          case Msg.Message of
  368.             WM_MOUSEMOVE: begin
  369.                if FirstTime then begin
  370.                   if (abs(X-ACursor.X)<=2) and (abs(y-ACursor.Y)<=2) then continue;  // Some tolerance
  371.                   if TrackBar.orientation = trfcHorizontal then
  372.                   begin
  373.                     DragOffset:= X;
  374.                     SetValue(Left - Trackbar.SpacingLeftTop +  ACursor.X-DragOffset);
  375.                   end
  376.                   else begin
  377.                     DragOffset:= Y;
  378.                     SetValue(Top - Trackbar.SpacingLeftTop +  ACursor.Y-DragOffset);
  379.                   end;
  380.                   FirstTime:= False;
  381.                   DraggingThumb:= True;
  382.                end
  383.                else begin
  384.                   if TrackBar.orientation = trfcHorizontal then
  385.                      SetValue(Left - Trackbar.SpacingLeftTop + ACursor.X-DragOffset)
  386.                   else
  387.                      SetValue(Top - Trackbar.SpacingLeftTop + ACursor.Y-DragOffset)
  388.                end
  389.             end;
  390.             WM_LBUTTONUP: begin
  391.                if not FirstTime then
  392.                begin
  393.                   if Assigned(FOnEndDrag) then OnEndDrag(self);
  394.                end;
  395.                if GetCapture = CaptureHandle then ReleaseCapture;
  396.                DraggingThumb:= False;
  397.                if fcUseThemes(Trackbar) then Trackbar.Invalidate;
  398.                TranslateMessage(Msg);
  399.                DispatchMessage(Msg);
  400.             end
  401.             else begin
  402.                TranslateMessage(Msg);
  403.                DispatchMessage(Msg);
  404.             end
  405.          end { Case }
  406.       end;
  407.    finally
  408.        if GetCapture = CaptureHandle then ReleaseCapture;
  409.    end;
  410. end;
  411. procedure TfcTrackIcon.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  412. begin
  413.    if Parent.CanFocus then Parent.SetFocus;
  414.    if not (ssRight in Shift) then MouseLoop_Drag(X,Y);
  415. end;
  416. constructor TfcTrackBar.Create(AOwner: TComponent);
  417. begin
  418.   inherited Create(AOwner);
  419.   Caption:= '';
  420.   FInverted:= False;
  421.   FTextAttributes:= TfcTrackBarText.create(self);
  422.   ControlStyle := ControlStyle + [csReplicatable];
  423.   ParentColor:=True;
  424.   FSpacingLeftTop:= 5;
  425.   FSpacingRightBottom:= 5;
  426.   FSpacingEdgeTrackbar:= 2;
  427.   Width := 150;
  428.   Height := 45;
  429.   TabStop := True;
  430.   FMin := 0;
  431.   FMax := 10;
  432.   FPosition := 0;
  433.   FIncrement := 1.0;
  434.   FPageSize := 2;
  435.   FFrequency := 1;
  436.   FSelStart := 0;
  437.   FSelEnd := 0;
  438.   FThumbLength := 20;
  439.   FThumbThickness:= 10;
  440.   FTickMarks := tmfcBottomRight;
  441.   FTickStyle := tsfcAuto;
  442.   FOrientation := trfcHorizontal;
  443.   ControlStyle := ControlStyle - [csDoubleClicks];
  444.   FSliderVisible := True;
  445.   FThumbTrackSeparation:=5;
  446.   TrackButton:= TfcTrackIcon.create(self);
  447. //  TrackButton.parent:= self;
  448.   FTrackThumbIcon:= TBitmap.Create;
  449.   FThumbColor:= clBtnFace;
  450.   FDataLink := TFieldDataLink.Create;
  451.   FDataLink.Control := Self;
  452.   FDataLink.OnDataChange := DataChange;
  453.   FDataLink.OnUpdateData := UpdateData;
  454.   BevelInner:= bvNone;
  455.   BevelOuter:= bvNone;
  456.   TrackColor:= clWhite;
  457.   TrackPartialFillColor:= clNone;
  458. end;
  459. destructor TfcTrackBar.Destroy;
  460. begin
  461.   FDataLink.OnDataChange := nil;
  462.   FDataLink.Free;
  463.   FDataLink := nil;
  464.   TrackButton.Free;
  465.   TrackButton:=nil;
  466.   TrackThumbIcon.Free;
  467.   if FRepeatTimer <> nil then
  468.     FRepeatTimer.Free;
  469.   FTextAttributes.Free;
  470.   inherited Destroy;
  471. end;
  472. procedure TfcTrackBar.SetThumbIcon(Value: TBitmap);
  473. begin
  474.    FTrackThumbIcon.Assign(Value);
  475.    Invalidate;
  476. end;
  477. Function TfcTrackBar.GetThumbIcon: TBitmap;
  478. begin
  479.   result:= FTrackThumbIcon;
  480. end;
  481. procedure TfcTrackBar.CreateParams(var Params: TCreateParams);
  482. begin
  483.   inherited CreateParams(Params);
  484.   ControlStyle := ControlStyle - [csAcceptsControls];
  485.   //, csCaptureMouse, csClickEvents,
  486. //    csSetCaption, csOpaque, csDoubleClicks, csReplicatable];
  487. end;
  488. procedure TfcTrackBar.CreateWnd;
  489. var dest, source: TRect;
  490. begin
  491.   inherited CreateWnd;
  492.   if HandleAllocated then
  493.   begin
  494.      with TrackButton do begin
  495.        Parent:= self;
  496.        if not TrackthumbIcon.Empty then
  497.        begin
  498. //         TrackBmp.height:= ThumbLength;
  499.          TrackBmp.height:= TrackThumbIcon.Height; ;
  500.          TrackBmp.width:= TrackThumbIcon.Width;
  501.          dest:= Rect(0, 0, TrackBmp.width, TrackBmp.height);
  502.          source:= Rect(0, 0, TrackThumbIcon.Width, TrackThumbIcon.height);
  503.          TrackBmp.Canvas.CopyRect(dest, TrackThumbIcon.Canvas,source);
  504.        end;
  505.        if orientation = trfcHorizontal then
  506.        begin
  507.          Height:= ThumbLength;
  508.          if TrackBmp.Empty then
  509.             Width:= ThumbThickness
  510.          else
  511.             Width:= TrackBmp.Width;
  512.        end
  513.        else begin
  514.          Width:= ThumbLength;
  515.          if TrackBmp.Empty then
  516.             Height:= ThumbThickness
  517.          else
  518. //            Height:= TrackBmp.Width;
  519.             Height:= TrackBmp.Height;
  520.        end;
  521. //       if TrackBmp.Empty then
  522. //          Width:= self. -5
  523. //       else Height:= TrackBmp.Height;
  524. //       if TrackBmp.Empty then
  525. //          Height:= self.height -5
  526. //       else Height:= TrackBmp.Height;
  527.        if orientation = trfcHorizontal then
  528.        begin
  529.          Left:= 1;
  530.          Top:= GetTrackBarRect.Top-FThumbTrackSeparation+2; // Icon is 6 pixels above trackbar fill rectangle
  531.        end
  532.        else begin
  533.          Top:= 1;
  534.          Left:= GetTrackBarRect.Left-FThumbTrackSeparation+2; // Icon is 6 pixels above trackbar fill rectangle
  535.        end;
  536.        OnEndDrag:= UpdateFromButton;
  537.        if orientation = trfcHorizontal then
  538.          TrackButton.Left:=
  539.             GetTrackBarRect.Left + ValToPixel(Position) - (TrackButton.Width div 2)
  540.        else
  541.          TrackButton.Top:=
  542.             GetTrackBarRect.Top + ValToPixel(Position) - (TrackButton.Height div 2);
  543.      end;
  544.      UpdateSelection;
  545.   end;
  546. end;
  547. procedure TfcTrackBar.UpdateFromButton(Sender: TObject);
  548. begin
  549. end;
  550. procedure TfcTrackBar.DestroyWnd;
  551. begin
  552.   inherited DestroyWnd;
  553. end;
  554. procedure TfcTrackBar.CNHScroll(var Message: TWMHScroll);
  555. begin
  556.   inherited;
  557.   Changed;
  558.   Message.Result := 0;
  559. end;
  560. procedure TfcTrackBar.CNVScroll(var Message: TWMVScroll);
  561. begin
  562.   inherited;
  563.   Changed;
  564.   Message.Result := 0;
  565. end;
  566. function TfcTrackBar.GetThumbLength: Integer;
  567. begin
  568.     Result := FThumbLength;
  569. end;
  570. function TfcTrackBar.GetThumbThickness: Integer;
  571. begin
  572.     Result := FThumbThickness
  573. end;
  574. procedure TfcTrackBar.SetOrientation(Value: TfcTrackBarOrientation);
  575. begin
  576.   if Value <> FOrientation then
  577.   begin
  578.     FOrientation := Value;
  579.     if ComponentState * [csLoading, csUpdating] = [] then
  580.       SetBounds(Left, Top, Height, Width);
  581.     RecreateWnd;
  582.   end;
  583. end;
  584. procedure TfcTrackBar.SetParams(APosition, AMin, AMax: Double);
  585. begin
  586.   if AMax < AMin then
  587.     raise EInvalidOperation.CreateFmt(SPropertyOutOfRange, [Self.Classname]);
  588.   if APosition < AMin then APosition := AMin;
  589.   if APosition > AMax then APosition := AMax;
  590.   if (AMax - AMin > MaxAutoTicks) <> (FMax - FMin > MaxAutoTicks) then
  591.   begin
  592.     FMin := AMin;
  593.     FMax := AMax;
  594.     RecreateWnd;
  595.   end;
  596.   if (FMin <> AMin) then
  597.   begin
  598.     FMin := AMin;
  599.   end;
  600.   if (FMax <> AMax) then
  601.   begin
  602.     FMax := AMax;
  603.   end;
  604.   if FPosition <> APosition then
  605.   begin
  606.     PositionChanging;
  607.     if (not EffectiveReadOnly) or SkipEdit then
  608.        FPosition := fcMaxFloat(FMin, APosition);
  609.     Changed;
  610.     if (DataSource<>nil) and (DataSource.State in [dsEdit, dsInsert]) then
  611.         FDatalink.modified;
  612.   end;
  613. end;
  614. procedure TfcTrackBar.SetPosition(Value: Double);
  615. const Tolerance = 0.005;
  616. begin
  617.   if abs(FPosition-Value)>=(Increment/2) then  // Tolerance is 1/2 of increment
  618.   begin
  619.     if Value>FPosition then
  620.        Value:= FPosition + Increment * Round((Value-FPosition)/Increment)
  621.     else
  622.        Value:= FPosition - Increment * Round((FPosition-Value)/Increment);
  623.     // Round to multiple of increment
  624.     Value:= Round(Value / Increment) * Increment;
  625.     if Value>FMax then Value:= FMax
  626.     else if Value<FMin then Value:= FMin
  627.   end;
  628.   if abs(FPosition-Value)+Tolerance>=Increment then begin // Now make sure it is at least of increment size before adjustnig position
  629.     invalidate;
  630.     SetParams(Value, FMin, FMax);
  631.     if orientation = trfcHorizontal then
  632.        TrackButton.Left:=
  633.          GetTrackBarRect.Left + ValToPixel(Value) - (TrackButton.Width div 2)
  634.     else begin
  635.        TrackButton.Top:=
  636.            GetTrackBarRect.top + ValToPixel(Value) - (TrackButton.Height div 2)
  637.     end
  638.   end;
  639. end;
  640. procedure TfcTrackBar.SetMin(Value: Double);
  641. begin
  642.   if Value <= FMax then
  643.     SetParams(FPosition, Value, FMax);
  644.   FMin:=Value;
  645. end;
  646. procedure TfcTrackBar.SetMax(Value: Double);
  647. begin
  648.   if Value >= FMin then
  649.     SetParams(FPosition, FMin, Value);
  650.   FMax:= Value;
  651. end;
  652. procedure TfcTrackBar.SetFrequency(Value: Double);
  653. begin
  654.   if Value <> FFrequency then
  655.   begin
  656.     FFrequency := Value;
  657.     Invalidate;
  658.   end;
  659. end;
  660. {procedure TfcTrackBar.SetTick(Value: Integer);
  661. begin
  662.   if HandleAllocated then
  663.     SendMessage(Handle, TBM_SETTIC, 0, Value);
  664. end;
  665. }
  666. procedure TfcTrackBar.SetTickStyle(Value: TfcTickStyle);
  667. begin
  668.   if Value <> FTickStyle then
  669.   begin
  670.     FTickStyle := Value;
  671.     RecreateWnd;
  672.   end;
  673. end;
  674. procedure TfcTrackBar.SetTickMarks(Value: TfcTickMark);
  675. begin
  676.   if Value <> FTickMarks then
  677.   begin
  678.     FTickMarks := Value;
  679.     RecreateWnd;
  680.   end;
  681. end;
  682. procedure TfcTrackBar.SetIncrement(Value: Double);
  683. begin
  684.   if (Value <> FIncrement) then
  685.   begin
  686.     if Value=0 then Value:= 1;
  687.     FIncrement := Value;
  688.   end;
  689. end;
  690. procedure TfcTrackBar.SetPageSize(Value: Integer);
  691. begin
  692.   if Value <> FPageSize then
  693.   begin
  694.     FPageSize := Value;
  695.   end;
  696. end;
  697. procedure TfcTrackBar.SetThumbLength(Value: Integer);
  698. begin
  699.   if Value <> FThumbLength then
  700.   begin
  701.     FThumbLength := Value;
  702.     with TrackButton do begin
  703.        if orientation = trfcHorizontal then
  704.        begin
  705.          if TrackBmp.Empty then
  706.             Height:= ThumbLength;
  707.        end
  708.        else begin
  709.          if TrackBmp.Empty then
  710.             Width:= ThumbLength;
  711.        end
  712.     end;
  713.     Invalidate;
  714.   end;
  715. end;
  716. procedure TfcTrackBar.SetThumbThickness(Value: Integer);
  717. begin
  718.   if Value <> FThumbThickness then
  719.   begin
  720.     FThumbThickness := Value;
  721.     with TrackButton do begin
  722.        if orientation = trfcHorizontal then
  723.        begin
  724.          if TrackBmp.Empty then
  725.             Width:= ThumbThickness
  726.        end
  727.        else begin
  728.          if TrackBmp.Empty then
  729.             Height:= ThumbThickness
  730.        end
  731.     end;
  732.     Invalidate;
  733.   end;
  734. end;
  735. procedure TfcTrackBar.SetSliderVisible(Value: Boolean);
  736. begin
  737.   if FSliderVisible <> Value then
  738.   begin
  739.     FSliderVisible := Value;
  740.     Invalidate;
  741. //    RecreateWnd;
  742.   end;
  743. end;
  744. procedure TfcTrackBar.UpdateSelection;
  745. begin
  746.    Invalidate;
  747. end;
  748. procedure TfcTrackBar.SetSelStart(Value: Double);
  749. begin
  750.   if Value <> FSelStart then
  751.   begin
  752.     FSelStart := Value;
  753.     UpdateSelection;
  754.   end;
  755. end;
  756. procedure TfcTrackBar.SetSelEnd(Value: Double);
  757. begin
  758.   if Value <> FSelEnd then
  759.   begin
  760.     FSelEnd := Value;
  761.     UpdateSelection;
  762.   end;
  763. end;
  764. procedure TfcTrackBar.Changed;
  765. begin
  766.   if Assigned(FOnChange) then FOnChange(Self);
  767. end;
  768. procedure TfcTrackBar.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  769. begin
  770.   {$ifdef fcUseThemeManager}
  771.   if fcUseThemes(self) then
  772.   begin
  773. {    R := ClientRect;
  774.     if Focused and ((Perform(WM_QUERYUISTATE, 0, 0) and UISF_HIDEFOCUS) = 0) then
  775.       InflateRect(R, -1, -1);
  776.     ThemeServices.DrawParentBackground(Handle, Message.DC, nil, False, @R);}
  777.     Message.Result := 1;
  778.   end
  779.   else
  780.   {$endif}
  781.      inherited;
  782. end;
  783. function TfcTrackBar.GetDataSource: TDataSource;
  784. begin
  785.   if (FDataLink<>Nil) and (FDataLink.DataSource is TDataSource) then begin
  786.      Result := FDataLink.DataSource as TDataSource
  787.   end
  788.   else Result:= Nil;
  789. end;
  790. procedure TfcTrackBar.SetDataSource(Value: TDataSource);
  791. begin
  792.   FDataLink.DataSource := Value;
  793.   if Value <> nil then begin
  794.     Value.FreeNotification(Self);
  795.   end
  796. end;
  797. function TfcTrackBar.GetDataField: string;
  798. begin
  799.   Result := FDataLink.FieldName;
  800. end;
  801. procedure TfcTrackBar.SetDataField(const Value: string);
  802. begin
  803.   FDataLink.FieldName := Value;
  804. end;
  805. procedure TfcTrackBar.DataChange(Sender: TObject);
  806. var Value: Double;
  807. begin
  808.   if FDataLink.Field <> nil then
  809.   begin
  810. //    Position:= FDataLink.Field.asInteger;
  811.     Value := FDataLink.Field.asFloat;
  812.     // Round to multiple of Increment
  813. //    Value:= Round(Value / Increment) * Increment;
  814.     SkipEdit:= True;
  815.     try
  816.       Position:= Value;
  817.     finally
  818.       SkipEdit:= False;
  819.     end;
  820. //    if (DataSource<>nil) and (DataSource.State=dsBrowse) then Modified:=False;
  821.   end
  822. end;
  823. procedure TfcTrackBar.Notification(AComponent: TComponent;
  824.   Operation: TOperation);
  825. begin
  826.   inherited Notification(AComponent, Operation);
  827.   if (Operation = opRemove) and (FDataLink <> nil) and
  828.     (AComponent = DataSource) then DataSource := nil;
  829. end;
  830. function TfcTrackBar.GetField: TField;
  831. begin
  832.   Result := FDataLink.Field;
  833. end;
  834. // For double buffering
  835. procedure TfcTrackBar.WMPaint(var Message: TWMPaint);
  836. var
  837.     DC, MemDC: HDC;
  838.     MemBitmap, OldBitmap: HBITMAP;
  839.     PS: TPaintStruct;
  840.     UpdateRect: TRect;
  841. begin
  842.   windows.GetUpdateRect(Handle, UpdateRect, false);
  843.   if (Message.DC <> 0) then
  844.   begin
  845.     if not (csCustomPaint in ControlState) and (ControlCount = 0) then
  846.       inherited
  847.     else
  848.       PaintHandler(Message);
  849.   end
  850.   else begin
  851.     DC := GetDC(0);
  852.     MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, inherited GetClientRect.Bottom);
  853.     ReleaseDC(0, DC);
  854.     MemDC := CreateCompatibleDC(0);
  855.     OldBitmap := SelectObject(MemDC, MemBitmap);
  856.     try
  857.       DC := BeginPaint(Handle, PS);
  858.       Message.DC := MemDC;
  859.       if not (csCustomPaint in ControlState) and (ControlCount = 0) then
  860.         inherited
  861.       else
  862.         PaintHandler(Message);
  863.       Message.DC := 0;
  864.       BitBlt(DC, UpdateRect.Left, UpdateRect.Top, UpdateRect.Right-UpdateRect.Left,
  865.                  UpdateRect.Bottom-UpdateRect.Top, MemDC, UpdateRect.Left, UpdateRect.top, SRCCOPY);
  866.       EndPaint(Handle, PS);
  867.     finally
  868.       SelectObject(MemDC, OldBitmap);
  869.       DeleteDC(MemDC);
  870.       DeleteObject(MemBitmap);
  871.     end;
  872.   end;
  873. end;
  874. function TfcTrackBar.GetTrackBarRect: TRect;
  875. const TickSpace = 7;
  876. begin
  877.   if Orientation = trfcVertical then
  878.   begin
  879.      if TickMarks in [tmfcBoth, tmfcTopLeft] then
  880.      begin
  881.         result:=  Rect(
  882.             SpacingEdgeTrackbar + FThumbTrackSeparation + TickSpace,
  883.             FSpacingLeftTop + TrackButton.Height div 2,
  884.             SpacingEdgeTrackbar + FThumbTrackSeparation + TickSpace + ThumbLength -
  885.             (2 * FThumbTrackSeparation),
  886.             Height-(FSpacingRightBottom+TrackButton.Height div 2))
  887.      end
  888.      else if TickMarks = tmfcBottomRight then
  889.      begin
  890.         result:=  Rect(
  891.             SpacingEdgeTrackbar + FThumbTrackSeparation,
  892.             FSpacingLeftTop + TrackButton.Height div 2,
  893.             SpacingEdgeTrackbar + FThumbTrackSeparation + ThumbLength -
  894.             (2 * FThumbTrackSeparation),
  895.             Height-(FSpacingRightBottom+TrackButton.Height div 2))
  896.      end
  897.   end
  898.   else begin
  899.      if TickMarks in [tmfcBoth, tmfcTopLeft] then
  900.         result:=  Rect(
  901.             FSpacingLeftTop + TrackButton.Width div 2,
  902.             SpacingEdgeTrackbar + FThumbTrackSeparation + TickSpace,
  903.             Width-(FSpacingRightBottom+TrackButton.Width div 2),
  904.             SpacingEdgeTrackbar + FThumbTrackSeparation + TickSpace + ThumbLength -
  905.             (2 * FThumbTrackSeparation))
  906.      else
  907.         result:=  Rect(FSpacingLeftTop + TrackButton.Width div 2,
  908.             SpacingEdgeTrackbar + FThumbTrackSeparation,
  909.             Width-(FSpacingRightBottom+TrackButton.Width div 2),
  910.             SpacingEdgeTrackbar + FThumbTrackSeparation + ThumbLength -
  911.             (2 * FThumbTrackSeparation))
  912.   end
  913. end;
  914. procedure DrawFocusRect(ACanvas: TCanvas; ARect: TRect);
  915. begin
  916.     ACanvas.Brush.Color := clWhite;
  917.     ACanvas.Font.Color := clBlack;
  918.     ACanvas.DrawFocusRect(ARect);
  919. end;
  920. procedure TfcTrackBar.PaintThumb(ALeft, ATop: integer);
  921. var
  922.     ThumbRect: TRect;
  923.     DiagonalHeight: integer;
  924.     Triangle: array[0..2] of TPoint;
  925.     {$ifdef fcUseThemeManager}
  926.     tempRect: TRect;
  927.     Details: TThemedElementDetails;
  928.     {$endif}
  929.     {$ifdef fcUseThemeManager}
  930.       function IsHotThumb: boolean;
  931.       var SP, MousePos: TPoint;
  932.       begin
  933.           GetCursorPos(MousePos);
  934.           sp:= ScreenToClient(MousePos);
  935.           if (sp.x>=ALeft) and (sp.x<=ALeft+TrackButton.Width) and
  936.              (sp.y>=ATop) and (sp.y<=ATop+TrackButton.Height) then
  937.              result:= True
  938.           else result:= False;
  939.       end;
  940.     Function GetThumbTheme: TThemedTrackBar;
  941.     begin
  942.        if not Enabled then
  943.        begin
  944.          if orientation = trfcHorizontal then
  945.          begin
  946.            if TickMarks = tmfcBoth then
  947.              Result:= ttbThumbDisabled
  948.            else if TickMarks = tmfcBottomRight then
  949.              Result:= ttbThumbBottomDisabled
  950.            else
  951.              Result:= ttbThumbTopDisabled
  952.          end
  953.          else begin
  954.            if TickMarks = tmfcBoth then
  955.              Result:= ttbThumbVertDisabled
  956.            else if TickMarks = tmfcBottomRight then
  957.              Result:= ttbThumbRightDisabled
  958.            else
  959.              Result:= ttbThumbLeftDisabled
  960.          end;
  961.        end
  962.        else if TrackButton.DraggingThumb then
  963.        begin
  964.          if orientation = trfcHorizontal then
  965.          begin
  966.            if TickMarks = tmfcBoth then
  967.              Result:= ttbThumbPressed
  968.            else if TickMarks = tmfcBottomRight then
  969.              Result:= ttbThumbBottomPressed
  970.            else
  971.              Result:= ttbThumbTopPressed
  972.          end
  973.          else begin
  974.            if TickMarks = tmfcBoth then
  975.              Result:= ttbThumbVertPressed
  976.            else if TickMarks = tmfcBottomRight then
  977.              Result:= ttbThumbRightPressed
  978.            else
  979.              Result:= ttbThumbLeftPressed
  980.          end;
  981.        end
  982.        else if IsHotThumb then
  983.        begin
  984.          if orientation = trfcHorizontal then
  985.          begin
  986.            if TickMarks = tmfcBoth then
  987.              Result:= ttbThumbHot
  988.            else if TickMarks = tmfcBottomRight then
  989.              Result:= ttbThumbBottomHot
  990.            else
  991.              Result:= ttbThumbTopHot
  992.          end
  993.          else begin
  994.            if TickMarks = tmfcBoth then
  995.              Result:= ttbThumbVertHot
  996.            else if TickMarks = tmfcBottomRight then
  997.              Result:= ttbThumbRightHot
  998.            else
  999.              Result:= ttbThumbLeftHot
  1000.          end;
  1001.        end
  1002.        else if Focused then
  1003.        begin
  1004.          if orientation = trfcHorizontal then
  1005.          begin
  1006.            if TickMarks = tmfcBoth then
  1007.              Result:= ttbThumbFocused
  1008.            else if TickMarks = tmfcBottomRight then
  1009.              Result:= ttbThumbBottomFocused
  1010.            else
  1011.              Result:= ttbThumbTopFocused
  1012.          end
  1013.          else begin
  1014.            if TickMarks = tmfcBoth then
  1015.              Result:= ttbThumbVertFocused
  1016.            else if TickMarks = tmfcBottomRight then
  1017.              Result:= ttbThumbRightFocused
  1018.            else
  1019.              Result:= ttbThumbLeftFocused
  1020.          end;
  1021.        end
  1022.        else begin
  1023.          if orientation = trfcHorizontal then
  1024.          begin
  1025.            if TickMarks = tmfcBoth then
  1026.              Result:= ttbThumbNormal
  1027.            else if TickMarks = tmfcBottomRight then
  1028.              Result:= ttbThumbBottomNormal
  1029.            else
  1030.              Result:= ttbThumbTopNormal
  1031.          end
  1032.          else begin
  1033.            if TickMarks = tmfcBoth then
  1034.              Result:= ttbThumbVertNormal
  1035.            else if TickMarks = tmfcBottomRight then
  1036.              Result:= ttbThumbRightNormal
  1037.            else
  1038.              Result:= ttbThumbLeftNormal
  1039.          end;
  1040.        end
  1041.     end;
  1042.     {$endif}
  1043. begin
  1044.    if not SliderVisible then exit;
  1045.    if not TrackThumbIcon.Empty then
  1046.    begin
  1047.      with TrackThumbIcon do
  1048.      begin
  1049.         TransparentMode := tmAuto;
  1050.         Transparent:= True;
  1051.      end;
  1052.      Canvas.Draw(ALeft, ATop, TrackThumbIcon);
  1053.      exit;
  1054.    end;
  1055.    {$ifdef fcUseThemeManager}
  1056.    if fcUseThemes(self) then
  1057.    begin
  1058.       tempRect:= TrackButton.ClientRect;
  1059.       tempRect.left:= ALeft;
  1060.       tempRect.Top:= ATop;
  1061.       tempRect.Right:= tempRect.Left + TrackButton.Width;
  1062.       tempRect.Bottom:= tempRect.Top + TrackButton.height;
  1063.       Details := ThemeServices.GetElementDetails(GetThumbTheme);
  1064.       ThemeServices.DrawElement(Canvas.Handle, Details, tempRect);
  1065.       exit;
  1066.    end;
  1067.    {$endif}
  1068.    if orientation = trfcHorizontal then
  1069.    begin
  1070.      with Canvas do begin
  1071.         ThumbRect.Left:= ALeft;
  1072.         ThumbRect.Right:= ThumbRect.Left + TrackButton.ClientWidth;
  1073.         DiagonalHeight:= (ThumbRect.Right-ThumbRect.Left) div 2;
  1074.         ThumbRect.Top:= ATop; //RulerRect.Top - Trackbar.FThumbTrackSeparation;
  1075.         ThumbRect.Bottom:= ThumbRect.Top + ThumbLength -  DiagonalHeight;
  1076.         Brush.Color:= ThumbColor;
  1077.         FillRect(ThumbRect);
  1078.         DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1079.            BF_TOP or BF_LEFT);
  1080.         DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1081.            BF_RIGHT);
  1082.         ThumbRect.Top:= ThumbRect.Bottom;
  1083.         ThumbRect.Bottom:= ThumbRect.top + DiagonalHeight;
  1084.         ThumbRect.Right:= ThumbRect.Left+ DiagonalHeight;
  1085.         DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1086.            BF_MIDDLE OR BF_DIAGONAL_ENDTOPLEFT);
  1087.         Triangle[0]:= Point(ThumbRect.Left+1, ThumbRect.Top);
  1088.         Triangle[1]:= Point(ThumbRect.Right, ThumbRect.Top);
  1089.         Triangle[2]:= Point(ThumbRect.Right, ThumbRect.Bottom-1);
  1090.         Pen.Color:=ThumbColor;
  1091.         Pen.Color:=ThumbColor;
  1092.         Brush.Color:= ThumbColor;
  1093.         Polygon(Triangle);
  1094.         DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1095.            BF_DIAGONAL_ENDTOPLEFT);
  1096.         ThumbRect.Left:= ALeft + DiagonalHeight;
  1097.         ThumbRect.Right:=ALeft + TrackButton.ClientWidth;
  1098.         Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
  1099.         Triangle[1]:= Point(ThumbRect.Right-2, ThumbRect.Top);
  1100.         Triangle[2]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
  1101.         Pen.Color:=ThumbColor;
  1102.         Pen.Color:=ThumbColor;
  1103.         Brush.Color:= ThumbColor;
  1104.         Polygon(Triangle);
  1105.         DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1106.           {BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMLEFT);
  1107.       end;
  1108.    end
  1109.    else begin
  1110.      with Canvas do begin
  1111.         ThumbRect.Top:= ATop;
  1112.         ThumbRect.Bottom:= ThumbRect.Top + TrackButton.ClientHeight;
  1113.         DiagonalHeight:= (ThumbRect.Bottom-ThumbRect.Top) div 2;
  1114.         ThumbRect.Left:= ALeft;
  1115.         if TickMarks = tmfcBoth then
  1116.         begin
  1117.            ThumbRect.Right:= ThumbRect.Left + ThumbLength;
  1118.            Brush.Color:= ThumbColor;
  1119.            FillRect(ThumbRect);
  1120.            DrawEdge(Handle, ThumbRect, EDGE_RAISED,
  1121.               BF_TOP or BF_LEFT);
  1122.            DrawEdge(Handle, ThumbRect, EDGE_RAISED,
  1123.               BF_BOTTOM + BF_RIGHT);
  1124.            exit;
  1125.         end
  1126.         else if TickMarks = tmfcBottomRight then
  1127.         begin
  1128.           ThumbRect.Right:= ThumbRect.Left + ThumbLength - DiagonalHeight;
  1129.           Brush.Color:= ThumbColor;
  1130.           FillRect(ThumbRect);
  1131.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1132.              BF_TOP or BF_LEFT);
  1133.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1134.              BF_BOTTOM);
  1135.           ThumbRect.Left:= ThumbRect.Right-1;
  1136.           ThumbRect.Right:= ThumbRect.Left + DiagonalHeight;
  1137.           ThumbRect.Top:= ThumbRect.Top + 1;
  1138.           ThumbRect.Bottom:= ThumbRect.Top+ DiagonalHeight;
  1139.           Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
  1140.           Triangle[1]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
  1141.           Triangle[2]:= Point(ThumbRect.Right-1, ThumbRect.Bottom-1);
  1142.           Pen.Color:=ThumbColor;
  1143.           Brush.Color:= ThumbColor;
  1144.           Polygon(Triangle);
  1145.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1146.              BF_DIAGONAL_ENDTOPLEFT);
  1147.           ThumbRect.Top:= ATop + DiagonalHeight;
  1148.           ThumbRect.Bottom:=ATop + TrackButton.ClientHeight;
  1149.           Triangle[0]:= Point(ThumbRect.Left, ThumbRect.Top);
  1150.           Triangle[1]:= Point(ThumbRect.Left, ThumbRect.Bottom-1);
  1151.           Triangle[2]:= Point(ThumbRect.Right-1, ThumbRect.Top);
  1152.           Pen.Color:=ThumbColor;
  1153.           Brush.Color:= ThumbColor;
  1154.           Polygon(Triangle);
  1155.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1156.             {BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMLEFT);
  1157.         end
  1158.         else begin
  1159.           ThumbRect.Left:= ThumbRect.Left + DiagonalHeight - 1;
  1160.           ThumbRect.Right:= ThumbRect.Left + ThumbLength - DiagonalHeight;
  1161.           Brush.Color:= ThumbColor;
  1162.           FillRect(ThumbRect);
  1163.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1164.              BF_TOP or BF_RIGHT);
  1165.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1166.              BF_BOTTOM);
  1167.           ThumbRect.Left:= ThumbRect.Left - DiagonalHeight+1;
  1168.           ThumbRect.Right:= ThumbRect.Left + DiagonalHeight;
  1169.           ThumbRect.Top:= ThumbRect.Top;
  1170.           ThumbRect.Bottom:= ThumbRect.Top+ DiagonalHeight;
  1171.           Triangle[0]:= Point(ThumbRect.right-1, ThumbRect.Top+1);
  1172.           Triangle[1]:= Point(ThumbRect.Right-1, ThumbRect.Bottom);
  1173.           Triangle[2]:= Point(ThumbRect.Left+1, ThumbRect.Bottom);
  1174.           Pen.Color:=ThumbColor;
  1175.           Brush.Color:= ThumbColor;
  1176.           Polygon(Triangle);
  1177.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1178.              BF_DIAGONAL_ENDTOPRIGHT);
  1179.           ThumbRect.Top:= ATop + DiagonalHeight;
  1180.           ThumbRect.Bottom:=ATop + TrackButton.ClientHeight;
  1181.           Triangle[0]:= Point(ThumbRect.Right-1, ThumbRect.Top+1);
  1182.           Triangle[1]:= Point(ThumbRect.Right-1, ThumbRect.Bottom-1);
  1183.           Triangle[2]:= Point(ThumbRect.Left+1, ThumbRect.Top+1);
  1184.           Pen.Color:=ThumbColor;
  1185.           Brush.Color:= ThumbColor;
  1186.           Polygon(Triangle);
  1187.           DrawEdge(Handle, ThumbRect, EDGE_RAISED,//BDR_RAISEDINNER,
  1188.             {BF_MIDDLE OR }BF_DIAGONAL_ENDBOTTOMRIGHT);//BOTTOMLEFT);
  1189.         end;
  1190.       end;
  1191.    end;
  1192. end;
  1193. procedure TfcTrackBar.DrawTickText(TickValue: Double; TickText: string; ARect: TRect);
  1194. var Flags: integer;
  1195.     DoDefault: boolean;
  1196. begin
  1197.   DoDefault:= True;
  1198.   if Assigned(FOnDrawTickText) then
  1199.      FOnDrawTickText(self, TickValue, TickText, ARect, DoDefault);
  1200.   if DoDefault then
  1201.   begin
  1202.      SetBkMode(Canvas.Handle, windows.TRANSPARENT);
  1203.      Flags:= DT_NOPREFIX;
  1204.      ARect.Right:= fcMax(ARect.Right, ARect.Left + Canvas.TextWidth(TickText));
  1205.      ARect.Bottom:= fcMax(ARect.Bottom, ARect.Top + Canvas.TextHeight(TickText));
  1206.      DrawText(Canvas.Handle, PChar(TickText), length(TickText), ARect, Flags);
  1207.   end;
  1208. end;
  1209. procedure TfcTrackBar.Paint;
  1210. var r: TRect;
  1211.     valstr: string;
  1212.     RulerRect: TRect;
  1213.     Current: Double;
  1214.     FocusRect: TRect;
  1215.     {$ifdef fcUseThemeManager}
  1216.     Details: TThemedElementDetails;
  1217.     {$endif}
  1218.     TickCount: integer;
  1219.     DrawFlags: Integer;
  1220.    procedure DrawTick(Current: Double; TickCount: integer);
  1221.    var x,y: integer;
  1222.        DisplayStr: string;
  1223.        ARect: TRect;
  1224.        DrawTickLabel: boolean;
  1225.    begin
  1226.       if TextAttributes.TickDisplayFormat = '' then
  1227.         DisplayStr:= floattostr(Current)
  1228.       else DisplayStr := FormatFloat(TextAttributes.TickDisplayFormat, Current);
  1229.       DrawTickLabel:= (TextAttributes.TickLabelFrequency >0) and ((TickCount mod TextAttributes.TickLabelFrequency) = 0);
  1230.       with Canvas do begin
  1231.            if orientation = trfcHorizontal then
  1232.            begin
  1233.               if TickMarks in [tmfcBottomRight, tmfcBoth] then
  1234.               begin
  1235.                  x:= RulerRect.Left + ValToPixel(Current);
  1236.                  y:= RulerRect.Bottom + FThumbTrackSeparation + 3;
  1237.                  MoveTo(x, y);
  1238.                  LineTo(x, y+4);
  1239.                  if DrawTickLabel then
  1240.                  begin
  1241.                      ARect:= Rect(x - TextWidth(DisplayStr) div 2, y+6,
  1242.                                   x + TextWidth(DisplayStr) div 2, y + 6 + TextHeight('A'));
  1243.                      DrawTickText(Current, DisplayStr, ARect);
  1244.                  end
  1245.               end;
  1246.               if TickMarks in [tmfcTopLeft, tmfcBoth] then
  1247.               begin
  1248.                 x:= RulerRect.Left + ValToPixel(Current);
  1249.                 y:= RulerRect.Top - 6 - 4;
  1250.                 MoveTo(x, y+4);
  1251.                 LineTo(x, y);
  1252.                 if DrawTickLabel and (TickMarks <> tmfcBoth) then
  1253.                 begin
  1254.                   ARect:= Rect(x-TextWidth(DisplayStr) div 2,
  1255.                                y - TextHeight('A')-1,
  1256.                                x + TextWidth(DisplayStr) div 2, y-1);
  1257.                   DrawTickText(Current, DisplayStr, ARect);
  1258.                 end
  1259.               end;
  1260.            end
  1261.            else begin
  1262.               if TickMarks in [tmfcBottomRight, tmfcBoth] then
  1263.               begin
  1264.                  x:= RulerRect.Right + FThumbTrackSeparation + 3;
  1265.                  y:= RulerRect.Top + ValToPixel(Current);
  1266.                  MoveTo(x, y);
  1267.                  LineTo(x+4, y);
  1268.                  if DrawTickLabel then
  1269.                  begin
  1270.                    ARect:= Rect(x+6, y - TextHeight('A') div 2,
  1271.                                 x+6+TextWidth(DisplayStr), y + TextHeight('A') div 2);
  1272.                    DrawTickText(Current, DisplayStr, ARect);
  1273.                  end
  1274.               end;
  1275.               if TickMarks in [tmfcTopLeft, tmfcBoth] then
  1276.               begin
  1277.                 x:= RulerRect.Left - 6 - 4;
  1278.                 y:= RulerRect.Top + ValToPixel(Current);
  1279.                 MoveTo(x+4, y);
  1280.                 LineTo(x, y);
  1281.                 if DrawTickLabel and (TickMarks <> tmfcBoth) then
  1282.                 begin
  1283.                   ARect:= Rect(x-TextWidth(DisplayStr)-1, y - TextHeight('A') div 2,
  1284.                                x-1, y + TextHeight('A') div 2);
  1285.                   DrawTickText(Current, DisplayStr, ARect);
  1286.                 end
  1287.               end
  1288.            end;
  1289.       end;
  1290.    end;
  1291. begin
  1292.    inherited Paint;
  1293.    RulerRect:= GetTrackBarRect;
  1294.    if orientation = trfcHorizontal then
  1295.    begin
  1296.       RulerRect.Left:= RulerRect.Left - TrackButton.Width div 2 + 1;
  1297.       RulerRect.Right:= RulerRect.Right + (TrackButton.Width div 2 - 1);
  1298.    end
  1299.    else begin
  1300.       RulerRect.Top:= RulerRect.Top - TrackButton.Height div 2 + 1;
  1301.       RulerRect.Bottom:= RulerRect.Bottom + (TrackButton.Height div 2 - 1);
  1302.    end;
  1303.    if fcUseThemes(self) then
  1304.    begin
  1305.       {$ifdef fcUseThemeManager}
  1306.       Details := ThemeServices.GetElementDetails(ttbTrack);
  1307.       ThemeServices.DrawElement(Canvas.Handle, Details, RulerRect);
  1308.       {$endif}
  1309.    end
  1310.    else begin
  1311.       with Canvas do begin
  1312.          { Draw the ruler }
  1313.          Brush.Color:= TrackColor;
  1314.          FillRect(RulerRect);
  1315.          Pen.Color:= clBtnShadow;
  1316.          MoveTo(RulerRect.Left-1, RulerRect.Bottom);
  1317.          LineTo(RulerRect.Left-1, RulerRect.Top);
  1318.          LineTo(RulerRect.Right, RulerRect.Top);
  1319.          Pen.Color:= clGray;
  1320.          MoveTo(RulerRect.Left, RulerRect.Bottom);
  1321.          LineTo(RulerRect.Left, RulerRect.Top+1);
  1322.          LineTo(RulerRect.Right, RulerRect.Top + 1);
  1323.          Pen.Color:= clBtnFace;
  1324.          MoveTo(RulerRect.Left-1, RulerRect.Bottom-1);
  1325.          LineTo(RulerRect.Right, RulerRect.Bottom-1);
  1326.          LineTo(RulerRect.Right, RulerRect.Top);
  1327.          Pen.Color:= clBtnHighlight;
  1328.          MoveTo(RulerRect.Left-1, RulerRect.Bottom);
  1329.          LineTo(RulerRect.Right+1, RulerRect.Bottom);
  1330.          LineTo(RulerRect.Right+1, RulerRect.Top);
  1331.       end;
  1332.    end;
  1333.    if FTrackPartialFillColor<>clNone then
  1334.    begin
  1335.       r:= GetTrackBarRect;
  1336.       if orientation = trfcHorizontal then
  1337.       begin
  1338.          r.Left:= r.Left - TrackButton.Width div 2 + 1;
  1339.          r.Right:= r.Right + (TrackButton.Width div 2 - 1);
  1340.       end
  1341.       else begin
  1342.          r.Top:= r.Top - TrackButton.Height div 2 + 1;
  1343.          r.Bottom:= r.Bottom + (TrackButton.Height div 2 - 1);
  1344.       end;
  1345.       InflateRect(r, -1, -1);
  1346.       if Orientation = trfcVertical then
  1347.       begin
  1348.          if Inverted then
  1349.          begin
  1350.             r.top:= r.Top + ValToPixel(Position);
  1351.          end
  1352.          else begin
  1353.             r.Bottom:= GetTrackBarRect.Top + ValToPixel(Position);
  1354.          end;
  1355.        end
  1356.        else begin
  1357.          if Inverted then
  1358.          begin
  1359.             r.left:= GetTrackBarRect.Left + ValToPixel(Position);
  1360.          end
  1361.          else begin
  1362.             r.Right:= GetTrackBarRect.Left + ValToPixel(Position);
  1363.          end
  1364.        end;
  1365.        Canvas.Brush.Color:= FTrackPartialFillColor;
  1366.        Canvas.FillRect(r);
  1367.    end;
  1368.    if (SelStart<>0) and (SelEnd>SelStart) then
  1369.    begin
  1370.       if fcUseThemes(self) and false then
  1371.       begin
  1372.       end
  1373.       else begin
  1374.          r:= GetTrackBarRect;
  1375.          InflateRect(r, -1, -1);
  1376.          if Orientation = trfcVertical then
  1377.          begin
  1378.            if Inverted then
  1379.            begin
  1380.               r.top:= r.Top + ValToPixel(SelStart);
  1381.               r.Bottom:= GetTrackBarRect.Top + ValToPixel(SelEnd);
  1382.            end
  1383.            else begin
  1384.               r.top:= GetTrackBarRect.Top + ValToPixel(SelStart);
  1385.               r.Bottom:= GetTrackBarRect.Top + ValToPixel(SelEnd);
  1386.            end;
  1387.          end
  1388.          else begin
  1389.            if Inverted then
  1390.            begin
  1391.              r.left:= GetTrackBarRect.Left + ValToPixel(SelStart);
  1392.              r.Right:= GetTrackBarRect.Left + ValToPixel(selEnd);
  1393.            end
  1394.            else begin
  1395.              r.left:= GetTrackBarRect.Left + ValToPixel(SelStart);
  1396.              r.Right:= GetTrackBarRect.Left + ValToPixel(selEnd);
  1397.            end
  1398.          end;
  1399.          Canvas.Brush.Color:= clHighlight;
  1400.          Canvas.FillRect(r);
  1401.       end
  1402.    end;
  1403.          { Now draw all the tics }
  1404.    with Canvas do begin
  1405.          Current:=Min;
  1406.          TickCount:= 0;
  1407.          RulerRect:= GetTrackBarRect;
  1408.          if TickStyle<>tsfcNone then
  1409.          begin
  1410.            While current<=Max do begin
  1411.               Pen.color:= clBlack;
  1412.               if TickStyle=tsfcManual then
  1413.               begin
  1414.                  if Current=min then DrawTick(Current, TickCount);
  1415.               end
  1416.               else begin
  1417.                  DrawTick(Current, TickCount);
  1418.               end;
  1419.               Current:= Current + Frequency;
  1420.               TickCount:= TickCount + 1;
  1421.            end;
  1422.            if TickStyle=tsfcManual then DrawTick(Current - Frequency, TickCount);
  1423.          end
  1424.    end;
  1425.    if Focused and not (csPaintCopy in ControlState) then
  1426.    begin
  1427.       FocusRect:= ClientRect;
  1428.       InflateRect(FocusRect, -2, -2);
  1429.       DrawFocusRect(Canvas, FocusRect);
  1430.    end;
  1431.    if orientation = trfcHorizontal then
  1432.       PaintThumb(
  1433.        GetTrackBarRect.Left + ValToPixel(Position) - (TrackButton.Width div 2), TrackButton.top)
  1434.    else
  1435.       PaintThumb(
  1436.        TrackButton.Left, GetTrackBarRect.Top + ValToPixel(Position) - (TrackButton.Height div 2));
  1437.    if TextAttributes.Showtext then
  1438.    begin
  1439.      if TextAttributes.DisplayFormat = '' then
  1440.         valstr:= floattostr(GetDBValue)
  1441. //        Str(Position, valStr)
  1442.      else ValStr := FormatFloat(TextAttributes.DisplayFormat, GetDBValue);
  1443. //     valstr:= floattostr(position);
  1444.      r:= ClientRect;
  1445.      Canvas.Font.Assign(Font);
  1446.      if TextAttributes.Position = tbtLeft then
  1447.      begin
  1448.        r.left:= TextAttributes.OffsetX + 3;
  1449.        r.top:= RulerRect.Top + ((RulerRect.Bottom - RulerRect.Top) - Canvas.TextHeight(valstr)) div 2;
  1450.        r.top:= r.top + TextAttributes.OffsetY;
  1451.      end
  1452.      else if TextAttributes.Position = tbtRight then
  1453.      begin
  1454.        r.left:= ClientWidth - Canvas.TextWidth(valstr) - TextAttributes.OffsetX - 3;
  1455.        r.top:= RulerRect.Top + ((RulerRect.Bottom - RulerRect.Top) - Canvas.TextHeight(valstr)) div 2;
  1456.        r.top:= r.top + TextAttributes.OffsetY;
  1457.      end
  1458.      else if TextAttributes.Position = tbtTop then
  1459.      begin
  1460.        r.left := RulerRect.Left + ((RulerRect.Right - RulerRect.Left) - Canvas.TextWidth(valstr)) div 2;
  1461.        r.left:= r.left + TextAttributes.OffsetX + 3;
  1462.        r.top:= TextAttributes.OffsetY + 1
  1463.      end
  1464.      else if TextAttributes.Position = tbtBottom then
  1465.      begin
  1466.        r.left := RulerRect.Left + ((RulerRect.Right - RulerRect.Left) - Canvas.TextWidth(valstr)) div 2;
  1467.        r.left:= r.left + TextAttributes.OffsetX + 3;
  1468.        r.top:= ClientHeight - Canvas.TextHeight(valstr) - TextAttributes.OffsetY - 3;
  1469.      end;
  1470.      SetBkMode(Canvas.Handle, windows.TRANSPARENT);
  1471.      Drawflags:= DT_NOPREFIX;
  1472.      DrawText(Canvas.Handle, pchar(valstr), length(valstr), r, DrawFlags);
  1473.    end;
  1474. end;
  1475. procedure TfcTrackBar.SetThumbColor(val: TColor);
  1476. begin
  1477.    if val<>FThumbColor then
  1478.    begin
  1479.       FThumbColor:= val;
  1480.       Invalidate;
  1481.    end
  1482. end;
  1483. procedure TfcTrackBar.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1484.     X, Y: Integer);
  1485. var pt:TPoint;
  1486.     tbr: TRect;
  1487. begin
  1488.    if CanFocus then SetFocus;
  1489.    inherited;
  1490.    pt := ScreenToClient(Mouse.CursorPos);
  1491.    tbr:= GetTrackBarRect;
  1492.    InflateRect( tbr, 2, 2);
  1493.    if not PtInRect(tbr, pt) then exit;
  1494.    if FRepeatTimer = nil then
  1495.      FRepeatTimer := TfcTrackRepeatTimer.Create(Self);
  1496.    if orientation = trfcHorizontal then
  1497.    begin
  1498.       if (pt.x<trackbutton.left) then
  1499.       begin
  1500.          if inverted then
  1501.          begin
  1502.            Position:= Position + Increment;
  1503.            FRepeatTimer.Increment:= Increment;
  1504.          end
  1505.          else begin
  1506.            Position:= Position - Increment;
  1507.            FRepeatTimer.Increment:= -Increment;
  1508.          end;
  1509.       end
  1510.       else if (pt.x>trackbutton.left + trackbutton.Width) then
  1511.       begin
  1512.          if inverted then
  1513.          begin
  1514.            Position:= Position - Increment;
  1515.            FRepeatTimer.Increment:= -Increment;
  1516.          end
  1517.          else begin
  1518.            Position:= Position + Increment;
  1519.            FRepeatTimer.Increment:= Increment;
  1520.          end
  1521.       end
  1522.    end
  1523.    else begin
  1524.       if (pt.y<trackbutton.top) then
  1525.       begin
  1526.          if Inverted then
  1527.          begin
  1528.            Position:= Position + Increment;
  1529.            FRepeatTimer.Increment:= Increment;
  1530.          end
  1531.          else begin
  1532.            Position:= Position - Increment;
  1533.            FRepeatTimer.Increment:= -Increment;
  1534.          end;
  1535.       end
  1536.       else if (pt.y>trackbutton.top + trackbutton.height) then
  1537.       begin
  1538.          if Inverted then
  1539.          begin
  1540.            Position:= Position - Increment;
  1541.            FRepeatTimer.Increment:= -Increment;
  1542.          end
  1543.          else begin
  1544.            Position:= Position + Increment;
  1545.            FRepeatTimer.Increment:= Increment;
  1546.          end;
  1547.       end
  1548.    end;
  1549.    FRepeatTimer.OnTimer := TimerExpired;
  1550.    FRepeatTimer.Interval := InitRepeatPause;
  1551.    FRepeatTimer.Enabled  := True;
  1552. end;
  1553. procedure TfcTrackBar.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1554.                                   X, Y: Integer);
  1555. begin
  1556.   inherited MouseUp (Button, Shift, X, Y);
  1557.   if FRepeatTimer <> nil then
  1558.     FRepeatTimer.Enabled  := False;
  1559. end;
  1560. procedure TfcTrackBar.TimerExpired(Sender: TObject);
  1561. var pt:TPoint;
  1562. begin
  1563.     try
  1564.        FRepeatTimer.Interval := RepeatPause;
  1565.        pt := ScreenToClient(Mouse.CursorPos);
  1566.        if orientation = trfcHorizontal then
  1567.        begin
  1568.           if (pt.y>ClientHeight) or (pt.y<0) then
  1569.              FRepeatTimer.Enabled:= False
  1570.           else if Inverted then
  1571.           begin
  1572.              if (pt.x<trackbutton.left) and (FRepeatTimer.Increment>0) then
  1573.                 Position:= Position + Increment
  1574.              else if (pt.x>trackbutton.left + trackbutton.Width) and (FRepeatTimer.Increment<0) then
  1575.                 Position:= Position - Increment
  1576.              else FRepeatTimer.Enabled:= False
  1577.           end
  1578.           else if (pt.x<trackbutton.left) and (FRepeatTimer.Increment<0) then
  1579.              Position:= Position - Increment
  1580.           else if (pt.x>trackbutton.left + trackbutton.Width) and (FRepeatTimer.Increment>0) then
  1581.              Position:= Position + Increment
  1582.           else
  1583.              FRepeatTimer.Enabled:= False
  1584.        end
  1585.        else begin
  1586.           if (pt.x>ClientWidth) or (pt.x<0) then
  1587.              FRepeatTimer.Enabled:= False
  1588.           else if Inverted then
  1589.           begin
  1590.              if (pt.y<trackbutton.top) and (FRepeatTimer.Increment>0) then
  1591.                 Position:= Position + Increment
  1592.              else if (pt.y>trackbutton.top + trackbutton.height) and (FRepeatTimer.Increment<0) then
  1593.                 Position:= Position - Increment
  1594.              else
  1595.                 FRepeatTimer.Enabled:= False
  1596.           end
  1597.           else if (pt.y<trackbutton.top) and (FRepeatTimer.Increment<0) then
  1598.              Position:= Position - Increment
  1599.           else if (pt.y>trackbutton.top + trackbutton.height) and (FRepeatTimer.Increment>0) then
  1600.              Position:= Position + Increment
  1601.           else
  1602.              FRepeatTimer.Enabled:= False
  1603.        end;
  1604.     except
  1605.       FRepeatTimer.Enabled := False;
  1606.       raise;
  1607.     end;
  1608. end;
  1609. procedure TfcTrackBar.KeyDown(var Key: word; Shift: TShiftState);
  1610. begin
  1611.    inherited;
  1612.    if Key in [vk_right, vk_down] then
  1613.    begin
  1614.      if Inverted then
  1615.        Position:= Position - Increment
  1616.      else
  1617.        Position:= Position + Increment
  1618.    end
  1619.    else if key in [vk_left, vk_up] then begin
  1620.      if Inverted then
  1621.        Position:= Position + Increment
  1622.      else
  1623.        Position:= Position - Increment;
  1624.    end
  1625.    else if key = vk_next then
  1626.    begin
  1627.      if Inverted then
  1628.        Position:= Position - PageSize
  1629.      else
  1630.        Position:= Position + PageSize;
  1631.    end
  1632.    else if key = vk_prior then
  1633.    begin
  1634.      if Inverted then
  1635.        Position:= Position + PageSize
  1636.      else
  1637.        Position:= Position - PageSize;
  1638.    end;
  1639. end;
  1640. procedure TfcTrackBar.WMGetDlgCode(var Message: TWMGetDlgCode);
  1641. begin
  1642.   inherited;
  1643.   Message.Result := Message.Result or DLGC_WANTARROWS;
  1644. end;
  1645. procedure TfcTrackBar.WMSetFocus(var Message: TWMSetFocus);
  1646. begin
  1647.   inherited;
  1648. end;
  1649. procedure TfcTrackBar.CMEnter(var Message: TCMEnter);
  1650. begin
  1651.    inherited;
  1652.    invalidate;
  1653. end;
  1654. procedure TfcTrackBar.CMExit(var Message: TCMExit);
  1655. begin
  1656.    inherited;
  1657.    UpdateRecord;
  1658.    invalidate;
  1659. end;
  1660. procedure TfcTrackBar.UpdateRecord;
  1661. //var lastModified: boolean;
  1662. begin
  1663. //  lastModified:= modified;
  1664.   try
  1665.     FDataLink.UpdateRecord;
  1666.   except
  1667.     SetFocus;
  1668. //    modified:= lastModified;
  1669.     raise;
  1670.   end;
  1671. end;
  1672. Function TfcTrackBar.GetDBValue: Double;
  1673. var Value: Double;
  1674. begin
  1675.    if (FDataLink.Field <> nil) and (Datasource<>nil) and (Datasource.state = dsBrowse) then
  1676.    begin
  1677.       Value:= FDataLink.Field.AsFloat;
  1678.       result:= Value;
  1679.    end
  1680.    else begin
  1681.       result:= GetPosition;
  1682.    end;
  1683. end;
  1684. Function TfcTrackBar.GetPosition: Double;
  1685. var Value: Double;
  1686. begin
  1687.    if (csPaintCopy in  ControlState) and (FDataLink.Field <> nil) then
  1688.    begin
  1689.       Value:= FDataLink.Field.AsFloat;
  1690.       Value:= Round(Value / Increment) * Increment;
  1691.       result:= Value;
  1692.    end
  1693.    else begin
  1694.       result:= FPosition;
  1695.    end;
  1696. end;
  1697. procedure TfcTrackBar.PositionChanging;
  1698. begin
  1699.    if csDesigning in ComponentState then exit;
  1700.    if Skipedit then exit;
  1701.    if EditCanModify then DataLink.Edit;
  1702. end;
  1703. function TfcTrackBar.EffectiveReadOnly: Boolean;
  1704. begin
  1705.   result:= FReadOnly or FDataLink.ReadOnly or
  1706.            ((FDataLink.Field<>nil) and (not FDataLink.Field.CanModify));
  1707. end;
  1708. function TfcTrackBar.EditCanModify: Boolean;
  1709. begin
  1710.   result:= False;
  1711.   if EffectiveReadOnly then exit;
  1712.   // Respect autoedit
  1713.   if (DataSource<>Nil) and (not DataSource.autoEdit) then
  1714.      if (not (DataSource.state in [dsEdit, dsInsert])) then exit;
  1715.   if FDatalink.Field <> nil then result := FDataLink.Edit
  1716.   else result := True;
  1717. end;
  1718. procedure TfcTrackBar.UpdateData(Sender: TObject);
  1719. begin
  1720.     if (FDataLink.Field.asFloat <> Position) then
  1721.        FDataLink.Field.asFloat:= Position;
  1722. end;
  1723. procedure TfcTrackBarText.SetFont(Value: TFont);
  1724. begin
  1725.   Owner.Font.Assign(Value);
  1726.   Owner.Invalidate;
  1727. end;
  1728. procedure TfcTrackBarText.SetPosition(Value: TfcTrackBarTextPosition);
  1729. begin
  1730.    FPosition:= Value;
  1731.    Owner.Invalidate;
  1732. end;
  1733. procedure TfcTrackBarText.SetOffsetX(Value: integer);
  1734. begin
  1735.    FOffsetX:= Value;
  1736.    Owner.Invalidate;
  1737. end;
  1738. procedure TfcTrackBarText.SetOffsetY(Value: integer);
  1739. begin
  1740.    FOffsetY:= Value;
  1741.    Owner.Invalidate;
  1742. end;
  1743. procedure TfcTrackBarText.SetDisplayFormat(Value: String);
  1744. begin
  1745.    FDisplayFormat:= Value;
  1746.    Owner.Invalidate;
  1747. end;
  1748. procedure TfcTrackBarText.SetShowText(Value: boolean);
  1749. begin
  1750.    FShowText:= Value;
  1751.    Owner.Invalidate;
  1752. end;
  1753. procedure TfcTrackBarText.SetTickLabelFrequency(Value: integer);
  1754. begin
  1755.    FTickLabelFrequency:= Value;
  1756.    Owner.Invalidate;
  1757. end;
  1758. procedure TfcTrackBarText.SetTickDisplayFormat(Value: string);
  1759. begin
  1760.    FTickDisplayFormat:= Value;
  1761.    Owner.Invalidate;
  1762. end;
  1763. function TfcTrackBarText.GetFont: TFont;
  1764. begin
  1765.    result:= Owner.Font;
  1766. end;
  1767. constructor TfcTrackBarText.Create(AOwner: TComponent);
  1768. begin
  1769.    inherited Create;
  1770.    Owner:= AOwner as TfcTrackBar;
  1771.    FOffsetX:= 0;
  1772.    FOffsetY:= 0;
  1773.    FPosition:= tbtLeft;
  1774.    FShowText:= False;
  1775.    FTickLabelFrequency:= 0;
  1776. end;
  1777. procedure TfcTrackBar.CMGetDataLink(var Message: TMessage);
  1778. begin
  1779.   Message.Result := Integer(FDataLink);
  1780. end;
  1781. procedure TfcTrackBar.SetSpacingLeftTop(Value: integer);
  1782. begin
  1783.    FSpacingLeftTop:= Value;
  1784.    Invalidate;
  1785. end;
  1786. procedure TfcTrackBar.SetSpacingRightBottom(Value: integer);
  1787. begin
  1788.    FSpacingRightBottom:= Value;
  1789.    Invalidate;
  1790. end;
  1791. procedure TfcTrackBar.SetSpacingEdgeTrackbar(Value: integer);
  1792. begin
  1793.    FSpacingEdgeTrackbar:= Value;
  1794.    Invalidate;
  1795. end;
  1796. procedure TfcTrackBar.SetTrackColor(Value: TColor);
  1797. begin
  1798.    if Value<>FTrackColor then
  1799.    begin
  1800.       FTrackColor:= Value;
  1801.       Invalidate;
  1802.    end
  1803. end;
  1804. procedure TfcTrackBar.SetTrackPartialFillColor(Value: TColor);
  1805. begin
  1806.    if Value<>FTrackPartialFillColor then
  1807.    begin
  1808.       FTrackPartialFillColor:= Value;
  1809.       Invalidate;
  1810.    end
  1811. end;
  1812. end.