⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teelegendscrollbar.pas

📁 BCB第三方组件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
{**********************************************}
{   TeeChart Legend Scrollbar Tool             }
{   Copyright (c) 2003-2007 by David Berneda   }
{**********************************************}
unit TeeLegendScrollBar;
{$I TeeDefs.inc}

interface

uses
  {$IFNDEF LINUX}
  Windows,
  {$ENDIF}
  {$IFDEF CLX}
  QForms, QControls, QGraphics, QExtCtrls, QStdCtrls, QComCtrls,
  {$ELSE}
  Forms, Controls, Graphics, ExtCtrls, StdCtrls, ComCtrls, Buttons,
  {$IFDEF D9}
  Types,
  {$ENDIF}
  {$ENDIF}
  Classes, SysUtils,
  {$IFDEF LINUX}
  Types,
  {$ENDIF}

  {$IFDEF LCL}
  GraphType,
  {$ENDIF}

  TeEngine, Chart, TeeTools, Series, TeeProcs, TeCanvas, TeePenDlg, TeeEdiGrad;

const
  DefaultScrollBarSize=18;

type
  TScrollThumbStyle=(stsCustom, stsThumb1, stsThumb2, stsThumb3, stsThumb4);

  TScrollBarThumb=class(TPersistent)
  private
    FBrush   : TChartBrush;
    FGradient: TTeeGradient;
    FImage   : TTeePicture;
    FSize    : Integer;
    FStyle   : TScrollThumbStyle;

    IScroll  : TTeeCustomTool;
    procedure SetBrush(const Value: TChartBrush);
    procedure SetGradient(const Value: TTeeGradient);
    procedure SetImage(const Value: TTeePicture);
    procedure SetSize(const Value: Integer);
    procedure SetStyle(const Value: TScrollThumbStyle);
  public
    Constructor Create(AOwner:TTeeCustomTool);
    Destructor Destroy; override;

    procedure Assign(Source:TPersistent); override;
  published
    property Brush:TChartBrush read FBrush write SetBrush;
    property Gradient:TTeeGradient read FGradient write SetGradient;
    property Image:TTeePicture read FImage write SetImage;
    property Size:Integer read FSize write SetSize default 0;
    property Style:TScrollThumbStyle read FStyle write SetStyle default stsCustom;
  end;

  TTeeScrollBarDrawStyle=(dsAlways,dsWhenNeeded);

  TTeeScrollBar=class;

  TSetPositionEvent=procedure(Sender:TTeeScrollBar; Value:Integer) of object;

  TTeeScrollBar=class(TTeeCustomTool)
  private
    P1,P2,P3      : TPoint;
    P4,P5,P6      : TPoint;

    FDrawStyle    : TTeeScrollBarDrawStyle;
    FInitial      : Integer;

    ThumbBegin    : Integer;
    ThumbEnd      : Integer;

    FThumb        : TScrollBarThumb;
    FTimer        : TTimer;
    FOnScrolled   : TNotifyEvent;

    FInThumb,
    FInDec,
    FInInc,
    FirstTime     : Boolean;
    OldPoint      : TPoint;
    FHorizontal   : Boolean;

    FBevel        : TPanelBevel;
    R             : TRect;
    FAutoRepeat   : Boolean;
    FSize         : Integer;
    FArrowBrush   : TChartBrush;
    FPosition     : Integer;
    FOnSetPosition: TSetPositionEvent;
    FGradient     : TTeeGradient;
    FOnChangeSize : TNotifyEvent;
    FMinSize      : Integer;

    FDecOutline   : Boolean;
    FIncOutline   : Boolean;

    Procedure ApplyScroll(Delta:Double; ActivateTimer:Boolean);
    Function ClickedDec(const P:TPoint):Boolean;
    Function ClickedInc(const P:TPoint):Boolean;
    function ClickedThumb(const P:TPoint): Boolean;
    Function DecRectangle:TRect;
    Procedure DoScroll;
    Procedure DoTimer(Sender:TObject);
    procedure DrawDecArrow;
    procedure DrawDecOutline;
    procedure DrawIncArrow;
    procedure DrawIncOutline;
    function GetBackColor:TColor;
    function GetThumbBrush:TChartBrush;
    function GetThumbSize:Integer;
    Procedure HideDecOutline;
    Procedure HideIncOutline;
    Function IncRectangle:TRect;
    Procedure MouseMove(X,Y:Integer);
    Procedure MouseUp;
    procedure PrepareOutline;
    Procedure ProcessClick(const P:TPoint);
    procedure SetArrowBrush(const Value: TChartBrush);
    procedure SetBackColor(const Value: TColor);
    procedure SetBevel(const Value: TPanelBevel);
    procedure SetGradient(const Value: TTeeGradient);
    procedure SetHorizontal(const Value: Boolean);
    procedure SetMinSize(const Value: Integer);
    procedure SetSize(const Value: Integer);
    procedure SetThumb(const Value: TScrollBarThumb);
    procedure SetThumbBrush(const Value: TChartBrush);
    procedure SetThumbSize(const Value: Integer);
    Function ThumbRectangle:TRect;
  protected
    Max         : Integer;
    ThumbLength : Integer;

    Function CalcDelta(A,B:Integer):Double; virtual;
    procedure ChartEvent(AEvent:TChartToolEvent); override;
    Procedure ChartMouseEvent( AEvent: TChartMouseEvent;
                               Button:TMouseButton;
                               Shift: TShiftState; X, Y: Integer); override;
    function CurrentCount:Integer; virtual;
    function DeltaMain:Integer; virtual;
    function GetPosition:Integer; virtual;
    procedure Draw;
    class Function GetEditorClass:String; override;
    procedure SetParentChart(const Value: TCustomAxisPanel); override;
    procedure SetPosition(Value:Integer); virtual;
    function ShouldDraw(var R:TRect):Boolean; virtual;
    function TotalCount:Integer; virtual;
  public
    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;

    procedure Assign(Source:TPersistent); override;
    class Function Description:String; override;

    Function MainRectangle:TRect;
    Function ScrollRectangle:TRect;

    property Horizontal:Boolean read FHorizontal write SetHorizontal default False;
    property Position:Integer read GetPosition write SetPosition;
  published
    property Active;
    property ArrowBrush:TChartBrush read FArrowBrush write SetArrowBrush;
    property AutoRepeat:Boolean read FAutoRepeat write FAutoRepeat default True;
    property BackColor:TColor read GetBackColor write SetBackColor default clScrollBar;
    property Bevel:TPanelBevel read FBevel write SetBevel default bvRaised;
    property Brush;
    property DrawStyle:TTeeScrollBarDrawStyle read FDrawStyle
                                              write FDrawStyle;
    property Gradient:TTeeGradient read FGradient write SetGradient;
    property InitialDelay:Integer read FInitial write FInitial default 250;
    property MinThumbSize:Integer read FMinSize write SetMinSize default 4;
    property Pen;
    property Size:Integer read FSize write SetSize default DefaultScrollbarSize;
    property Thumb:TScrollBarThumb read FThumb write SetThumb;
    property ThumbBrush:TChartBrush read GetThumbBrush write SetThumbBrush;
    property ThumbSize:Integer read GetThumbSize write SetThumbSize default 0;

    property OnChangeSize:TNotifyEvent read FOnChangeSize write FOnChangeSize;
    property OnScrolled:TNotifyEvent read FOnScrolled write FOnScrolled;
    property OnSetPosition:TSetPositionEvent read FOnSetPosition write FOnSetPosition;
  end;

  TLegendScrollBar=class(TTeeScrollBar)
  private
    L : TCustomChartLegend;

    function HasPaging:Boolean;
    procedure LegendCalcSize(Sender:TCustomChartLegend; var ASize:Integer);
    procedure SetLegendEvent(Value:TLegendCalcSize);
  protected
    function CurrentCount:Integer; override;
    function DeltaMain: Integer; override;
    function GetPosition:Integer; override;
    procedure SetParentChart(const Value: TCustomAxisPanel); override;
    procedure SetPosition(Value:Integer); override;
    function ShouldDraw(var R:TRect):Boolean; override;
    function TotalCount:Integer; override;
  public
    Destructor Destroy; override;
    class Function Description:String; override;
    class Function LongDescription:String; override;
  end;

  TScrollbarEditor = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Button1: TButton;
    BThumbGrad: TButtonGradient;
    TabSheet3: TTabSheet;
    Label2: TLabel;
    Label3: TLabel;
    CBAuto: TCheckBox;
    Edit1: TEdit;
    UDSize: TUpDown;
    Edit2: TEdit;
    UDDelay: TUpDown;
    ButtonPen1: TButtonPen;
    Button2: TButton;
    Button3: TButton;
    ButtonColor1: TButtonColor;
    BGradient: TButtonGradient;
    Label4: TLabel;
    Edit3: TEdit;
    UDThumbSize: TUpDown;
    GroupBox1: TGroupBox;
    BBrowse: TButton;
    BFilters: TButton;
    Label1: TLabel;
    ComboBox1: TComboFlat;
    CBStyle: TComboFlat;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure CBAutoClick(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure BFiltersClick(Sender: TObject);
    procedure BBrowseClick(Sender: TObject);
    procedure CBStyleChange(Sender: TObject);
  private
    { Private declarations }
    TeeScroll : TTeeScrollBar;
    procedure EnableFilters;
  public
    { Public declarations }
  end;

implementation

uses
  Math, TeeBrushDlg, TeeProCo, TeeFiltersEditor;

{$IFNDEF CLX}
{$IFNDEF LCL}
{$R *.DFM}
{$ENDIF}
{$ELSE}
{$R *.xfm}
{$ENDIF}

{$IFDEF CLR}
{$R 'TeeThumb1.bmp'} // Do not localize
{$R 'TeeThumb2.bmp'} // Do not localize
{$R 'TeeThumb3.bmp'} // Do not localize
{$R 'TeeThumb4.bmp'} // Do not localize
{$ELSE}
{$R TeeLegendScrollBar.res}
{$ENDIF}

type
  TToolAccess=class(TTeeCustomTool);

{ TScrollBarThumb }

Constructor TScrollBarThumb.Create(AOwner:TTeeCustomTool);
begin
  inherited Create;
  IScroll:=AOwner;

  FBrush:=TChartBrush.Create(TToolAccess(IScroll).CanvasChanged);
  FBrush.Color:=clSilver;
  FBrush.BackColor:=clSilver;

  FImage:=TTeePicture.Create;
  FImage.OnChange:=TToolAccess(IScroll).CanvasChanged;
  FGradient:=TTeeGradient.Create(TToolAccess(IScroll).CanvasChanged);
end;

Destructor TScrollBarThumb.Destroy;
begin
  FGradient.Free;
  FImage.Free;
  FBrush.Free;
  inherited;
end;

procedure TScrollBarThumb.Assign(Source:TPersistent);
begin
  if Source is TScrollBarThumb then
  with TScrollBarThumb(Source) do
  begin
    Self.Brush:=Brush;
    Self.Gradient:=Gradient;
    Self.Image:=Image;
    Self.FSize:=FSize;
    Self.FStyle:=FStyle;
  end;

  inherited;
end;

procedure TScrollBarThumb.SetBrush(const Value: TChartBrush);
begin
  FBrush.Assign(Value);
end;

procedure TScrollBarThumb.SetGradient(const Value: TTeeGradient);
begin
  FGradient.Assign(Value);
end;

procedure TScrollBarThumb.SetImage(const Value: TTeePicture);
begin
  FImage.Assign(Value);
end;

procedure TScrollBarThumb.SetSize(const Value: Integer);
begin
  TToolAccess(IScroll).SetIntegerProperty(FSize,Value);
end;

{ This function loads a bitmap from a resource linked to the executable }
Procedure LoadBitmapFromResourceName(ABitmap:TBitmap; const ResName: string);
begin
  {$IFDEF CLR}
  TeeLoadBitmap(ABitmap,ResName,'');
  {$ELSE}
  ABitmap.LoadFromResourceName(HInstance,ResName);
  {$ENDIF}
end;

procedure TScrollBarThumb.SetStyle(const Value: TScrollThumbStyle);
begin
  if FStyle<>Value then
  begin
    FStyle:=Value;

    case FStyle of
      stsThumb1: LoadBitmapFromResourceName(FImage.Bitmap,'TeeThumb1'); // Do not localize
      stsThumb2: LoadBitmapFromResourceName(FImage.Bitmap,'TeeThumb2'); // Do not localize
      stsThumb3: LoadBitmapFromResourceName(FImage.Bitmap,'TeeThumb3'); // Do not localize
      stsThumb4: LoadBitmapFromResourceName(FImage.Bitmap,'TeeThumb4'); // Do not localize
    else
      // stsCustom:
      FImage.Graphic:=nil;
    end;

    if Assigned(FImage.Graphic) then
    begin
      FSize:=FImage.Graphic.Width;
      TTeeScrollBar(IScroll).FSize:=FImage.Graphic.Height;
    end;

    TToolAccess(IScroll).CanvasChanged(Self);
  end;
end;

{ TTeeScrollBar }

Constructor TTeeScrollBar.Create(AOwner: TComponent);
begin
  inherited;
  FAutoRepeat:=True;
  FirstTime:=True;
  FMinSize:=4;
  FSize:=DefaultScrollBarSize;
  FInitial:=250;

  BackColor:=clScrollBar;
  Brush.Color:=clWhite;
  Pen.Color:=clWindowFrame;
  FArrowBrush:=TChartBrush.Create(CanvasChanged);

  FThumb:=TScrollBarThumb.Create(Self);
  FBevel:=bvRaised;
  FGradient:=TTeeGradient.Create(CanvasChanged);
end;

Destructor TTeeScrollBar.Destroy;
begin
  FGradient.Free;
  FThumb.Free;
  FArrowBrush.Free;
  FTimer.Free;
  inherited;
end;

function TTeeScrollBar.ClickedThumb(const P:TPoint): Boolean;
begin
  result:=PointInRect(ThumbRectangle,P);
end;

function TTeeScrollBar.ClickedInc(const P:TPoint): Boolean;
begin
  result:=PointInRect(IncRectangle,P);
end;

function TTeeScrollBar.ClickedDec(const P:TPoint): Boolean;
begin
  result:=PointInRect(DecRectangle,P);
end;

Function TTeeScrollBar.MainRectangle:TRect;
begin
  if Horizontal then
     result:=TeeRect(R.Left,R.Bottom,R.Right,R.Bottom+FSize)
  else
     result:=TeeRect(R.Right-FSize-1,R.Top,R.Right,R.Bottom);
end;

Function TTeeScrollBar.ScrollRectangle:TRect;
begin
  result:=MainRectangle;

  if Horizontal then
  begin
    Inc(result.Left,FSize);
    Dec(result.Right,FSize);
  end
  else
  begin
    Inc(result.Top,FSize);
    Dec(result.Bottom,FSize);
  end;
end;

Function TTeeScrollBar.ThumbRectangle:TRect;
begin
  if Horizontal then
  begin
     result:=TeeRect(ThumbBegin,R.Bottom+1,ThumbEnd,R.Bottom+FSize-1);
     if result.Right-result.Left<2 then
        Inc(result.Right);
  end
  else
     result:=TeeRect(R.Right-FSize,ThumbBegin,R.Right,ThumbEnd);
end;

Function TTeeScrollBar.DecRectangle:TRect;
begin
  if Horizontal then
     result:=TeeRect(R.Left,R.Bottom,R.Left+FSize,R.Bottom+FSize)
  else
     result:=TeeRect(R.Right-FSize-1,R.Top,R.Right,R.Top+FSize);
end;

Function TTeeScrollBar.IncRectangle:TRect;
begin
  if Horizontal then
     result:=TeeRect(R.Right-FSize,R.Bottom,R.Right,R.Bottom+FSize)
  else
     result:=TeeRect(R.Right-FSize-1,R.Bottom-FSize,R.Right,R.Bottom);
end;

procedure TTeeScrollBar.DrawDecArrow;
var tmpMargin : Integer;
begin
  tmpMargin:=FSize div 6;

  // Top Arrow
  with DecRectangle do
  begin
    if Horizontal then
    begin
      P1:=TeePoint(Left+tmpMargin,Top+(FSize div 2));
      P2:=TeePoint(Left+FSize-tmpMargin,Top+tmpMargin);
      P3:=TeePoint(Left+FSize-tmpMargin,Bottom-tmpMargin);
    end
    else
    begin
      P1:=TeePoint(Left+tmpMargin,Top+FSize-2*tmpMargin);
      P2:=TeePoint(Left+(FSize div 2),Top+tmpMargin);
      P3:=TeePoint(Left+FSize-tmpMargin,Top+FSize-2*tmpMargin);
    end;
  end;

  ParentChart.Canvas.Polygon([P1,P2,P3]);
end;

procedure TTeeScrollBar.DrawIncArrow;
var tmpMargin : Integer;
begin
  tmpMargin:=FSize div 6;

  // Bottom Arrow
  if Horizontal then
  begin
    with IncRectangle do
    begin
      P4:=TeePoint(Right-tmpMargin,Top+(FSize div 2));
      P5:=TeePoint(Right-FSize+tmpMargin,Top+tmpMargin);
      P6:=TeePoint(Right-FSize+tmpMargin,Bottom-tmpMargin);
    end;
  end
  else
  begin
    P4:=P1;
    P5:=P2;
    P6:=P3;

    P4.Y:=R.Bottom-FSize+2*tmpMargin;
    P6.Y:=P4.Y;
    P5.Y:=R.Bottom-tmpMargin;
  end;

  ParentChart.Canvas.Polygon([P4,P5,P6]);
end;

procedure TTeeScrollBar.Draw;

  procedure DrawArrows;
  begin
    // Arrows
    with ParentChart.Canvas do
    begin
      Pen.Style:=psClear;

      if FInDec or (Position=0) then
         AssignBrush(FArrowBrush,clDkGray)
      else
         AssignBrush(FArrowBrush);

      DrawDecArrow;
      FDecOutline:=False;

      if FInInc or (Position=TotalCount-CurrentCount) then
      begin
        AssignBrush(FArrowBrush,clDkGray);
        Brush.Bitmap:=nil;
        Brush.Color:=clDkGray;
      end
      else
         AssignBrush(FArrowBrush);

      DrawIncArrow;
      FIncOutline:=False;
    end;
  end;

var Num,
    tmpSize     : Integer;
    tmpItemSize : Double;
    tmpR        : TRect;
    IThumbSize  : Integer;
    tmp         : TGraphic;
begin
  if not Assigned(ParentChart) then
     exit;

  if ShouldDraw(R) then
  begin
    with ParentChart.Canvas do
    begin
      AssignBrush(Self.Brush);
      AssignVisiblePen(Self.Pen);

      if Self.Gradient.Visible then
      begin
        Self.Gradient.Draw(ParentChart.Canvas,MainRectangle);
        Brush.Style:=bsClear;
      end;

      Rectangle(MainRectangle);

      if Assigned(Self.Gradient) then
         AssignBrush(Self.Brush);

      Rectangle(DecRectangle);
      Rectangle(IncRectangle);

      DrawArrows;

      // Thumb
      Num:=TotalCount;

      if Num<>0 then
      begin
        if Self.FHorizontal then
           tmpSize:=R.Right-R.Left-2*FSize
        else
           tmpSize:=R.Bottom-R.Top-2*FSize;

        if FThumb.Size=0 then
        begin
          tmpItemSize:=tmpSize/Num;
          IThumbSize:=Math.Max(FMinSize,Round(CurrentCount*tmpItemSize));
        end
        else
        begin
          IThumbSize:=FThumb.Size;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -