Browse Source

Merge pull request #180 from bgrabitmap/dev-bgracontrols

Dev bgracontrols v9.0.1.5
Leandro Oscar Ezequiel Diaz 1 year ago
parent
commit
1380caf99f

+ 94 - 144
bgraknob.pas

@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: LGPL-3.0-linking-exception
 // SPDX-License-Identifier: LGPL-3.0-linking-exception
 {
 {
-  Iintially written by Circular.
+  Initially written by Circular.
 }
 }
 {******************************* CONTRIBUTOR(S) ******************************
 {******************************* CONTRIBUTOR(S) ******************************
 - Edivando S. Santos Brasil | [email protected]
 - Edivando S. Santos Brasil | [email protected]
@@ -49,7 +49,6 @@ type
     FOnKnobValueChange: TBGRAKnobValueChangedEvent;
     FOnKnobValueChange: TBGRAKnobValueChangedEvent;
     FStartFromBottom: boolean;
     FStartFromBottom: boolean;
     FWheelSpeed: byte;                   // 0 : no wheel, 1 slowest, 255 fastest
     FWheelSpeed: byte;                   // 0 : no wheel, 1 slowest, 255 fastest
-    FWheelSpeedFactor: single;
     FWheelWrap: boolean;
     FWheelWrap: boolean;
     FSlowSnap: boolean;
     FSlowSnap: boolean;
     FReverseScale: boolean;
     FReverseScale: boolean;
@@ -95,8 +94,6 @@ type
     function DoMouseWheel(Shift: TShiftState; WheelDelta: integer; MousePos: TPoint): boolean; override;
     function DoMouseWheel(Shift: TShiftState; WheelDelta: integer; MousePos: TPoint): boolean; override;
     procedure MouseWheelPos({%H-}Shift: TShiftState; WheelDelta: integer); virtual;
     procedure MouseWheelPos({%H-}Shift: TShiftState; WheelDelta: integer); virtual;
     function RemapRange(OldValue: single; OldMin, OldMax, NewMin, NewMax: single): single;
     function RemapRange(OldValue: single; OldMin, OldMax, NewMin, NewMax: single): single;
-    function CalcValueFromSector(Sector: integer): single;
-    function CalcSectorFromValue(AValue: single): integer;
     function AngularPosSector(AValue: single): single;
     function AngularPosSector(AValue: single): single;
   public
   public
     { Public declarations }
     { Public declarations }
@@ -113,29 +110,29 @@ type
   published
   published
     { Published declarations }
     { Published declarations }
     property Anchors;
     property Anchors;
-    property CurveExponent: single read FCurveExponent write SetCurveExponent;
-    property KnobColor: TColor read FKnobColor write SetKnobColor;
-    property LightIntensity: integer read GetLightIntensity write SetLightIntensity;
-    property PositionColor: TColor read FPositionColor write SetPositionColor;
-    property PositionWidth: single read FPositionWidth write SetPositionWidth;
-    property PositionOpacity: byte read FPositionOpacity write SetPositionOpacity;
-    property PositionMargin: single read FPositionMargin write SetPositionMargin;
+    property CurveExponent: single read FCurveExponent write SetCurveExponent nodefault;
+    property KnobColor: TColor read FKnobColor write SetKnobColor default clBtnFace;
+    property LightIntensity: integer read GetLightIntensity write SetLightIntensity default 300;
+    property PositionColor: TColor read FPositionColor write SetPositionColor default clBtnText;
+    property PositionWidth: single read FPositionWidth write SetPositionWidth default 4;
+    property PositionOpacity: byte read FPositionOpacity write SetPositionOpacity default 192;
+    property PositionMargin: single read FPositionMargin write SetPositionMargin default 4;
     property PositionType: TBGRAKnobPositionType
     property PositionType: TBGRAKnobPositionType
-      read FPositionType write SetPositionType;
-    property UsePhongLighting: boolean read FUsePhongLighting write SetUsePhongLighting;
+      read FPositionType write SetPositionType default kptLineSquareCap;
+    property UsePhongLighting: boolean read FUsePhongLighting write SetUsePhongLighting default true;
     property MinValue: single read FMinValue write SetMinValue nodefault;
     property MinValue: single read FMinValue write SetMinValue nodefault;
     property MaxValue: single read FMaxValue write SetMaxValue nodefault;
     property MaxValue: single read FMaxValue write SetMaxValue nodefault;
-    property StartFromBottom: boolean read FStartFromBottom write SetStartFromBottom;
-    property StartAngle: single read FStartAngle write SetStartAngle nodefault;
-    property EndAngle: single read FEndAngle write SetEndAngle;
-    property KnobType: TKnobType read FKnobType write SetKnobType;
+    property StartFromBottom: boolean read FStartFromBottom write SetStartFromBottom default true;
+    property StartAngle: single read FStartAngle write SetStartAngle default 30;
+    property EndAngle: single read FEndAngle write SetEndAngle default 330;
+    property KnobType: TKnobType read FKnobType write SetKnobType default ktRange;
     property Value: single read GetValue write SetValue nodefault;
     property Value: single read GetValue write SetValue nodefault;
     property OnValueChanged: TBGRAKnobValueChangedEvent
     property OnValueChanged: TBGRAKnobValueChangedEvent
       read FOnKnobValueChange write FOnKnobValueChange;
       read FOnKnobValueChange write FOnKnobValueChange;
-    property WheelSpeed: byte read FWheelSpeed write SetWheelSpeed;
-    property WheelWrap: boolean read FWheelWrap write FWheelWrap;
-    property SlowSnap: boolean read FSlowSnap write FSlowSnap;
-    property ReverseScale: boolean read FReverseScale write SetReverseScale;
+    property WheelSpeed: byte read FWheelSpeed write SetWheelSpeed default 0;
+    property WheelWrap: boolean read FWheelWrap write FWheelWrap default false;
+    property SlowSnap: boolean read FSlowSnap write FSlowSnap default false;
+    property ReverseScale: boolean read FReverseScale write SetReverseScale default false;
     property OnMouseWheel;
     property OnMouseWheel;
     property OnClick;
     property OnClick;
     property OnDblClick;
     property OnDblClick;
@@ -151,22 +148,24 @@ type
   {$ENDIF}
   {$ENDIF}
 
 
 const
 const
-  WHEELSPEEDFACTOR = 20.0;  // used to calculate mouse wheel speed
-  WHEELSPEEDBASE = 300;
-  VERSIONSTR = '2.10';      // knob version
+  VERSIONSTR = '2.11';      // knob version
 
 
 implementation
 implementation
 
 
 uses Math;
 uses Math;
 
 
-  {$IFDEF FPC}
+const
+  WHEELSPEEDFACTOR = 20.0;  // used to calculate mouse wheel speed
+  WHEELSPEEDBASE = 300;
+
+{$IFDEF FPC}
 procedure Register;
 procedure Register;
 begin
 begin
   RegisterComponents('BGRA Controls', [TBGRAKnob]);
   RegisterComponents('BGRA Controls', [TBGRAKnob]);
 end;
 end;
-  {$ENDIF}
+{$ENDIF}
 
 
-  { TBGRAKnob }
+{ TBGRAKnob }
 
 
 // Override the base class which has a rectangular dimension, odd for a knob
 // Override the base class which has a rectangular dimension, odd for a knob
 class function TBGRAKnob.GetControlClassDefaultSize: TSize;
 class function TBGRAKnob.GetControlClassDefaultSize: TSize;
@@ -219,7 +218,7 @@ begin
         v.y := v.y / (ty / 2 + 1);
         v.y := v.y / (ty / 2 + 1);
 
 
         //compute squared distance with scalar product
         //compute squared distance with scalar product
-        d2 := v {$if FPC_FULLVERSION < 030301} * {$ELSE} ** {$ENDIF} v;
+        d2 := v {$if FPC_FULLVERSION < 30203}*{$ELSE}**{$ENDIF} v;
 
 
         //interpolate as quadratic curve and apply power function
         //interpolate as quadratic curve and apply power function
         if d2 > 1 then
         if d2 > 1 then
@@ -253,6 +252,24 @@ begin
   Result := round(FPhong.LightSourceIntensity);
   Result := round(FPhong.LightSourceIntensity);
 end;
 end;
 
 
+function TBGRAKnob.GetValue: single;
+begin
+  // Maintains the correct value range based on knobtype, result in terms of
+  // FMinValue and FMaxValue
+
+  Result := RemapRange(AngularPosToDeg(FAngularPos), FStartAngle,
+    FEndAngle, FMinValue, FMaxValue);
+
+  // Check to Reverse the scale and fix value
+
+  if FReverseScale then
+    Result := FMaxValue + FMinValue - Result;
+
+  if FKnobType = ktSector then
+    Result := Round(Result);
+
+end;
+
 function TBGRAKnob.AngularPosToDeg(RadPos: single): single;
 function TBGRAKnob.AngularPosToDeg(RadPos: single): single;
 begin
 begin
   // helper to convert AnglePos in radians to degrees, wraps as needed
   // helper to convert AnglePos in radians to degrees, wraps as needed
@@ -281,7 +298,6 @@ end;
 
 
 function TBGRAKnob.AngularPosSector(AValue: single): single;
 function TBGRAKnob.AngularPosSector(AValue: single): single;
 var
 var
-  valueMapped: single;
   sector: integer;
   sector: integer;
 begin
 begin
   // AValue is the degree angle of FAngularPos of where the mouse is
   // AValue is the degree angle of FAngularPos of where the mouse is
@@ -293,16 +309,10 @@ begin
     Avalue := FStartAngle;
     Avalue := FStartAngle;
 
 
   // from the current angular pos get the value
   // from the current angular pos get the value
-  valueMapped := RemapRange(AValue, FStartAngle, FEndAngle, FMinValue, FMaxValue);
-
-  // now with that value we can see what sector is returned
-  sector := CalcSectorFromValue(valueMapped);
-
-  // once we have the sector we need to get back to the value for that sector
-  valueMapped := CalcValueFromSector(sector);
+  sector := Round(RemapRange(AValue, FStartAngle, FEndAngle, FMinValue, FMaxValue));
 
 
   // now get back the FAngularPos after mapping
   // now get back the FAngularPos after mapping
-  Result := DegPosToAngular(RemapRange(valueMapped, FMinValue, FMaxValue, FStartAngle, FEndAngle));
+  Result := DegPosToAngular(RemapRange(sector, FMinValue, FMaxValue, FStartAngle, FEndAngle));
 end;
 end;
 
 
 function TBGRAKnob.ValueCorrection(var AValue: single): boolean;
 function TBGRAKnob.ValueCorrection(var AValue: single): boolean;
@@ -336,65 +346,6 @@ begin
     FAngularPos := DegPosToAngular(LValue); // Back to Radians
     FAngularPos := DegPosToAngular(LValue); // Back to Radians
 end;
 end;
 
 
-function TBGRAKnob.GetValue: single;
-begin
-  // Maintains the correct value range based on knobtype, result in terms of
-  // FMinValue and FMaxValue
-
-  Result := RemapRange(AngularPosToDeg(FAngularPos), FStartAngle,
-    FEndAngle, FMinValue, FMaxValue);
-
-  // Check to Reverse the scale and fix value
-
-  if FReverseScale then
-    Result := FMaxValue + FMinValue - Result;
-
-  if FKnobType = ktSector then
-    Result := CalcSectorFromValue(Result);
-
-end;
-
-procedure TBGRAKnob.SetValue(AValue: single);
-var
-  NewAngularPos: single;
-begin
-  // AValue in the range of FStartAngle and FEndAngles after the mapping
-
-  if AValue > FMaxValue then
-    AValue := FMaxValue;
-
-  if AValue < FMinValue then
-    AValue := FMinValue;
-
-  // Get the value from given sector,
-
-  if FKnobType = ktSector then
-    AValue := CalcValueFromSector(Round(AValue));    // Round to sector
-
-  AValue := RemapRange(AValue, FMinValue, FMaxValue, FStartAngle, FEndAngle);
-
-  // Reverse the scale if needed
-
-  if FReverseScale then
-    AValue := FEndAngle + FStartAngle - AValue;
-
-  ValueCorrection(AValue);
-
-  NewAngularPos := 3 * Pi / 2 - AValue * Pi / 180;
-
-  if NewAngularPos > Pi then
-    NewAngularPos := NewAngularPos - (2 * Pi);
-
-  if NewAngularPos < -Pi then
-    NewAngularPos := NewAngularPos + (2 * Pi);
-
-  if NewAngularPos <> FAngularPos then
-  begin
-    FAngularPos := NewAngularPos;
-    Invalidate;
-  end;
-end;
-
 function TBGRAKnob.RemapRange(OldValue: single;
 function TBGRAKnob.RemapRange(OldValue: single;
   OldMin, OldMax, NewMin, NewMax: single): single;
   OldMin, OldMax, NewMin, NewMax: single): single;
 begin
 begin
@@ -412,47 +363,6 @@ begin
   Result := (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin;
   Result := (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin;
 end;
 end;
 
 
-function TBGRAKnob.CalcValueFromSector(Sector: integer): single;
-var
-  sectorSpan, secValue: single;
-begin
-  // Given a sector offset get the value where it's at.
-
-  // Check for some sane values
-
-  if Sector > MaxValue then
-    exit(FMaxValue);
-
-  if Sector < MinValue then
-    exit(FMinValue);
-
-  sectorSpan := (FMaxValue - FMinValue) / FSectorDivisions;
-  secValue := Sector * SectorSpan;
-
-  Result := secValue;
-end;
-
-function TBGRAKnob.CalcSectorFromValue(AValue: single): integer;
-var
-  sectorSpan: single;
-  secValue: integer;
-begin
-  // We need to get the matching sector that the value lands in.
-  // If we are PAST the previous sector (end of a sector range is the NEXT Sector), we are in that
-  // next sector, so sector endpoints are the sector starts, For 2 sectors
-  // angles of 0-178 (In first) 179-360 (In second) etc.
-
-  sectorSpan := (FMaxValue - FMinValue) / FSectorDivisions;
-
-  // could happen with rare odd values...
-
-  if sectorSpan = 0.0 then
-    exit(Round(FMinValue));
-
-  secValue := Round(AValue / sectorSpan);
-  Result := secValue;
-end;
-
 procedure TBGRAKnob.SetCurveExponent(const AValue: single);
 procedure TBGRAKnob.SetCurveExponent(const AValue: single);
 begin
 begin
   if FCurveExponent = AValue then
   if FCurveExponent = AValue then
@@ -512,6 +422,47 @@ begin
   Invalidate;
   Invalidate;
 end;
 end;
 
 
+procedure TBGRAKnob.SetValue(AValue: single);
+var
+  NewAngularPos: single;
+begin
+  // AValue in the range of FStartAngle and FEndAngles after the mapping
+
+  if AValue > FMaxValue then
+    AValue := FMaxValue;
+
+  if AValue < FMinValue then
+    AValue := FMinValue;
+
+  // Get the integeral value from given sector,
+
+  if FKnobType = ktSector then
+    AValue := Round(AValue);  // Round to sector
+
+  AValue := RemapRange(AValue, FMinValue, FMaxValue, FStartAngle, FEndAngle);
+
+  // Reverse the scale if needed
+
+  if FReverseScale then
+    AValue := FEndAngle + FStartAngle - AValue;
+
+  ValueCorrection(AValue);
+
+  NewAngularPos := 3 * Pi / 2 - AValue * Pi / 180;
+
+  if NewAngularPos > Pi then
+    NewAngularPos := NewAngularPos - (2 * Pi);
+
+  if NewAngularPos < -Pi then
+    NewAngularPos := NewAngularPos + (2 * Pi);
+
+  if NewAngularPos <> FAngularPos then
+  begin
+    FAngularPos := NewAngularPos;
+    Invalidate;
+  end;
+end;
+
 procedure TBGRAKnob.SetEndAngle(AValue: single);
 procedure TBGRAKnob.SetEndAngle(AValue: single);
 var
 var
   oldValue: single;
   oldValue: single;
@@ -858,7 +809,6 @@ begin
   FOnKnobValueChange := nil;
   FOnKnobValueChange := nil;
   FStartFromBottom := True;
   FStartFromBottom := True;
   FWheelSpeed := 0;        // 0, no wheel, 1 slowest, 255 fastest
   FWheelSpeed := 0;        // 0, no wheel, 1 slowest, 255 fastest
-  FWheelSpeedFactor := WHEELSPEEDFACTOR;   // factor for the mousewheel speed
   FWheelWrap := False;     // don't allow the mouse wheel to wrap around
   FWheelWrap := False;     // don't allow the mouse wheel to wrap around
   FSlowSnap := False;      // True : less snap around on min/max
   FSlowSnap := False;      // True : less snap around on min/max
   FReverseScale := False;  // Flips direction around if True
   FReverseScale := False;  // Flips direction around if True
@@ -933,17 +883,17 @@ begin
     if FKnobType = ktRange then
     if FKnobType = ktRange then
     begin
     begin
       newValue := Value + (FMaxValue - FMinValue) * WheelDelta /
       newValue := Value + (FMaxValue - FMinValue) * WheelDelta /
-        ((WHEELSPEEDBASE - FWheelSpeed) * FWheelSpeedFactor);
+        ((WHEELSPEEDBASE - FWheelSpeed) * WHEELSPEEDFACTOR);
 
 
       // Check for wrap in either direction
       // Check for wrap in either direction
 
 
       if FWheelWrap then
       if FWheelWrap then
       begin
       begin
         if newValue > FMaxValue then
         if newValue > FMaxValue then
-          newValue := FMinValue;
-
-        if newValue < FMinValue then
-          newValue := FMaxValue;
+          newValue := FMinValue
+        else
+          if newValue < FMinValue then
+            newValue := FMaxValue;
       end;
       end;
     end
     end
     else
     else
@@ -990,4 +940,4 @@ begin
     FOnKnobValueChange(Self, Value);
     FOnKnobValueChange(Self, Value);
 end;
 end;
 
 
-end.
+end.

+ 50 - 40
test/test_bccombobox/umain.lfm

@@ -1,19 +1,18 @@
 object Form1: TForm1
 object Form1: TForm1
   Left = 433
   Left = 433
-  Height = 218
+  Height = 174
   Top = 119
   Top = 119
-  Width = 400
+  Width = 320
   Caption = 'Form1'
   Caption = 'Form1'
-  ClientHeight = 218
-  ClientWidth = 400
-  DesignTimePPI = 120
+  ClientHeight = 174
+  ClientWidth = 320
   OnCreate = FormCreate
   OnCreate = FormCreate
-  LCLVersion = '2.0.2.0'
+  LCLVersion = '3.2.0.0'
   object BCComboBox1: TBCComboBox
   object BCComboBox1: TBCComboBox
-    Left = 10
-    Height = 49
-    Top = 10
-    Width = 184
+    Left = 8
+    Height = 39
+    Top = 8
+    Width = 147
     Items.Strings = (
     Items.Strings = (
       'One'
       'One'
       'Two'
       'Two'
@@ -22,6 +21,7 @@ object Form1: TForm1
     ItemIndex = 0
     ItemIndex = 0
     ArrowSize = 8
     ArrowSize = 8
     ArrowWidth = 16
     ArrowWidth = 16
+    FocusBorderOpacity = 0
     DropDownBorderColor = 4194304
     DropDownBorderColor = 4194304
     DropDownColor = 8405056
     DropDownColor = 8405056
     DropDownFontColor = 16770790
     DropDownFontColor = 16770790
@@ -108,65 +108,75 @@ object Form1: TForm1
     StateNormal.FontEx.Style = [fsBold]
     StateNormal.FontEx.Style = [fsBold]
     StaticButton = False
     StaticButton = False
     OnChange = BCComboBox1Change
     OnChange = BCComboBox1Change
+    TabOrder = 0
   end
   end
   object Label1: TLabel
   object Label1: TLabel
-    Left = 208
-    Height = 22
-    Top = 24
-    Width = 53
+    Left = 166
+    Height = 15
+    Top = 19
+    Width = 41
     Caption = 'Waiting'
     Caption = 'Waiting'
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
   end
   end
   object Label2: TLabel
   object Label2: TLabel
-    Left = 12
-    Height = 22
-    Top = 82
-    Width = 41
+    Left = 10
+    Height = 15
+    Top = 66
+    Width = 31
     Caption = 'Style :'
     Caption = 'Style :'
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
   end
   end
   object RadioFlash: TBGRAThemeRadioButton
   object RadioFlash: TBGRAThemeRadioButton
-    Left = 8
-    Height = 22
-    Top = 152
-    Width = 69
+    Left = 6
+    Height = 18
+    Top = 122
+    Width = 55
+    Theme = BGRAColorTheme1
     Caption = 'Flash'
     Caption = 'Flash'
     Checked = False
     Checked = False
-    Theme = BGRAColorTheme1
     OnChange = RadioButtonChange
     OnChange = RadioButtonChange
   end
   end
   object RadioWin7: TBGRAThemeRadioButton
   object RadioWin7: TBGRAThemeRadioButton
-    Left = 8
-    Height = 22
-    Top = 128
-    Width = 66
+    Left = 6
+    Height = 18
+    Top = 102
+    Width = 53
+    Theme = BGRAColorTheme1
     Caption = 'Win7'
     Caption = 'Win7'
     Checked = False
     Checked = False
-    Theme = BGRAColorTheme1
     OnChange = RadioButtonChange
     OnChange = RadioButtonChange
   end
   end
   object RadioCustom: TBGRAThemeRadioButton
   object RadioCustom: TBGRAThemeRadioButton
-    Left = 8
-    Height = 22
-    Top = 176
-    Width = 86
+    Left = 6
+    Height = 18
+    Top = 141
+    Width = 69
+    Theme = BGRAColorTheme1
     Caption = 'Custom'
     Caption = 'Custom'
     Checked = False
     Checked = False
-    Theme = BGRAColorTheme1
     OnChange = RadioButtonChange
     OnChange = RadioButtonChange
   end
   end
   object RadioDefault: TBGRAThemeRadioButton
   object RadioDefault: TBGRAThemeRadioButton
-    Left = 8
-    Height = 22
-    Top = 104
-    Width = 86
+    Left = 6
+    Height = 18
+    Top = 83
+    Width = 69
+    Theme = BGRAColorTheme1
     Caption = 'Default'
     Caption = 'Default'
     Checked = True
     Checked = True
-    Theme = BGRAColorTheme1
     OnChange = RadioButtonChange
     OnChange = RadioButtonChange
   end
   end
+  object Button1: TButton
+    Left = 224
+    Height = 25
+    Top = 134
+    Width = 75
+    Caption = 'Modal...'
+    TabOrder = 5
+    OnClick = Button1Click
+  end
   object BGRAColorTheme1: TBGRAColorTheme
   object BGRAColorTheme1: TBGRAColorTheme
     ColorNormal = clBlack
     ColorNormal = clBlack
     ColorHover = 24576
     ColorHover = 24576
@@ -174,7 +184,7 @@ object Form1: TForm1
     ColorDisabled = clGray
     ColorDisabled = clGray
     ColorFocused = clMoneyGreen
     ColorFocused = clMoneyGreen
     ColorText = clBlack
     ColorText = clBlack
-    left = 240
-    top = 90
+    Left = 192
+    Top = 72
   end
   end
 end
 end

+ 16 - 0
test/test_bccombobox/umain.pas

@@ -15,6 +15,7 @@ type
   TForm1 = class(TForm)
   TForm1 = class(TForm)
     BCComboBox1: TBCComboBox;
     BCComboBox1: TBCComboBox;
     BGRAColorTheme1: TBGRAColorTheme;
     BGRAColorTheme1: TBGRAColorTheme;
+    Button1: TButton;
     Label1: TLabel;
     Label1: TLabel;
     Label2: TLabel;
     Label2: TLabel;
     RadioCustom: TBGRAThemeRadioButton;
     RadioCustom: TBGRAThemeRadioButton;
@@ -22,6 +23,7 @@ type
     RadioWin7: TBGRAThemeRadioButton;
     RadioWin7: TBGRAThemeRadioButton;
     RadioDefault: TBGRAThemeRadioButton;
     RadioDefault: TBGRAThemeRadioButton;
     procedure BCComboBox1Change(Sender: TObject);
     procedure BCComboBox1Change(Sender: TObject);
+    procedure Button1Click(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure RadioButtonChange(Sender: TObject);
     procedure RadioButtonChange(Sender: TObject);
   private
   private
@@ -61,6 +63,20 @@ begin
   Label1.Caption := 'Changed to '+BCComboBox1.Text;
   Label1.Caption := 'Changed to '+BCComboBox1.Text;
 end;
 end;
 
 
+procedure TForm1.Button1Click(Sender: TObject);
+var f: TForm1;
+begin
+  Hide;
+  f := TForm1.Create(nil);
+  f.Button1.Visible := false;
+  try
+    f.ShowModal;
+  finally
+    f.Free;
+  end;
+  Close;
+end;
+
 procedure TForm1.OnBCComboBoxDrawItem(Control: TWinControl; Index: integer;
 procedure TForm1.OnBCComboBoxDrawItem(Control: TWinControl; Index: integer;
   ARect: TRect; State: TOwnerDrawState);
   ARect: TRect; State: TOwnerDrawState);
 var
 var

BIN
test/test_bgraknob/project1.ico


+ 87 - 0
test/test_bgraknob/project1.lpi

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="12"/>
+    <PathDelim Value="\"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <Title Value="project1"/>
+      <Scaled Value="True"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+      <XPManifest>
+        <DpiAware Value="True"/>
+      </XPManifest>
+      <Icon Value="0"/>
+    </General>
+    <BuildModes>
+      <Item Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <UseFileFilters Value="True"/>
+    </PublishOptions>
+    <RunParams>
+      <FormatVersion Value="2"/>
+    </RunParams>
+    <RequiredPackages>
+      <Item>
+        <PackageName Value="bgracontrols"/>
+      </Item>
+      <Item>
+        <PackageName Value="LCL"/>
+      </Item>
+    </RequiredPackages>
+    <Units>
+      <Unit>
+        <Filename Value="project1.lpr"/>
+        <IsPartOfProject Value="True"/>
+      </Unit>
+      <Unit>
+        <Filename Value="unit1.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="Form1"/>
+        <HasResources Value="True"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="Unit1"/>
+      </Unit>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <PathDelim Value="\"/>
+    <Target>
+      <Filename Value="project1"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <CodeGeneration>
+      <SmallerCode Value="True"/>
+    </CodeGeneration>
+    <Linking>
+      <Debugging>
+        <DebugInfoType Value="dsDwarf3"/>
+      </Debugging>
+      <Options>
+        <Win32>
+          <GraphicApplication Value="True"/>
+        </Win32>
+      </Options>
+    </Linking>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions>
+      <Item>
+        <Name Value="EAbort"/>
+      </Item>
+      <Item>
+        <Name Value="ECodetoolError"/>
+      </Item>
+      <Item>
+        <Name Value="EFOpenError"/>
+      </Item>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 24 - 0
test/test_bgraknob/project1.lpr

@@ -0,0 +1,24 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}
+  cthreads,
+  {$ENDIF}
+  {$IFDEF HASAMIGA}
+  athreads,
+  {$ENDIF}
+  Interfaces, // this includes the LCL widgetset
+  Forms, unit1;
+
+{$R *.res}
+
+begin
+  RequireDerivedFormResource:=True;
+  Application.Scaled:=True;
+  Application.Initialize;
+  Application.CreateForm(TForm1, Form1);
+  Application.Run;
+end.
+

+ 1565 - 0
test/test_bgraknob/unit1.lfm

@@ -0,0 +1,1565 @@
+object Form1: TForm1
+  Left = 720
+  Height = 483
+  Top = 177
+  Width = 1269
+  Caption = 'Form1'
+  ClientHeight = 483
+  ClientWidth = 1269
+  DesignTimePPI = 144
+  OnCreate = FormCreate
+  LCLVersion = '3.0.0.3'
+  object BGRAKnob1: TBGRAKnob
+    Left = 32
+    Height = 100
+    Top = 48
+    Width = 100
+    CurveExponent = 0.200000002980232
+    KnobColor = clMedGray
+    PositionColor = clBlack
+    MinValue = 0
+    MaxValue = 50
+    Value = 0
+    OnValueChanged = BGRAKnob1ValueChanged
+    WheelSpeed = 100
+    SlowSnap = True
+    OnMouseWheel = BGRAKnob1MouseWheel
+    OnClick = BGRAKnob1Click
+    OnDblClick = BGRAKnob1DblClick
+    OnMouseDown = BGRAKnob1MouseDown
+    OnMouseUp = BGRAKnob1MouseUp
+    OnMouseMove = BGRAKnob1MouseMove
+    OnMouseEnter = BGRAKnob1MouseEnter
+    OnMouseLeave = BGRAKnob1MouseLeave
+  end
+  object GroupBox1: TGroupBox
+    Left = 464
+    Height = 456
+    Top = 16
+    Width = 168
+    Caption = 'Set/Get Value'
+    ClientHeight = 426
+    ClientWidth = 164
+    TabOrder = 0
+    object Set50Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 133
+      Width = 113
+      Caption = 'Set 50'
+      TabOrder = 0
+      OnClick = Set50BtnClick
+    end
+    object Set180Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 187
+      Width = 113
+      Caption = 'Set 180'
+      TabOrder = 1
+      OnClick = Set180BtnClick
+    end
+    object Set100Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 160
+      Width = 113
+      Caption = 'Set 100'
+      TabOrder = 2
+      OnClick = Set100BtnClick
+    end
+    object Set360Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 214
+      Width = 113
+      Caption = 'Set 360'
+      TabOrder = 3
+      OnClick = Set360BtnClick
+    end
+    object Set25Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 106
+      Width = 113
+      Caption = 'Set 25'
+      TabOrder = 4
+      OnClick = Set25BtnClick
+    end
+    object Set0Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 79
+      Width = 113
+      Caption = 'Set 0'
+      TabOrder = 5
+      OnClick = Set0BtnClick
+    end
+    object SetValueBtn: TSpeedButton
+      Left = 120
+      Height = 33
+      Hint = 'Set Value'
+      Top = 336
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF003535
+        352B55555503FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434342C3333
+        33FF343539EA42516ABC4762822FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555033435
+        39EA333333FF333434FF4C668FFC5F8DD4AA618BD54200FFFF01FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004151
+        6ABC333434FF4C668EFF5F8DD3FF5F8DD3FF5F8DD3FF5E8CD3D84E7DC55CFFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00475C
+        7D2F4C668FFC5F8DD3FF5F8DD3FF5F8DD3FF5F8DD3FF598DD0CC2674AEF72D5B
+        A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF005F8ED2AB5F8DD3FF5F8DD3FF5F8DD3FF5891D2CC16A2C4F71C8BB7FF2473
+        ACFF2B5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00618BD5425F8DD3FF5F8DD3FF5696D5CC07D3DBF70DBCCFFF14A3C3FF1C8B
+        B8FF2473ACFF2D5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF005F8DD3D55894D5CC03FAFDF700EAEAFF04D4DBFF0CBCCFFF14A3
+        C3FF1C8BB8FF2473ACFF2B59A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF004E80C25C2092C1F80EC9E0FF00FFFFFF00EAEAFF04D4DAFF0DBC
+        CFFF14A3C3FF1C8BB8FF2372ACFF2D5BA283FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002B5A9F821D92C0FF0ECAE0FF00FEFEFF00EAEAFF05D4
+        DBFF0CBCCFFF14A3C3FF1C8BB8FF2473ACFF2D5BA289FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0FCAE1FF00FEFEFF00EA
+        EAFF05D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2472ACFF2D5BA089FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0ECAE0FF00FE
+        FEFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB7FF2473ACFF2B59A089FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA0831D92C1FF0ECA
+        E0FF00FFFFFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2473ACFF2D5B
+        A083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA1821D92
+        C0FF0EC9E0FF00FFFFFF00EAEAFF05D4DBFF0CBCCFFF14A3C3FF1B8BB7FC6C92
+        ADC499999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5A
+        A1821D91C0FF0ECAE0FF00FEFEFF00EAEAFF04D3DAFF0CBCCFFC7ABECEC4C2C2
+        C2FFAEAEAEFF99999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF002B5A9F821D92C0FF0FCAE1FF00FEFEFF00EAEAFC88EAEEC5EBEBEBFFD6D6
+        D6FFC2C2C2FFAEAEAEFF5D5DA073FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF002B5AA1821D92C0FF0EC9E0FC70EAEAC4EAEAEAFFFFFFFFFFEBEB
+        EBFFD7D7D7FF6F6FC7C70000BBFB0000AB89FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002D5BA0836BA1B6C4C1C1C1FFD6D6D6FFEBEBEBFFFFFF
+        FFFF8585EBC40000DEFB0000CDFF0000BCFF0000AB89FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF0099999982AEAEAEFFC2C2C2FFD6D6D6FF8383
+        ECC70000FEFC0000F0FF0000DEFF0000CDFF0000BBDD0000AF10FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098989881AEAEAEFF6F6FC5C60000
+        DCFB0000ECFF0000FDFF0000F0FF0000DFE00000C921FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005D5DA0730000BAFC0000
+        CBFF0000DCFF0000ECFF0000FDDD0000EE1EFFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000AB820000
+        BBFF0000CBFF0000DCE00000F021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        AB820000BBE00000D121FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF000000AF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SetValueBtnClick
+      ShowHint = True
+      ParentShowHint = False
+    end
+    object ValueEdt: TEdit
+      Left = 8
+      Height = 33
+      Top = 336
+      Width = 113
+      TabOrder = 6
+      Text = '150.0'
+      OnKeyDown = ValueEdtKeyDown
+    end
+    object Label11: TLabel
+      Left = 16
+      Height = 25
+      Top = 312
+      Width = 72
+      Caption = 'Set Value'
+    end
+    object Label12: TLabel
+      Left = 8
+      Height = 25
+      Top = 0
+      Width = 83
+      Caption = 'Quick Sets'
+    end
+    object SetNeg10Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 52
+      Width = 113
+      Caption = 'Set -10'
+      TabOrder = 7
+      OnClick = SetNeg10BtnClick
+    end
+    object SetNeg5Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 25
+      Width = 113
+      Caption = 'Set -5'
+      TabOrder = 8
+      OnClick = SetNeg5BtnClick
+    end
+    object Set1000Btn: TButton
+      Left = 24
+      Height = 30
+      Top = 241
+      Width = 113
+      Caption = 'Set 1000'
+      TabOrder = 9
+      OnClick = Set1000BtnClick
+    end
+    object BitBtn1: TBitBtn
+      Left = 8
+      Height = 40
+      Top = 376
+      Width = 144
+      Caption = 'Get Value'
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF000000
+        000000000001000000070000000E00000014000000190000001A0000001A0000
+        001A0000001A0000001A0000001A0000001A0000001A0000001A0000001A0000
+        001A0000001A0000001A0000001A000000180000000D00000002FFFFFF000000
+        0000000000020000000A000000150000001F00000026180C012D371C013C4F28
+        0148582C014D46230144713902A6974C02CC974C02CC974C02CC974C02CC974C
+        02CC974C02CC974C02CC974C02CC974C02CC2613014200000003FFFFFF000000
+        00000000000100000002000000032714010A733B03299650053EB5700C45D691
+        0E4AE5A00D4CEBA70C3E994E04CCFDB717FFFCB30DFFFCB30DFFFCB30DFFFCB3
+        0DFFFCB30DFFFCB30DFFFDB717FF994E04CC4D28024900000001FFFFFF000000
+        000000000000502A04009D52060E9C510641BF781151EDA7165AF7AF0E5DF7AD
+        0A5DF7AD0A58F7AD0A3A9C5106CCF8B622FFF7AD0AFFF7AD0AFFF7AD0AFFF7AD
+        0AFFF7AD0AFFF8B622FF9C5106CC9C51065C4D28020000000000FFFFFF00A358
+        0A00A2570A00A0550912A3590A54D28E1D68F2AC1A72F1A81172F1A81172F1A8
+        1172F1A8115DF1A8113AA05508CCF4B52EFFF1A811FFF1A811FFF1A811FFF1A8
+        11FFF4B52EFFA3590ACEA05508709C5106004D28020000000000FFFFFF00A65B
+        0D00A55A0C0AA3580B5FD08F267DEBA72088E9A31988E9A31988EAA61F88EFB4
+        3884F2BE4D5DF4C3573AA3580BCCEFB53CFFE9A319FFE9A319FFE9A319FFE9A3
+        19FFEBA720FFD08F26EAA3580BB0A55A0C12A65B0D00A65B0D00FFFFFF00A85D
+        0F00A75C0E4BC27E258BE5A52E9FE29E229FE29E229FE6A7319FECB9539DD399
+        3E81B975214FAC62132FA75C0ECCECB549FFE29E22FFE29E22FFE6A731FFE29E
+        22FFE29E22FFE5A52EFFC27E25DFA75C0E77A85D0F00A85D0F00FFFFFF00AC61
+        1115B067168EDDA33FB1DB992BB6DB992BB6DEA034B6E5B254B1BA762396AC61
+        1155AA5F1017AA5F1004AC6111CCE9B857FFDB992BFFE9B857FFE5B254F9DEA0
+        34FFDB992BFFDB992BFFDDA33FF9B06716C7AC61111CAC611100FFFFFF00B166
+        154EC58532B1D89C3ECCD49534CCD49534CCDEA74DCABC7724ABB0651553AD62
+        1200AA5F1000AF641400B06515CCE8BA63FFE8BA63FFB06515CCBC7724D6DEA7
+        4DFCD49534FFD49534FFD89C3EFFC58532DEB1661560B1661500FFFFFF00B56A
+        1891D69F4DD2CF923CDFCF923CDFD19540DFCB8C39CCB56A1885B3681700B065
+        1400B3681700B56A1800B56A18CCE9BE6EFFB56A18CCB56A185CB56A1898CB8C
+        39E9D19540FFCF923CFFCF923CFFD69F4DF0B56A189EB56A1800FFFFFF00BA6F
+        1CB7DBA85AEACD9043F0CD9043F0CE9345F0C07927CBB96E1B3BB96E1B00BA6F
+        1C00BC711E00BA6F1C00BA6F1CCCBA6F1CCCB96E1C5CB76C1A00B96E1B3FC079
+        27D7CE9345FFCD9043FFCD9043FFDBA85AF8BA6F1CBCBA6F1C00FFFFFF00BE74
+        1FC8DEAD65FBCD924BFDCD924BFDCD924CFDC07622CDBE741F10BE741F00C57A
+        2400C4792400BE731E00BC711D33BD721E48BA6F1C00BD721E00BE741F11C076
+        22CFCD924CFFCD924BFFCD924BFFDEAD65FEBE741FC9BE741F00FFFFFF00C378
+        23C9E4B76FFED29753FFD29753FFD49A56FFC57B26CFC3782311C57A2500C87D
+        2600C4792448C67B2533BF742000BD721E00BD721E00C3782300C3782310C57B
+        26C8D49A56F7D29753F7D29753F7E4B76FF5C37823C3C3782300FFFFFF00C87D
+        26BCEBBE73F8DC9F59FFDC9F59FFDFA55EFFCF8A37D7C97E273FCB802900C97E
+        275CC87D26CCC87D26CCC87D2600C67B2500C97E2700C97E2700C97E2739CF8A
+        37C4DFA55EE8DC9F59E8DC9F59E8EBBE73E2C87D26ABC87D2600FFFFFF00CD82
+        2A9EEDC071F0E6AC62FFE5A85FFFE6AA61FFE1A758E9CD822A98CE832B5CCD82
+        2ACCF1C47AFFCD822ACCCD822A00CF842C00D3882F00CE832B00CD822A7FE1A7
+        58C4E6AA61D6E5A85FD6E6AC62D6EDC071C9CD822A85CD822A00FFFFFF00D186
+        2D60E2A854DEF3C377FFEDB065FFEDB065FFF0BB6FFCDA9640D6D1862DCCF4C5
+        7AFFF2BE73FFD1862DCCD3882E00D78C3100D58A3000D2872E51DA9640A2F0BB
+        6FBFEDB065C1EDB065C1F3C377C1E2A854A8D1862D49D0852C00FFFFFF00D68B
+        311CD99138C7F9D385F9F2BA6EFFF1B76BFFF2B86CFFF3C174F9F8CD81FFF1B7
+        6BFFF6C67AFFD68B31CCD78C3104D78C3117D68B3155DE9B448FF3C174A7F2B8
+        6CABF1B76BABF2BA6EABF9D385A6D9913885D68B3113D68B3100FFFFFF00D98E
+        3300DA8F3477E9B15CDFFBD68AFFF6BE72FFF5BD71FFF5BD71FFF5BD71FFF5BD
+        71FFF9CC80FFDA8F34CCDC933930E2A0494FEDB7657EF7C57992F6BE7293F5BD
+        7194F6BE7294FBD68A94E9B15C81DA8F3446D98E3300D98E3300FFFFFF00DB90
+        3500DC913612DE9337B0F3C573EAFCD78BFFF8C478FFF8C478FFF8C478FFF8C4
+        78FFFBD185FFDE9337CCFBCD813AFACA7E5DF9C5797CF8C4787DF8C4787DF9C5
+        797DFCD78B7DF3C57372DE933757DC91360ADB903500DB903500FFFFFF00E196
+        3900E1963900E1963970E39A3ECEFEDF93FFFBCA7EFFFBCA7EFFFBCA7EFFFBCA
+        7EFFFDD68AFFE1963ACCFBCA7E3AFBCA7E5CFBCA7E67FBCA7E67FCCF8367FEDE
+        9267F4C6745EE39A3E4DE1963910DF943800DF943800DF943800FFFFFF00E79C
+        3D00E59A3C5CE59A3CCCFFE094FFFDCF83FFFDCF83FFFDCF83FFFDCF83FFFDCF
+        83FFFEDA8EFFE59A3CCCFDD0843AFDD28652FDD68A54FFDE9253FCDC8E51EFB7
+        6049E59A3C3AE4993B0DE2973A00E2973A00E2973A00E2973A00FFFFFF00E89D
+        3E48E89D3ECCFFE599FFFFE599FFFFE599FFFFE599FFFFE599FFFFE599FFFFE5
+        99FFFFE599FFE89D3ECCFFE4973AFDDD8F41F9D18040F1B8603AE9A24434E89D
+        3E20E69B3D05E4993B00E2973A00E2973A00E2973A00E2973A00FFFFFF00E99E
+        3F33EA9F40CCEA9F40CCEA9F40CCEA9F40CCEA9F40CCEA9F40CCEA9F40CCEA9F
+        40CCEA9F40CCEA9F4099EA9F402AEA9F4028EA9F4022EA9F4015E99E3F07E89D
+        3E00E69B3D00E4993B00E2973A00E2973A00E2973A00E2973A00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = BitBtn1Click
+      TabOrder = 10
+    end
+    object SpeedButton1: TSpeedButton
+      Left = 56
+      Height = 33
+      Top = 272
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF000000
+        0000000000000000000000000001000000060000000C00000012000000180000
+        001A0000001A0000001A0000001A0000001A0000001A00000018000000130000
+        000C0000000600000001000000000000000000000000FFFFFF00FFFFFF000000
+        00000000000000000000000000020000000B00000018000000240000002F0244
+        00A6025A00CC025A00CC025A00CC025A00CC024400A60000002F000000250000
+        00180000000B00000002000000000000000000000000FFFFFF00FFFFFF000000
+        0000000000000000000000000000000000000000000000000000011900000462
+        00CC22DA11FF22DA11FF22DA11FF22DA11FF046200CC01190000000000000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF000000
+        00000000000000000000000000000000000000000000021C0000066C0000066C
+        00CC22D511FF22D511FF22D511FF22D511FF066C00CC066C0000021C00000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF000E8D
+        000007460000000000000000000000000000031F000009780000097800000978
+        00CC23CD12FF22CD11FF22CD11FF22CD11FF097800CC0978000009780000031F
+        0000000000000000000000000000074600000E8D0000FFFFFF00FFFFFF000E8D
+        00000E8C00000E8C000007460000074600000B8100000B8100000B8100000B81
+        00CC25C714FF22C611FF22C611FF22C611FF0B8100CC0B8100000B8100000B81
+        000007460000074600000E8C00000E8C00000E8D0000FFFFFF00FFFFFF000E8D
+        00000E8C00000E8C00000E8C00000E8C00000E8A00000C8400000C8400000C84
+        00CC28C117FF22BD11FF22BD11FF24BE13FF0C8400CC0C8400000C8400000E8A
+        00000E8C00000E8C00000E8C00000E8C00000E8D0000FFFFFF00FFFFFF000E8D
+        00000E8C00000E8C00000E8C00000E8C00000E8C00000E8B00000C8700000C87
+        00CC2CBC1BFF22B511FF22B511FF26B815FF0C8700CC0C8700000E8B00000E8C
+        00000E8C00000E8C00000E8C00000E8C00000E8D0000FFFFFF00FFFFFF000E8D
+        00000E8C00000E8C00000E8C00000E8C00000E8C00000E8C00000E8C00000D8A
+        00CC31B820FF22AD11FF22AD11FF28B117FF0D8A00CC0E8C00000E8C00000E8C
+        00000E8C00000E8C00000E8C00000E8C00000E8D0000FFFFFF00FFFFFF000E8D
+        00990E8D00CC0E8D00CC0E8D00CC0E8D00CC0E8D00CC0E8D00CC0E8D00CC0E8D
+        00CC36B725FF22A511FF22A511FF2AAC19FF0E8D00CC0E8D00CC0E8D00CC0E8D
+        00CC0E8D00CC0E8D00CC0E8D00CC0E8D00CC0E8D0099FFFFFF00FFFFFF000F90
+        00CC5DD44CFF4FC63EFF4FC63EFF4EC53DFF4EC53DFF49C138FF3CB72BFF31AD
+        20FF2EAA1DFF229F11FF229F11FF27A316FF2BA71AFF2AA619FF29A518FF28A4
+        17FF28A417FF27A316FF28A417FF34AE23FF0F9000CCFFFFFF00FFFFFF000F92
+        00CC60D74FFF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF42B9
+        31FF39B128FF2FA71EFF2AA219FF259D14FF239B12FF239B12FF259D14FF2AA2
+        19FF2FA71EFF39B128FF42B931FF48BF37FF0F9200CCFFFFFF00FFFFFF001095
+        00CC64DB53FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB
+        33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB33FF44BB
+        33FF44BB33FF44BB33FF44BB33FF49C038FF109500CCFFFFFF00FFFFFF001198
+        00CC67DE56FF66DD55FF65DC54FF64DB53FF63DA52FF61D850FF60D74FFF5FD6
+        4EFF5ED54DFF44BB33FF44BB33FF50C73FFF59D048FF58CF47FF57CE46FF56CD
+        45FF55CC44FF54CB43FF53CA42FF52C941FF119800CCFFFFFF00FFFFFF00119A
+        0099119A00CC119A00CC119A00CC119A00CC119A00CC119A00CC119A00CC119A
+        00CC62D951FF45BC34FF45BC34FF51C840FF119A00CC119A00CC119A00CC119A
+        00CC119A00CC119A00CC119A00CC119A00CC119A0099FFFFFF00FFFFFF00119A
+        0000119B0000119B0000119B0000119B0000119B0000119B0000129C0000129D
+        00CC66DD55FF47BE36FF47BE36FF55CC44FF129D00CC129C0000119B0000119B
+        0000119B0000119B0000119B0000119B0000119A0000FFFFFF00FFFFFF00119A
+        0000119B0000119B0000119B0000119B0000119B0000129C0000129F0000129F
+        00CC6BE25AFF4CC33BFF4CC33BFF5AD149FF129F00CC129F0000129C0000119B
+        0000119B0000119B0000119B0000119B0000119A0000FFFFFF00FFFFFF00119A
+        0000119B0000119B0000119B0000119B0000129D000013A2000013A2000013A2
+        00CC6FE65EFF52C941FF52C941FF5FD64EFF13A200CC13A2000013A20000129D
+        0000119B0000119B0000119B0000119B0000119A0000FFFFFF00FFFFFF00119A
+        0000119B0000119B0000119B0000129E000013A4000013A4000013A4000013A4
+        00CC72E961FF58CF47FF58CF47FF64DB53FF13A400CC13A4000013A4000013A4
+        0000129E0000119B0000119B0000119B0000119A0000FFFFFF00FFFFFF00119A
+        0000119B0000119B0000129E000014A5000014A5000014A5000014A5000014A5
+        00CC75EC64FF5DD44CFF5DD44CFF68DF57FF14A500CC14A5000014A5000014A5
+        000014A50000129E0000119B0000119B0000119A0000FFFFFF00FFFFFF000D74
+        0000119B0000129E000014A7000014A7000014A7000014A7000014A7000014A7
+        00CC76ED65FF62D951FF62D951FF6CE35BFF14A700CC14A7000014A7000014A7
+        000014A7000014A70000129E0000119B0000119A0000FFFFFF00FFFFFF000000
+        00000000000000000000107F000015A9000015A9000015A9000015A9000015A9
+        00CC77EE66FF77EE66FF76ED65FF76ED65FF15A900CC15A9000015A9000015A9
+        000015A90000107F00000000000000000000094D0000FFFFFF00FFFFFF000000
+        0000000000000000000000000000107F000015A9000015A9000015A9000015AA
+        009915AA00CC15AA00CC15AA00CC15AA00CC15AA009915A9000015A9000015A9
+        0000107F000000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SpeedButton1Click
+    end
+    object SpeedButton2: TSpeedButton
+      Left = 24
+      Height = 33
+      Top = 272
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000080000
+        0011000000190000001A0000001A0000001A0000001A0000001A0000001A0000
+        001A0000001A0000001A0000001A0000001A0000001A0000001A0000001A0000
+        001A0000001A0000001A0000001A000000170000000E00000007000000100000
+        55A000006DCC00006DCC00006DCC00006DCC00006DCC00006DCC00006DCC0000
+        6DCC00006DCC00006DCC00006DCC00006DCC00006DCC00006DCC00006DCC0000
+        6DCC00006DCC00006DCC00006DCC00006DCC0000559F0000000E000022000000
+        86CC7777FFFF6E6EF6FF6D6DF5FF6B6BF3FF6666EDFF5E5EE5FF5656DAFF4C4C
+        D0FF4242C5FF3939BEFF3030BCFF2828C0FF2020C9FF1A1AD3FF1414DBFF1111
+        DDFF1111DDFF1111DDFF1111DDFF1111DDFF000086CC00002200000091000000
+        91CC7777FFFF6666EEFF6666EEFF6666EEFF6464ECFF5F5FE5FF5858DDFF5050
+        D4FF4747CBFF3F3FC3FF3838BDFF3030BCFF2828C0FF2020C9FF1A1AD3FF1414
+        DBFF1111DDFF1111DDFF1111DDFF1111DDFF000091CC0000910000009A000000
+        9ACC7777FFFF6666EEFF6666EEFF6666EEFF6666EEFF6464ECFF5F5FE5FF5858
+        DDFF5050D4FF4747CBFF3F3FC3FF3838BDFF3030BCFF2828C0FF2020C9FF1A1A
+        D3FF1414DBFF1111DDFF1111DDFF1111DDFF00009ACC00009A000000A3000000
+        A3CC7777FFFF7777FFFF7777FFFF7777FFFF7777FFFF7777FFFF7777FFFF7777
+        FFFF7777FFFF7575FDFF7070F7FF6969EFFF5F5FE6FF5353DDFF4545D7FF3636
+        D6FF2727D9FF1A1ADDFF1313DEFF1111DDFF0000A3CC0000A3000000A7000000
+        A8990000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000
+        A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000
+        A9CC0000A9CC0000A9CC0000A9CC0000A9CC0000A8990000A700FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SpeedButton2Click
+    end
+    object Label22: TLabel
+      Left = 96
+      Height = 25
+      Top = 280
+      Width = 47
+      Caption = 'Bump'
+    end
+  end
+  object GeneralSettingsGb: TGroupBox
+    Left = 176
+    Height = 456
+    Top = 16
+    Width = 278
+    Caption = 'General Settings'
+    ClientHeight = 426
+    ClientWidth = 274
+    ParentBackground = False
+    ParentColor = False
+    TabOrder = 1
+    object SlowSnapCb: TCheckBox
+      Left = 16
+      Height = 29
+      Hint = 'Set the Snap Around Mode'#13#10'SlowSnap prevents twitchy behavior'#13#10'when wrapping at start or end of ranges'
+      Top = 216
+      Width = 103
+      Caption = 'SlowSnap'
+      Checked = True
+      ParentShowHint = False
+      ShowHint = True
+      State = cbChecked
+      TabOrder = 0
+      OnChange = SlowSnapCbChange
+    end
+    object KnobTypeCb: TComboBox
+      Left = 16
+      Height = 33
+      Hint = 'Range is an arbitrary range'#13#10'Sector uses Sector Divisions'
+      Top = 32
+      Width = 248
+      ItemHeight = 25
+      ItemIndex = 0
+      Items.Strings = (
+        'User Range - ktRange'
+        'Sector Positions - ktSector'
+      )
+      ParentShowHint = False
+      ReadOnly = True
+      ShowHint = True
+      TabOrder = 1
+      Text = 'User Range - ktRange'
+      OnChange = KnobTypeCbChange
+    end
+    object Label13: TLabel
+      Left = 16
+      Height = 25
+      Top = 8
+      Width = 114
+      Caption = 'Set Knob Type'
+    end
+    object MouseWheelSpeedTB: TBCTrackbarUpdown
+      Left = 16
+      Height = 36
+      Hint = '0 - Mouse Wheel Disabled'#13#10'1 - Slowest/Highest Resolution'#13#10'255 - Fastest/Lowest Resolution'
+      Top = 94
+      Width = 85
+      AllowNegativeValues = False
+      BarExponent = 1
+      Increment = 1
+      LongTimeInterval = 400
+      MinValue = 0
+      MaxValue = 255
+      OnChange = MouseWheelSpeedTBChange
+      Value = 50
+      ShortTimeInterval = 100
+      Background.Color = clWindow
+      Background.Gradient1.StartColor = clWhite
+      Background.Gradient1.EndColor = clBlack
+      Background.Gradient1.GradientType = gtLinear
+      Background.Gradient1.Point1XPercent = 0
+      Background.Gradient1.Point1YPercent = 0
+      Background.Gradient1.Point2XPercent = 0
+      Background.Gradient1.Point2YPercent = 100
+      Background.Gradient2.StartColor = clWhite
+      Background.Gradient2.EndColor = clBlack
+      Background.Gradient2.GradientType = gtLinear
+      Background.Gradient2.Point1XPercent = 0
+      Background.Gradient2.Point1YPercent = 0
+      Background.Gradient2.Point2XPercent = 0
+      Background.Gradient2.Point2YPercent = 100
+      Background.Gradient1EndPercent = 35
+      Background.Style = bbsColor
+      ButtonBackground.Gradient1.StartColor = clBtnShadow
+      ButtonBackground.Gradient1.EndColor = clBtnFace
+      ButtonBackground.Gradient1.GradientType = gtLinear
+      ButtonBackground.Gradient1.Point1XPercent = 0
+      ButtonBackground.Gradient1.Point1YPercent = -50
+      ButtonBackground.Gradient1.Point2XPercent = 0
+      ButtonBackground.Gradient1.Point2YPercent = 50
+      ButtonBackground.Gradient2.StartColor = clBtnFace
+      ButtonBackground.Gradient2.EndColor = clBtnShadow
+      ButtonBackground.Gradient2.GradientType = gtLinear
+      ButtonBackground.Gradient2.Point1XPercent = 0
+      ButtonBackground.Gradient2.Point1YPercent = 50
+      ButtonBackground.Gradient2.Point2XPercent = 0
+      ButtonBackground.Gradient2.Point2YPercent = 150
+      ButtonBackground.Gradient1EndPercent = 50
+      ButtonBackground.Style = bbsGradient
+      ButtonDownBackground.Color = clBtnShadow
+      ButtonDownBackground.Gradient1.StartColor = clWhite
+      ButtonDownBackground.Gradient1.EndColor = clBlack
+      ButtonDownBackground.Gradient1.GradientType = gtLinear
+      ButtonDownBackground.Gradient1.Point1XPercent = 0
+      ButtonDownBackground.Gradient1.Point1YPercent = 0
+      ButtonDownBackground.Gradient1.Point2XPercent = 0
+      ButtonDownBackground.Gradient1.Point2YPercent = 100
+      ButtonDownBackground.Gradient2.StartColor = clWhite
+      ButtonDownBackground.Gradient2.EndColor = clBlack
+      ButtonDownBackground.Gradient2.GradientType = gtLinear
+      ButtonDownBackground.Gradient2.Point1XPercent = 0
+      ButtonDownBackground.Gradient2.Point1YPercent = 0
+      ButtonDownBackground.Gradient2.Point2XPercent = 0
+      ButtonDownBackground.Gradient2.Point2YPercent = 100
+      ButtonDownBackground.Gradient1EndPercent = 35
+      ButtonDownBackground.Style = bbsColor
+      Border.Color = clWindowText
+      Border.Style = bboSolid
+      Rounding.RoundX = 1
+      Rounding.RoundY = 1
+      Font.Color = clWindowText
+      Font.Name = 'Arial'
+      HasTrackBar = True
+      ArrowColor = clBtnText
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 2
+      TabStop = True
+      UseDockManager = False
+    end
+    object Label14: TLabel
+      Left = 16
+      Height = 25
+      Top = 72
+      Width = 193
+      Caption = 'Set Mouse Wheel Speed'
+    end
+    object ResetGeneralBtn: TBitBtn
+      Left = 16
+      Height = 45
+      Top = 371
+      Width = 249
+      Caption = 'Reset General'
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        00030000000900000011000000180000001A0000001900000019000000180000
+        00160000001400000012000000100000000E0000000C0000000A000000080000
+        00060000000400000002000000010000000000000000FFFFFF00FFFFFF000000
+        000500000012000000220505054A060606660404046602020266010101660000
+        00660000006600000045000000200000001C00000017000000130000000F0000
+        000B0000000700000004000000020000000000000000FFFFFF00FFFFFF000000
+        0000080808000F0F0F3410101066DEDEDEFFCDCDCDFFCDCDCDFFCDCDCDFFCDCD
+        CDFFCDCDCDFF0101016600000034000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF002323
+        2300222222341D1D1D66EFEFEFFFDFDFDFFFDFDFDFFFBDBDBDFFBEBEBEFFBFBF
+        BFFFC1C1C1FFCFCFCFFF04040466020202340404040003030300000000000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF003232
+        32342C2C2C66EFEFEFFFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFBFBFBFFFC1C1
+        C1FFC2C2C2FFC3C3C3FFD1D1D1FF09090966070707340B0B0B000D0D0D000606
+        06000000000000000000000000000000000000000000FFFFFF00FFFFFF003D3D
+        3D66EFEFEFFFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFC2C2
+        C2FFC3C3C3FFC5C5C5FFC6C6C6FFD4D4D4FF0E0E0E660C0C0C34111111001717
+        17001803710008012600000000000000000000000000FFFFFF00FFFFFF004B4B
+        4B66EFEFEFFFE8E8E8FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5
+        E5FFC5C5C5FFC6C6C6FFC7C7C7FFC9C9C9FFD7D7D7FF14141466121212341717
+        170020039600200298001902740011014E0011014F00FFFFFF00FFFFFF005656
+        563453535366F0F0F0FFE9E9E9FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7
+        E7FFE7E7E7FFC7C7C7FFC9C9C9FFCACACAFFCCCCCCFFD9D9D9FF1B1B1B661919
+        1934200396002002980021029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005C5C5C345A5A5A66F1F1F1FFEBEBEBFFE9E9E9FFE9E9E9FFE9E9E9FFE9E9
+        E9FFE9E9E9FFE9E9E9FFCACACAFFCCCCCCFFCECECEFFCFCFCFFFDCDCDCFF2002
+        98982003974D2002980021029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D006262623460606066F3F3F3FFEDEDEDFFEBEBEBFFEBEBEBFFEBEB
+        EBFFEBEBEBFFEBEBEBFFEBEBEBFFCECECEFFCFCFCFFFD1D1D1FF8D7CD1FFA08F
+        E4FF210299962102994C21029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D00636363006868683466666666F4F4F4FFEFEFEFFFEEEEEEFFEEEE
+        EEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFD1D1D1FF8D7CD1FF8F7ED3FF907F
+        D4FFA291E6FF21029B9421029B4B21029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006E6E6E346C6C6C66F5F5F5FFF1F1F1FFF0F0
+        F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFAE9DE7FF8F7ED3FF907FD4FF9180
+        D5FF9382D7FFA594E9FF21029D9221029C4A21029E00FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F007474743472727266F6F6F6FFF4F4
+        F4FFF3F3F3FFF3F3F3FFF3F3F3FFAE9DE7FFAF9EE8FFB1A0E9FF9180D5FF9382
+        D7FF9483D8FF9584D9FFA796EBFF22029F9121029E49FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007979793478787866F8F8
+        F8FFF6F6F6FFF5F5F5FFAE9DE7FFAF9EE8FFB1A0E9FFB2A1E9FFB3A2EAFF9483
+        D8FF9584D9FF9685DAFF9786DBFFA998EDFF2202A08FFFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A007F7F7F347D7D
+        7D66F9F9F9FFB2A1ECFFAF9EE8FFB1A0E9FFB2A1E9FFB3A2EAFFB4A3EBFFB5A4
+        EBFF9685DAFF9786DBFF9887DCFFAA99EEFF2202A38CFFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008484
+        84342402AE80C1B0FAFFB5A4EDFFB2A1E9FFB3A2EAFFB4A3EBFFB5A4EBFFB6A5
+        ECFFB7A6ECFF9887DCFFAA99EEFF2302A6892302A545FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0402502B07FC3B2FBFFB7A6EFFFB4A3EBFFB5A4EBFFB6A5ECFFB7A6
+        ECFFB8A7EDFFCAB9FEFF2402A9852302A8442302A500FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1402502B17EC6B5FCFFBAA9F0FFB6A5ECFFB7A6ECFFB8A7
+        EDFFCAB9FEFF2402AC822402AB422302A8002302A500FFFFFF00FFFFFF001616
+        16004646460063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1002502B23F2502B27DC8B7FDFFBCABF1FFB8A7EDFFCAB9
+        FEFF2502AF7F2402AE402402AB002302A8002302A500FFFFFF00FFFFFF000000
+        000000000000191919004F4F4F006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1002502B2002502B43E2502B37CC9B8FEFFCAB9FEFF2502
+        B27E2502B1402402AE002402AB002302A8002302A500FFFFFF00FFFFFF000000
+        00000000000000000000000000001C1C1C00585858007A7A7A00808080008585
+        85002502B0002502B1002502B2002502B4002602B53E2602B47B2502B47B2502
+        B33E2502B1002402AE002402AB002302A8002302A500FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      GlyphShowMode = gsmAlways
+      OnClick = ResetGeneralBtnClick
+      TabOrder = 3
+    end
+    object StartFromBottomCb: TCheckBox
+      Left = 16
+      Height = 29
+      Hint = 'Draw Pointer From Top'
+      Top = 249
+      Width = 174
+      Caption = 'Start From Bottom'
+      Checked = True
+      ParentShowHint = False
+      ShowHint = True
+      State = cbChecked
+      TabOrder = 4
+      OnChange = StartFromBottomCbChange
+    end
+    object ReverseScaleCb: TCheckBox
+      Left = 16
+      Height = 29
+      Hint = 'Flips scale, can also sometimes be done in tRange mode'
+      Top = 282
+      Width = 131
+      Caption = 'Reverse Scale'
+      TabOrder = 5
+      OnChange = ReverseScaleCbChange
+    end
+    object MouseWheelWrapCb: TCheckBox
+      Left = 16
+      Height = 29
+      Hint = 'If checked allow the mouse wheel to '#13#10'cycle around over start and end'
+      Top = 316
+      Width = 181
+      Caption = 'Mouse Wheel Wrap'
+      ParentShowHint = False
+      ShowHint = True
+      TabOrder = 6
+      OnChange = MouseWheelWrapCbChange
+    end
+    object Label9: TLabel
+      Left = 16
+      Height = 25
+      Top = 128
+      Width = 214
+      Caption = 'No Effect in ktSector mode'
+    end
+  end
+  object DVAPGb: TGroupBox
+    Left = 640
+    Height = 456
+    Top = 16
+    Width = 320
+    Caption = 'Data Values and Properties'
+    ClientHeight = 426
+    ClientWidth = 316
+    TabOrder = 2
+    object ValueLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 54
+      Width = 40
+      Caption = '        '
+    end
+    object Label2: TLabel
+      Left = 184
+      Height = 25
+      Top = 78
+      Width = 40
+      Caption = '        '
+    end
+    object Label3: TLabel
+      Left = 184
+      Height = 25
+      Top = 126
+      Width = 40
+      Caption = '        '
+    end
+    object Label4: TLabel
+      Left = 184
+      Height = 25
+      Top = 150
+      Width = 40
+      Caption = '        '
+    end
+    object Label5: TLabel
+      Left = 184
+      Height = 25
+      Top = 174
+      Width = 40
+      Caption = '        '
+    end
+    object Label6: TLabel
+      Left = 184
+      Height = 25
+      Top = 198
+      Width = 40
+      Caption = '        '
+    end
+    object MouseWheelSpeedLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 104
+      Width = 40
+      Caption = '        '
+    end
+    object Label7: TLabel
+      Left = 8
+      Height = 25
+      Top = 54
+      Width = 42
+      Caption = 'Value'
+    end
+    object Label10: TLabel
+      Left = 8
+      Height = 25
+      Top = 78
+      Width = 90
+      Caption = 'WheelDelta'
+    end
+    object Label15: TLabel
+      Left = 8
+      Height = 25
+      Top = 104
+      Width = 99
+      Caption = 'WheelSpeed'
+    end
+    object Label16: TLabel
+      Left = 8
+      Height = 25
+      Top = 126
+      Width = 60
+      Caption = 'OnClick'
+    end
+    object Label17: TLabel
+      Left = 8
+      Height = 25
+      Top = 150
+      Width = 88
+      Caption = 'OnDblClick'
+    end
+    object Label18: TLabel
+      Left = 8
+      Height = 25
+      Top = 174
+      Width = 136
+      Caption = 'Mouse Up/Down'
+    end
+    object Label19: TLabel
+      Left = 8
+      Height = 25
+      Top = 198
+      Width = 150
+      Caption = 'Mouse Enter/Leave'
+    end
+    object Label20: TLabel
+      Left = 8
+      Height = 25
+      Top = 222
+      Width = 72
+      Caption = 'MinValue'
+    end
+    object Label21: TLabel
+      Left = 8
+      Height = 25
+      Top = 246
+      Width = 75
+      Caption = 'MaxValue'
+    end
+    object MinValueLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 222
+      Width = 72
+      Caption = 'MinValue'
+    end
+    object MaxValueLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 246
+      Width = 75
+      Caption = 'MaxValue'
+    end
+    object Label24: TLabel
+      Left = 8
+      Height = 25
+      Top = 270
+      Width = 82
+      Caption = 'StartAngle'
+    end
+    object Label25: TLabel
+      Left = 8
+      Height = 25
+      Top = 294
+      Width = 76
+      Caption = 'EndAngle'
+    end
+    object StartAngleLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 270
+      Width = 82
+      Caption = 'StartAngle'
+    end
+    object EndAngleLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 294
+      Width = 76
+      Caption = 'EndAngle'
+    end
+    object CDVDBtn: TBitBtn
+      Left = 16
+      Height = 45
+      Top = 371
+      Width = 266
+      Caption = 'Clear Data Values Display'
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        00030000000900000011000000180000001A0000001900000019000000180000
+        00160000001400000012000000100000000E0000000C0000000A000000080000
+        00060000000400000002000000010000000000000000FFFFFF00FFFFFF000000
+        000500000012000000220505054A060606660404046602020266010101660000
+        00660000006600000045000000200000001C00000017000000130000000F0000
+        000B0000000700000004000000020000000000000000FFFFFF00FFFFFF000000
+        0000080808000F0F0F3410101066DEDEDEFFCDCDCDFFCDCDCDFFCDCDCDFFCDCD
+        CDFFCDCDCDFF0101016600000034000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF002323
+        2300222222341D1D1D66EFEFEFFFDFDFDFFFDFDFDFFFBDBDBDFFBEBEBEFFBFBF
+        BFFFC1C1C1FFCFCFCFFF04040466020202340404040003030300000000000000
+        00000000000000000000000000000000000000000000FFFFFF00FFFFFF003232
+        32342C2C2C66EFEFEFFFE1E1E1FFE1E1E1FFE1E1E1FFE1E1E1FFBFBFBFFFC1C1
+        C1FFC2C2C2FFC3C3C3FFD1D1D1FF09090966070707340B0B0B000D0D0D000606
+        06000000000000000000000000000000000000000000FFFFFF00FFFFFF003D3D
+        3D66EFEFEFFFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFE3E3E3FFC2C2
+        C2FFC3C3C3FFC5C5C5FFC6C6C6FFD4D4D4FF0E0E0E660C0C0C34111111001717
+        17001803710008012600000000000000000000000000FFFFFF00FFFFFF004B4B
+        4B66EFEFEFFFE8E8E8FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5
+        E5FFC5C5C5FFC6C6C6FFC7C7C7FFC9C9C9FFD7D7D7FF14141466121212341717
+        170020039600200298001902740011014E0011014F00FFFFFF00FFFFFF005656
+        563453535366F0F0F0FFE9E9E9FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7
+        E7FFE7E7E7FFC7C7C7FFC9C9C9FFCACACAFFCCCCCCFFD9D9D9FF1B1B1B661919
+        1934200396002002980021029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005C5C5C345A5A5A66F1F1F1FFEBEBEBFFE9E9E9FFE9E9E9FFE9E9E9FFE9E9
+        E9FFE9E9E9FFE9E9E9FFCACACAFFCCCCCCFFCECECEFFCFCFCFFFDCDCDCFF2002
+        98982003974D2002980021029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D006262623460606066F3F3F3FFEDEDEDFFEBEBEBFFEBEBEBFFEBEB
+        EBFFEBEBEBFFEBEBEBFFEBEBEBFFCECECEFFCFCFCFFFD1D1D1FF8D7CD1FFA08F
+        E4FF210299962102994C21029A0021029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D00636363006868683466666666F4F4F4FFEFEFEFFFEEEEEEFFEEEE
+        EEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFD1D1D1FF8D7CD1FF8F7ED3FF907F
+        D4FFA291E6FF21029B9421029B4B21029C0021029E00FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006E6E6E346C6C6C66F5F5F5FFF1F1F1FFF0F0
+        F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFAE9DE7FF8F7ED3FF907FD4FF9180
+        D5FF9382D7FFA594E9FF21029D9221029C4A21029E00FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F007474743472727266F6F6F6FFF4F4
+        F4FFF3F3F3FFF3F3F3FFF3F3F3FFAE9DE7FFAF9EE8FFB1A0E9FF9180D5FF9382
+        D7FF9483D8FF9584D9FFA796EBFF22029F9121029E49FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007979793478787866F8F8
+        F8FFF6F6F6FFF5F5F5FFAE9DE7FFAF9EE8FFB1A0E9FFB2A1E9FFB3A2EAFF9483
+        D8FF9584D9FF9685DAFF9786DBFFA998EDFF2202A08FFFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A007F7F7F347D7D
+        7D66F9F9F9FFB2A1ECFFAF9EE8FFB1A0E9FFB2A1E9FFB3A2EAFFB4A3EBFFB5A4
+        EBFF9685DAFF9786DBFF9887DCFFAA99EEFF2202A38CFFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008484
+        84342402AE80C1B0FAFFB5A4EDFFB2A1E9FFB3A2EAFFB4A3EBFFB5A4EBFFB6A5
+        ECFFB7A6ECFF9887DCFFAA99EEFF2302A6892302A545FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0402502B07FC3B2FBFFB7A6EFFFB4A3EBFFB5A4EBFFB6A5ECFFB7A6
+        ECFFB8A7EDFFCAB9FEFF2402A9852302A8442302A500FFFFFF00FFFFFF005757
+        57005D5D5D0063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1402502B17EC6B5FCFFBAA9F0FFB6A5ECFFB7A6ECFFB8A7
+        EDFFCAB9FEFF2402AC822402AB422302A8002302A500FFFFFF00FFFFFF001616
+        16004646460063636300696969006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1002502B23F2502B27DC8B7FDFFBCABF1FFB8A7EDFFCAB9
+        FEFF2502AF7F2402AE402402AB002302A8002302A500FFFFFF00FFFFFF000000
+        000000000000191919004F4F4F006F6F6F00757575007A7A7A00808080008585
+        85002502B0002502B1002502B2002502B43E2502B37CC9B8FEFFCAB9FEFF2502
+        B27E2502B1402402AE002402AB002302A8002302A500FFFFFF00FFFFFF000000
+        00000000000000000000000000001C1C1C00585858007A7A7A00808080008585
+        85002502B0002502B1002502B2002502B4002602B53E2602B47B2502B47B2502
+        B33E2502B1002402AE002402AB002302A8002302A500FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      GlyphShowMode = gsmAlways
+      OnClick = CDVDBtnClick
+      TabOrder = 0
+    end
+    object Label8: TLabel
+      Left = 184
+      Height = 25
+      Top = 32
+      Width = 40
+      Caption = '        '
+    end
+    object Label28: TLabel
+      Left = 8
+      Height = 25
+      Top = 32
+      Width = 80
+      Caption = 'MouseXY '
+    end
+    object Label1: TLabel
+      Left = 8
+      Height = 25
+      Top = 10
+      Width = 79
+      Caption = 'KnobType'
+    end
+    object KnobTypeLbl: TLabel
+      Left = 184
+      Height = 25
+      Top = 10
+      Width = 40
+      Caption = '        '
+    end
+  end
+  object RangesGb: TGroupBox
+    Left = 968
+    Height = 456
+    Top = 16
+    Width = 288
+    Caption = 'Ranges'
+    ClientHeight = 426
+    ClientWidth = 284
+    ParentBackground = False
+    ParentColor = False
+    TabOrder = 3
+    object Label29: TLabel
+      Left = 8
+      Height = 25
+      Top = 16
+      Width = 72
+      Caption = 'MinValue'
+    end
+    object Label30: TLabel
+      Left = 8
+      Height = 25
+      Top = 54
+      Width = 75
+      Caption = 'MaxValue'
+    end
+    object Label31: TLabel
+      Left = 8
+      Height = 25
+      Top = 88
+      Width = 82
+      Caption = 'StartAngle'
+    end
+    object Label32: TLabel
+      Left = 8
+      Height = 25
+      Top = 126
+      Width = 76
+      Caption = 'EndAngle'
+    end
+    object MinValueEdt: TEdit
+      Left = 128
+      Height = 33
+      Top = 8
+      Width = 113
+      TabOrder = 0
+      Text = '0.0'
+      OnKeyDown = MinValueEdtKeyDown
+    end
+    object SetMinValueBtn: TSpeedButton
+      Left = 240
+      Height = 33
+      Hint = 'Set MinValue Property'
+      Top = 8
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF003535
+        352B55555503FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434342C3333
+        33FF343539EA42516ABC4762822FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555033435
+        39EA333333FF333434FF4C668FFC5F8DD4AA618BD54200FFFF01FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004151
+        6ABC333434FF4C668EFF5F8DD3FF5F8DD3FF5F8DD3FF5E8CD3D84E7DC55CFFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00475C
+        7D2F4C668FFC5F8DD3FF5F8DD3FF5F8DD3FF5F8DD3FF598DD0CC2674AEF72D5B
+        A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF005F8ED2AB5F8DD3FF5F8DD3FF5F8DD3FF5891D2CC16A2C4F71C8BB7FF2473
+        ACFF2B5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00618BD5425F8DD3FF5F8DD3FF5696D5CC07D3DBF70DBCCFFF14A3C3FF1C8B
+        B8FF2473ACFF2D5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF005F8DD3D55894D5CC03FAFDF700EAEAFF04D4DBFF0CBCCFFF14A3
+        C3FF1C8BB8FF2473ACFF2B59A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF004E80C25C2092C1F80EC9E0FF00FFFFFF00EAEAFF04D4DAFF0DBC
+        CFFF14A3C3FF1C8BB8FF2372ACFF2D5BA283FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002B5A9F821D92C0FF0ECAE0FF00FEFEFF00EAEAFF05D4
+        DBFF0CBCCFFF14A3C3FF1C8BB8FF2473ACFF2D5BA289FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0FCAE1FF00FEFEFF00EA
+        EAFF05D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2472ACFF2D5BA089FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0ECAE0FF00FE
+        FEFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB7FF2473ACFF2B59A089FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA0831D92C1FF0ECA
+        E0FF00FFFFFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2473ACFF2D5B
+        A083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA1821D92
+        C0FF0EC9E0FF00FFFFFF00EAEAFF05D4DBFF0CBCCFFF14A3C3FF1B8BB7FC6C92
+        ADC499999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5A
+        A1821D91C0FF0ECAE0FF00FEFEFF00EAEAFF04D3DAFF0CBCCFFC7ABECEC4C2C2
+        C2FFAEAEAEFF99999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF002B5A9F821D92C0FF0FCAE1FF00FEFEFF00EAEAFC88EAEEC5EBEBEBFFD6D6
+        D6FFC2C2C2FFAEAEAEFF5D5DA073FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF002B5AA1821D92C0FF0EC9E0FC70EAEAC4EAEAEAFFFFFFFFFFEBEB
+        EBFFD7D7D7FF6F6FC7C70000BBFB0000AB89FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002D5BA0836BA1B6C4C1C1C1FFD6D6D6FFEBEBEBFFFFFF
+        FFFF8585EBC40000DEFB0000CDFF0000BCFF0000AB89FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF0099999982AEAEAEFFC2C2C2FFD6D6D6FF8383
+        ECC70000FEFC0000F0FF0000DEFF0000CDFF0000BBDD0000AF10FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098989881AEAEAEFF6F6FC5C60000
+        DCFB0000ECFF0000FDFF0000F0FF0000DFE00000C921FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005D5DA0730000BAFC0000
+        CBFF0000DCFF0000ECFF0000FDDD0000EE1EFFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000AB820000
+        BBFF0000CBFF0000DCE00000F021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        AB820000BBE00000D121FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF000000AF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SetMinValueBtnClick
+      ShowHint = True
+      ParentShowHint = False
+    end
+    object MaxValueEdt: TEdit
+      Left = 128
+      Height = 33
+      Top = 45
+      Width = 113
+      TabOrder = 1
+      Text = '360.0'
+      OnKeyDown = MaxValueEdtKeyDown
+    end
+    object SetMaxValueBtn: TSpeedButton
+      Left = 240
+      Height = 33
+      Hint = 'Set MaxValue Property'
+      Top = 40
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF003535
+        352B55555503FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434342C3333
+        33FF343539EA42516ABC4762822FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555033435
+        39EA333333FF333434FF4C668FFC5F8DD4AA618BD54200FFFF01FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004151
+        6ABC333434FF4C668EFF5F8DD3FF5F8DD3FF5F8DD3FF5E8CD3D84E7DC55CFFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00475C
+        7D2F4C668FFC5F8DD3FF5F8DD3FF5F8DD3FF5F8DD3FF598DD0CC2674AEF72D5B
+        A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF005F8ED2AB5F8DD3FF5F8DD3FF5F8DD3FF5891D2CC16A2C4F71C8BB7FF2473
+        ACFF2B5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00618BD5425F8DD3FF5F8DD3FF5696D5CC07D3DBF70DBCCFFF14A3C3FF1C8B
+        B8FF2473ACFF2D5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF005F8DD3D55894D5CC03FAFDF700EAEAFF04D4DBFF0CBCCFFF14A3
+        C3FF1C8BB8FF2473ACFF2B59A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF004E80C25C2092C1F80EC9E0FF00FFFFFF00EAEAFF04D4DAFF0DBC
+        CFFF14A3C3FF1C8BB8FF2372ACFF2D5BA283FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002B5A9F821D92C0FF0ECAE0FF00FEFEFF00EAEAFF05D4
+        DBFF0CBCCFFF14A3C3FF1C8BB8FF2473ACFF2D5BA289FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0FCAE1FF00FEFEFF00EA
+        EAFF05D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2472ACFF2D5BA089FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0ECAE0FF00FE
+        FEFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB7FF2473ACFF2B59A089FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA0831D92C1FF0ECA
+        E0FF00FFFFFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2473ACFF2D5B
+        A083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA1821D92
+        C0FF0EC9E0FF00FFFFFF00EAEAFF05D4DBFF0CBCCFFF14A3C3FF1B8BB7FC6C92
+        ADC499999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5A
+        A1821D91C0FF0ECAE0FF00FEFEFF00EAEAFF04D3DAFF0CBCCFFC7ABECEC4C2C2
+        C2FFAEAEAEFF99999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF002B5A9F821D92C0FF0FCAE1FF00FEFEFF00EAEAFC88EAEEC5EBEBEBFFD6D6
+        D6FFC2C2C2FFAEAEAEFF5D5DA073FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF002B5AA1821D92C0FF0EC9E0FC70EAEAC4EAEAEAFFFFFFFFFFEBEB
+        EBFFD7D7D7FF6F6FC7C70000BBFB0000AB89FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002D5BA0836BA1B6C4C1C1C1FFD6D6D6FFEBEBEBFFFFFF
+        FFFF8585EBC40000DEFB0000CDFF0000BCFF0000AB89FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF0099999982AEAEAEFFC2C2C2FFD6D6D6FF8383
+        ECC70000FEFC0000F0FF0000DEFF0000CDFF0000BBDD0000AF10FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098989881AEAEAEFF6F6FC5C60000
+        DCFB0000ECFF0000FDFF0000F0FF0000DFE00000C921FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005D5DA0730000BAFC0000
+        CBFF0000DCFF0000ECFF0000FDDD0000EE1EFFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000AB820000
+        BBFF0000CBFF0000DCE00000F021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        AB820000BBE00000D121FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF000000AF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SetMaxValueBtnClick
+      ShowHint = True
+      ParentShowHint = False
+    end
+    object StartAngleEdt: TEdit
+      Left = 128
+      Height = 33
+      Top = 80
+      Width = 113
+      TabOrder = 2
+      Text = '30.0'
+      OnKeyDown = StartAngleEdtKeyDown
+    end
+    object SetStartAngleBtn: TSpeedButton
+      Left = 238
+      Height = 33
+      Hint = 'Set StartAngle Property'
+      Top = 80
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF003535
+        352B55555503FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434342C3333
+        33FF343539EA42516ABC4762822FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555033435
+        39EA333333FF333434FF4C668FFC5F8DD4AA618BD54200FFFF01FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004151
+        6ABC333434FF4C668EFF5F8DD3FF5F8DD3FF5F8DD3FF5E8CD3D84E7DC55CFFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00475C
+        7D2F4C668FFC5F8DD3FF5F8DD3FF5F8DD3FF5F8DD3FF598DD0CC2674AEF72D5B
+        A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF005F8ED2AB5F8DD3FF5F8DD3FF5F8DD3FF5891D2CC16A2C4F71C8BB7FF2473
+        ACFF2B5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00618BD5425F8DD3FF5F8DD3FF5696D5CC07D3DBF70DBCCFFF14A3C3FF1C8B
+        B8FF2473ACFF2D5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF005F8DD3D55894D5CC03FAFDF700EAEAFF04D4DBFF0CBCCFFF14A3
+        C3FF1C8BB8FF2473ACFF2B59A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF004E80C25C2092C1F80EC9E0FF00FFFFFF00EAEAFF04D4DAFF0DBC
+        CFFF14A3C3FF1C8BB8FF2372ACFF2D5BA283FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002B5A9F821D92C0FF0ECAE0FF00FEFEFF00EAEAFF05D4
+        DBFF0CBCCFFF14A3C3FF1C8BB8FF2473ACFF2D5BA289FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0FCAE1FF00FEFEFF00EA
+        EAFF05D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2472ACFF2D5BA089FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0ECAE0FF00FE
+        FEFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB7FF2473ACFF2B59A089FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA0831D92C1FF0ECA
+        E0FF00FFFFFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2473ACFF2D5B
+        A083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA1821D92
+        C0FF0EC9E0FF00FFFFFF00EAEAFF05D4DBFF0CBCCFFF14A3C3FF1B8BB7FC6C92
+        ADC499999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5A
+        A1821D91C0FF0ECAE0FF00FEFEFF00EAEAFF04D3DAFF0CBCCFFC7ABECEC4C2C2
+        C2FFAEAEAEFF99999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF002B5A9F821D92C0FF0FCAE1FF00FEFEFF00EAEAFC88EAEEC5EBEBEBFFD6D6
+        D6FFC2C2C2FFAEAEAEFF5D5DA073FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF002B5AA1821D92C0FF0EC9E0FC70EAEAC4EAEAEAFFFFFFFFFFEBEB
+        EBFFD7D7D7FF6F6FC7C70000BBFB0000AB89FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002D5BA0836BA1B6C4C1C1C1FFD6D6D6FFEBEBEBFFFFFF
+        FFFF8585EBC40000DEFB0000CDFF0000BCFF0000AB89FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF0099999982AEAEAEFFC2C2C2FFD6D6D6FF8383
+        ECC70000FEFC0000F0FF0000DEFF0000CDFF0000BBDD0000AF10FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098989881AEAEAEFF6F6FC5C60000
+        DCFB0000ECFF0000FDFF0000F0FF0000DFE00000C921FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005D5DA0730000BAFC0000
+        CBFF0000DCFF0000ECFF0000FDDD0000EE1EFFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000AB820000
+        BBFF0000CBFF0000DCE00000F021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        AB820000BBE00000D121FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF000000AF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SetStartAngleBtnClick
+      ShowHint = True
+      ParentShowHint = False
+    end
+    object EndAngleEdt: TEdit
+      Left = 128
+      Height = 33
+      Top = 118
+      Width = 113
+      TabOrder = 3
+      Text = '330.0'
+      OnKeyDown = EndAngleEdtKeyDown
+    end
+    object SetEndAngleBtn: TSpeedButton
+      Left = 240
+      Height = 33
+      Hint = 'Set EndAngle Property'
+      Top = 118
+      Width = 35
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        2000000000000009000064000000640000000000000000000000FFFFFF003535
+        352B55555503FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003434342C3333
+        33FF343539EA42516ABC4762822FFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555033435
+        39EA333333FF333434FF4C668FFC5F8DD4AA618BD54200FFFF01FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004151
+        6ABC333434FF4C668EFF5F8DD3FF5F8DD3FF5F8DD3FF5E8CD3D84E7DC55CFFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00475C
+        7D2F4C668FFC5F8DD3FF5F8DD3FF5F8DD3FF5F8DD3FF598DD0CC2674AEF72D5B
+        A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF005F8ED2AB5F8DD3FF5F8DD3FF5F8DD3FF5891D2CC16A2C4F71C8BB7FF2473
+        ACFF2B5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00618BD5425F8DD3FF5F8DD3FF5696D5CC07D3DBF70DBCCFFF14A3C3FF1C8B
+        B8FF2473ACFF2D5BA089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF005F8DD3D55894D5CC03FAFDF700EAEAFF04D4DBFF0CBCCFFF14A3
+        C3FF1C8BB8FF2473ACFF2B59A089FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF004E80C25C2092C1F80EC9E0FF00FFFFFF00EAEAFF04D4DAFF0DBC
+        CFFF14A3C3FF1C8BB8FF2372ACFF2D5BA283FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002B5A9F821D92C0FF0ECAE0FF00FEFEFF00EAEAFF05D4
+        DBFF0CBCCFFF14A3C3FF1C8BB8FF2473ACFF2D5BA289FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0FCAE1FF00FEFEFF00EA
+        EAFF05D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2472ACFF2D5BA089FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002D5AA1821D92C0FF0ECAE0FF00FE
+        FEFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB7FF2473ACFF2B59A089FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA0831D92C1FF0ECA
+        E0FF00FFFFFF00EAEAFF04D4DBFF0CBBCFFF14A4C4FF1C8BB8FF2473ACFF2D5B
+        A083FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5AA1821D92
+        C0FF0EC9E0FF00FFFFFF00EAEAFF05D4DBFF0CBCCFFF14A3C3FF1B8BB7FC6C92
+        ADC499999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002B5A
+        A1821D91C0FF0ECAE0FF00FEFEFF00EAEAFF04D3DAFF0CBCCFFC7ABECEC4C2C2
+        C2FFAEAEAEFF99999989FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF002B5A9F821D92C0FF0FCAE1FF00FEFEFF00EAEAFC88EAEEC5EBEBEBFFD6D6
+        D6FFC2C2C2FFAEAEAEFF5D5DA073FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF002B5AA1821D92C0FF0EC9E0FC70EAEAC4EAEAEAFFFFFFFFFFEBEB
+        EBFFD7D7D7FF6F6FC7C70000BBFB0000AB89FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF002D5BA0836BA1B6C4C1C1C1FFD6D6D6FFEBEBEBFFFFFF
+        FFFF8585EBC40000DEFB0000CDFF0000BCFF0000AB89FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF0099999982AEAEAEFFC2C2C2FFD6D6D6FF8383
+        ECC70000FEFC0000F0FF0000DEFF0000CDFF0000BBDD0000AF10FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098989881AEAEAEFF6F6FC5C60000
+        DCFB0000ECFF0000FDFF0000F0FF0000DFE00000C921FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005D5DA0730000BAFC0000
+        CBFF0000DCFF0000ECFF0000FDDD0000EE1EFFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000AB820000
+        BBFF0000CBFF0000DCE00000F021FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+        AB820000BBE00000D121FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF000000AF10FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = SetEndAngleBtnClick
+      ShowHint = True
+      ParentShowHint = False
+    end
+    object ResetRangesBtn1: TBitBtn
+      Left = 3
+      Height = 45
+      Top = 371
+      Width = 272
+      Caption = 'Update All Range Value'
+      Glyph.Data = {
+        36090000424D3609000000000000360000002800000018000000180000000100
+        20000000000000090000640000006400000000000000000000000000000E0000
+        0015000000190000001A00000019000000180000001600000014000000120000
+        00100000000E0000000C0000000A000000080000000600000004000000020000
+        00010000000000000000000000000000000000000000FFFFFF00000000150000
+        00FF01485FC00127346F0000002500000024000000210000001F0000001C0000
+        001900000015000000120000000F0000000C0000000900000006000000040000
+        00020000000000000000000000000000000000000000FFFFFF00000000030155
+        70AFB3DEEFFF4D8DA2D5014E67AB012F3B480000000500000004000000040000
+        0004000000030000000300000002000000020000000100000001000000010000
+        00000000000000000000000000000000000000000000FFFFFF00001C2500016A
+        8B4367AAC3C6B3DEEFFF99CCDDFF00768DC1006E846200364100000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF00005774000073
+        98000072977ACCEEFFFF55AABBFF55CCDDFF00768DC1006E8462006C82000036
+        4100000000000000000000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF00018EAD00018E
+        AD00018EAE32019CB4B46EDDEEFF66DDEEFF55CCDDFF00768DC1006E8462006C
+        8200006C82000036410000000000000000000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CCDDFF00768DC1006E
+        8462006C8200006C8200006C8200003641000000000000000000000000000000
+        00000000000000000000000000000000000000000000FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CCDDFF0076
+        8DC1006E8462006C8200006C8200006C8200006C820000364100000000000000
+        00000000000000000000000000000000000000000000FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CC
+        DDFF00768DC1006E8462006C8200006C8200006C8200006C8200006C82000051
+        620000364100011C2200020202000101270000004B00FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DD
+        EEFF55CCDDFF00768DC1006E8462006C8200006C8200006C8200006C8200006C
+        8200006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EE
+        FFFF66DDEEFF55CCDDFF00768DC1006E8462006C8200006C8200006C8200006C
+        8200006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3BB59019C
+        B4B488EEFFFF66DDEEFF55CCDDFF00768DC1006E8462006C8200006C8200006C
+        8200006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3
+        BB59019CB4B488EEFFFF66DDEEFF55CCDDFF00768DC1006E8462006C8200006C
+        8200006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CCDDFF00768DC1006E8462006C
+        8200006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CCDDFF00768DC1006E
+        8462006C8200023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CCDDFF0076
+        8DC1006E8462023843000404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DDEEFF55CC
+        DDFF00768DC1031E244D0404040002024D0000009500FFFFFF0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EEFFFF66DD
+        EEFF55CCDDFF0C0C0C870404044602024D0000009500FFFFFF00000000000000
+        0000000000000000000001292F00017B8D0001A4BC0001A4BC0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A3BB59019CB4B488EE
+        FFFFAAAAAAFFBBBBBBFF0C0C0C870101715E00009500FFFFFF00000000000000
+        00000000000000000000000000000000000001292F00017B8D0001A4BC0001A4
+        BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC002B7D893D5555
+        5566FFFFFFFFEEEEEEFFBBBBBBFF000095CC00009566FFFFFF00000000000000
+        000000000000000000000000000000000000000000000000000001292F00017B
+        8D0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC0001A4BC002B7D89005555
+        553455555566FFFFFFFF4444DDFF7777FFFF000095CCFFFFFF00000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        000001292F00017B8D0001A4BC0001A4BC0001A4BC0001A4BC002B7D89005555
+        55002B2B9D4D0101E5AB9999FFFF7777FFFF000099CBFFFFFF00000000000000
+        0000000000000000000000000000000000000000000000000000000000000000
+        0000000000000000000001292F00017B8D0001A4BC0001A4BC002B7D89005555
+        55002B2B9D000101E5560101E5AB0101E1AD0101A92FFFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+        FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
+      }
+      OnClick = ResetRangesBtn1Click
+      TabOrder = 4
+    end
+  end
+  object Label23: TLabel
+    Left = 40
+    Height = 25
+    Top = 168
+    Width = 84
+    Caption = 'Test Knob'
+    Font.Style = [fsBold]
+    ParentFont = False
+  end
+  object Label26: TLabel
+    Left = 16
+    Height = 25
+    Top = 448
+    Width = 68
+    Caption = 'Test v2.0'
+  end
+  object Timer1: TTimer
+    Interval = 3000
+    OnTimer = Timer1Timer
+    Left = 16
+    Top = 368
+  end
+end

+ 500 - 0
test/test_bgraknob/unit1.pas

@@ -0,0 +1,500 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+{
+  v1.0 05-21-2024 Sandy Ganz - Begat. [email protected]
+  v2.0 05-26-2024 Sandy Ganz - Removed SectorDivision stuff, Knob now computes it.
+
+  Hacked up test progam to test the enhanced BGRAKnob.
+}
+
+interface
+
+uses
+  Classes, LCLType, SysUtils, Forms, Controls, Graphics, StdCtrls, Buttons, MaskEdit,
+  ExtCtrls, BGRAKnob, BCTrackbarUpdown;
+
+type
+
+  { TForm1 }
+
+  TForm1 = class(TForm)
+    BitBtn1: TBitBtn;
+    Label22: TLabel;
+    Label23: TLabel;
+    Label26: TLabel;
+    Label9: TLabel;
+    MouseWheelWrapCb: TCheckBox;
+    ReverseScaleCb: TCheckBox;
+    Label1: TLabel;
+    KnobTypeLbl: TLabel;
+    MouseWheelSpeedTB: TBCTrackbarUpdown;
+    BGRAKnob1: TBGRAKnob;
+    CDVDBtn: TBitBtn;
+    ResetRangesBtn1: TBitBtn;
+    Set1000Btn: TButton;
+    SetNeg10Btn: TButton;
+    SetNeg5Btn: TButton;
+    SpeedButton1: TSpeedButton;
+    SpeedButton2: TSpeedButton;
+    StartFromBottomCb: TCheckBox;
+    DVAPGb: TGroupBox;
+    MinValueEdt: TEdit;
+    MaxValueEdt: TEdit;
+    StartAngleEdt: TEdit;
+    EndAngleEdt: TEdit;
+    Label29: TLabel;
+    Label30: TLabel;
+    Label31: TLabel;
+    Label32: TLabel;
+    RangesGb: TGroupBox;
+    Label10: TLabel;
+    Label15: TLabel;
+    Label16: TLabel;
+    Label17: TLabel;
+    Label18: TLabel;
+    Label19: TLabel;
+    Label20: TLabel;
+    Label21: TLabel;
+    MinValueLbl: TLabel;
+    MaxValueLbl: TLabel;
+    Label24: TLabel;
+    Label25: TLabel;
+    StartAngleLbl: TLabel;
+    EndAngleLbl: TLabel;
+    Label28: TLabel;
+    Label7: TLabel;
+    ResetGeneralBtn: TBitBtn;
+    Set50Btn: TButton;
+    Set180Btn: TButton;
+    Set100Btn: TButton;
+    Set360Btn: TButton;
+    Set25Btn: TButton;
+    Set0Btn: TButton;
+    SlowSnapCb: TCheckBox;
+    KnobTypeCb: TComboBox;
+    ValueEdt: TEdit;
+    GroupBox1: TGroupBox;
+    GeneralSettingsGb: TGroupBox;
+    ValueLbl: TLabel;
+    Label11: TLabel;
+    Label12: TLabel;
+    Label13: TLabel;
+    Label14: TLabel;
+    Label2: TLabel;
+    Label3: TLabel;
+    Label4: TLabel;
+    Label5: TLabel;
+    Label6: TLabel;
+    Label8: TLabel;
+    MouseWheelSpeedLbl: TLabel;
+    SetValueBtn: TSpeedButton;
+    SetMinValueBtn: TSpeedButton;
+    SetMaxValueBtn: TSpeedButton;
+    SetStartAngleBtn: TSpeedButton;
+    SetEndAngleBtn: TSpeedButton;
+    Timer1: TTimer;
+
+    procedure BitBtn1Click(Sender: TObject);
+    function KnobTypeToStr(kt : TKnobType) : string;
+    procedure EndAngleEdtKeyDown(Sender: TObject; var Key: Word;
+      {%H-}Shift: TShiftState);
+    procedure MaxValueEdtKeyDown(Sender: TObject; var Key: Word;
+      {%H-}Shift: TShiftState);
+    procedure MinValueEdtKeyDown(Sender: TObject; var Key: Word;
+      {%H-}Shift: TShiftState);
+    procedure MouseWheelSpeedTBChange(Sender: TObject; {%H-}AByUser: boolean);
+    procedure BGRAKnob1Click(Sender: TObject);
+    procedure BGRAKnob1DblClick(Sender: TObject);
+    procedure BGRAKnob1MouseDown(Sender: TObject; {%H-}Button: TMouseButton;
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure BGRAKnob1MouseEnter(Sender: TObject);
+    procedure BGRAKnob1MouseLeave(Sender: TObject);
+    procedure BGRAKnob1MouseMove(Sender: TObject; {%H-}Shift: TShiftState; X,
+      Y: Integer);
+    procedure BGRAKnob1MouseUp(Sender: TObject; {%H-}Button: TMouseButton;
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure BGRAKnob1MouseWheel(Sender: TObject; {%H-}Shift: TShiftState;
+      WheelDelta: Integer; {%H-}MousePos: TPoint; var {%H-}Handled: Boolean);
+    procedure BGRAKnob1ValueChanged(Sender: TObject; Value: single);
+    procedure CDVDBtnClick(Sender: TObject);
+    procedure MouseWheelWrapCbChange(Sender: TObject);
+    procedure ResetRangesBtn1Click(Sender: TObject);
+    procedure ReverseScaleCbChange(Sender: TObject);
+    procedure Set1000BtnClick(Sender: TObject);
+    procedure SetNeg10BtnClick(Sender: TObject);
+    procedure SetNeg5BtnClick(Sender: TObject);
+    procedure SpeedButton1Click(Sender: TObject);
+    procedure SpeedButton2Click(Sender: TObject);
+    procedure StartAngleEdtKeyDown(Sender: TObject; var Key: Word;
+      {%H-}Shift: TShiftState);
+    procedure StartFromBottomCbChange(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure ResetGeneralBtnClick(Sender: TObject);
+    procedure Set50BtnClick(Sender: TObject);
+    procedure Set180BtnClick(Sender: TObject);
+    procedure Set100BtnClick(Sender: TObject);
+    procedure Set360BtnClick(Sender: TObject);
+    procedure Set25BtnClick(Sender: TObject);
+    procedure Set0BtnClick(Sender: TObject);
+    procedure SlowSnapCbChange(Sender: TObject);
+    procedure KnobTypeCbChange(Sender: TObject);
+    procedure SetEndAngleBtnClick(Sender: TObject);
+    procedure SetMaxValueBtnClick(Sender: TObject);
+    procedure SetMinValueBtnClick(Sender: TObject);
+    procedure SetStartAngleBtnClick(Sender: TObject);
+    procedure SetValueBtnClick(Sender: TObject);
+    procedure Timer1Timer(Sender: TObject);
+    procedure ValueEdtKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
+  private
+
+  public
+
+  end;
+
+var
+  Form1: TForm1;
+
+implementation
+
+{$R *.lfm}
+
+{ TForm1 }
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+  MinValueLbl.Caption := FloatToStr(BGRAKnob1.MinValue);
+  MinValueEdt.Text := MinValueLbl.Caption;
+  MaxValueLbl.Caption := FloatToStr(BGRAKnob1.MaxValue);
+  MaxValueEdt.Text := MaxValueLbl.Caption;
+  StartAngleLbl.Caption := FloatToStr(BGRAKnob1.StartAngle);
+  EndAngleLbl.Caption := FloatToStr(BGRAKnob1.EndAngle);
+  SlowSnapCb.Checked := BGRAKnob1.SlowSnap;
+  StartFromBottomCb.Checked := BGRAKnob1.StartFromBottom;
+  ReverseScaleCb.Checked := BGRAKnob1.ReverseScale;
+
+  MouseWheelSpeedTB.Value := BGRAKnob1.WheelSpeed;
+  MouseWheelSpeedLbl.Caption := IntToStr(MouseWheelSpeedTB.Value);
+
+  KnobTypeLbl.Caption := KnobTypeToStr(BGRAKnob1.KnobType);
+
+end;
+
+function TForm1.KnobTypeToStr(kt : TKnobType) : string;
+begin
+  case kt of
+     ktRange   : Result := 'ktRange';
+     ktSector  : Result := 'ktRange';
+  else
+     Result := 'UNKNOWN';
+  end;
+end;
+
+procedure TForm1.BitBtn1Click(Sender: TObject);
+begin
+    ValueLbl.Caption:=FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.BGRAKnob1ValueChanged(Sender: TObject; Value: single);
+begin
+  ValueLbl.Caption:=FloatToStr(Value);
+  MouseWheelSpeedLbl.Caption := IntToStr(BGRAKnob1.WheelSpeed);
+end;
+
+procedure TForm1.CDVDBtnClick(Sender: TObject);
+begin
+  ValueLbl.Caption := '';
+  label2.Caption := '';
+  label3.Caption := '';
+  label4.Caption := '';
+  label5.Caption := '';
+  label6.Caption := '';
+  label8.Caption := '';
+  MouseWheelSpeedLbl.Caption := '';
+  MinValueLbl.Caption := '';
+  MaxValueLbl.Caption := '';
+  StartAngleLbl.Caption := '';
+  EndAngleLbl.Caption := '';
+end;
+
+procedure TForm1.MouseWheelWrapCbChange(Sender: TObject);
+begin
+  BGRAKnob1.WheelWrap := MouseWheelWrapCb.Checked;
+end;
+
+procedure TForm1.StartFromBottomCbChange(Sender: TObject);
+begin
+  BGRAKnob1.StartFromBottom := StartFromBottomCb.Checked;
+end;
+
+procedure TForm1.ReverseScaleCbChange(Sender: TObject);
+begin
+  BGRAKnob1.ReverseScale := ReverseScaleCb.Checked;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.ResetRangesBtn1Click(Sender: TObject);
+begin
+  SetMinValueBtnClick(Nil);
+  SetMaxValueBtnClick(Nil);
+  SetStartAngleBtnClick(Nil);
+  SetEndAngleBtnClick(Nil);
+end;
+
+procedure TForm1.ResetGeneralBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.SlowSnap := True;
+  SlowSnapCb.Checked := True;
+  ReverseScaleCb.Checked := False;
+  MouseWheelWrapCb.Checked := False;
+  BGRAKnob1.StartFromBottom := True;          // Normal Orientation
+  StartFromBottomCb.Checked := True;
+  MouseWheelSpeedTB.Value := 100;
+  KnobTypeCb.ItemIndex := 0; // ktRange type of knob
+  BGRAKnob1.KnobType:= ktRange;
+  MinValueLbl.Caption := FloatToStr(BGRAKnob1.MinValue);
+  MaxValueLbl.Caption := FloatToStr(BGRAKnob1.MaxValue);
+  StartAngleLbl.Caption := FloatToStr(BGRAKnob1.StartAngle);
+  EndAngleLbl.Caption := FloatToStr(BGRAKnob1.EndAngle);
+  KnobTypeLbl.Caption := KnobTypeToStr(BGRAKnob1.KnobType);
+end;
+
+procedure TForm1.StartAngleEdtKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+    if (Key = VK_RETURN) then
+      SetStartAngleBtnClick(nil);
+end;
+
+procedure TForm1.SetNeg5BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:= -5.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SpeedButton1Click(Sender: TObject);
+begin
+  BGRAKnob1.Value := BGRAKnob1.Value + 1.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SpeedButton2Click(Sender: TObject);
+begin
+  BGRAKnob1.Value := BGRAKnob1.Value - 1.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetNeg10BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:= -10.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set0BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=0.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set25BtnClick(Sender: TObject);
+begin
+    BGRAKnob1.Value:=25.0;
+    ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set50BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=50.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set100BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=100.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set180BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=180.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set360BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=360.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Set1000BtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:=1000.0;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SlowSnapCbChange(Sender: TObject);
+begin
+  // Toggle the slow snap feature, makes wrap around more deliberate
+
+  BGRAKnob1.SlowSnap:=SlowSnapCb.Checked;
+end;
+
+procedure TForm1.KnobTypeCbChange(Sender: TObject);
+begin
+    if Sender is TComboBox then
+    with Sender as TComboBox do
+    begin
+         case ItemIndex of
+            0 : begin
+                  // ktRange
+                  BGRAKnob1.KnobType:= ktRange;
+                end;
+            1 : begin
+                  // ktSector
+                  BGRAKnob1.KnobType:= ktSector;
+                end;
+         end;
+    end;
+
+  KnobTypeLbl.Caption := KnobTypeToStr(BGRAKnob1.KnobType);
+  MinValueLbl.Caption := FloatToStr(BGRAKnob1.MinValue);
+  MinValueEdt.Text := MinValueLbl.Caption;
+  MaxValueLbl.Caption := FloatToStr(BGRAKnob1.MaxValue);
+  MaxValueEdt.Text := MaxValueLbl.Caption;
+  StartAngleLbl.Caption := FloatToStr(BGRAKnob1.StartAngle);
+  StartAngleEdt.Text := StartAngleLbl.Caption;
+  EndAngleLbl.Caption := FloatToStr(BGRAKnob1.EndAngle);
+  EndAngleEdt.Text := EndAngleLbl.Caption;
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetStartAngleBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.StartAngle := StrToFloat(StartAngleEdt.Text);
+  StartAngleLbl.Caption := FloatToStr(BGRAKnob1.StartAngle);
+  ValueLbl.Caption:=FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetEndAngleBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.EndAngle := StrToFloat(EndAngleEdt.Text);
+  EndAngleLbl.Caption := FloatToStr(BGRAKnob1.EndAngle);
+  ValueLbl.Caption:=FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetMinValueBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.MinValue := StrToFloat(MinValueEdt.Text);
+  MinValueLbl.Caption := FloatToStr(BGRAKnob1.MinValue);
+  ValueLbl.Caption:=FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetMaxValueBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.MaxValue := StrToFloat(MaxValueEdt.Text);
+  MaxValueLbl.Caption := FloatToStr(BGRAKnob1.MaxValue);
+  ValueLbl.Caption:=FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.SetValueBtnClick(Sender: TObject);
+begin
+  BGRAKnob1.Value:= StrToFloat(ValueEdt.Text);
+  ValueLbl.Caption := FloatToStr(BGRAKnob1.Value);
+end;
+
+procedure TForm1.Timer1Timer(Sender: TObject);
+begin
+  // When the timer fires (after leaving knob area) clear stuff out
+
+  label3.Caption := '';
+  label4.Caption := '';
+  label5.Caption := '';
+  label6.Caption := '';
+  label8.Caption := '';
+end;
+
+procedure TForm1.ValueEdtKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if (Key = VK_RETURN) then
+    SetValueBtnClick(nil);
+end;
+
+procedure TForm1.BGRAKnob1MouseWheel(Sender: TObject; Shift: TShiftState;
+  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
+begin
+     label2.Caption:= IntToStr(WheelDelta);
+end;
+
+procedure TForm1.BGRAKnob1Click(Sender: TObject);
+begin
+  label3.Caption := 'OnClick';
+end;
+
+procedure TForm1.MouseWheelSpeedTBChange(Sender: TObject; AByUser: boolean);
+begin
+  BGRAKnob1.WheelSpeed := MouseWheelSpeedTB.Value;
+  MouseWheelSpeedLbl.Caption := IntToStr(BGRAKnob1.WheelSpeed);
+end;
+
+procedure TForm1.MinValueEdtKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if (Key = VK_RETURN) then
+    SetMinValueBtnClick(nil);
+end;
+
+procedure TForm1.MaxValueEdtKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if (Key = VK_RETURN) then
+    SetMaxValueBtnClick(nil);
+end;
+
+procedure TForm1.EndAngleEdtKeyDown(Sender: TObject; var Key: Word;
+  Shift: TShiftState);
+begin
+  if (Key = VK_RETURN) then
+    SetEndAngleBtnClick(nil);
+end;
+
+procedure TForm1.BGRAKnob1DblClick(Sender: TObject);
+begin
+  label4.Caption := 'DoubleClick';
+end;
+
+procedure TForm1.BGRAKnob1MouseDown(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  label5.Caption := 'MouseDown';
+end;
+
+procedure TForm1.BGRAKnob1MouseEnter(Sender: TObject);
+begin
+  label6.Caption := 'MouseEnter';
+  BGRAKnob1.KnobColor:=clSilver;
+  Timer1.Enabled := False; // While in the knob, turn off the reset timer
+end;
+
+procedure TForm1.BGRAKnob1MouseLeave(Sender: TObject);
+begin
+  label6.Caption := 'MouseLeave';
+  BGRAKnob1.KnobColor:=clMedGray;
+  Timer1.Enabled := True;  // mouse leaves the knob space, turn on reset timer
+end;
+
+procedure TForm1.BGRAKnob1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
+begin
+  label8.Caption := 'X: ' + IntToStr(x) + ' Y: ' + IntToStr(Y);
+end;
+
+procedure TForm1.BGRAKnob1MouseUp(Sender: TObject; Button: TMouseButton;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  label5.Caption := 'MouseUp';
+end;
+
+end.
+