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

📄 teepietool.pas

📁 第三方控件:PaintGrid.pas 网格型仪表控件源文件 Mymeter.pas 圆型仪表控件源文件 Project1是这两个控件的使用范例。 该
💻 PAS
字号:
{******************************************}
{   TeeChart Pie Series Tool               }
{ Copyright (c) 2001-2005 by David Berneda }
{        All Rights Reserved               }
{******************************************}
unit TeePieTool;
{$I TeeDefs.inc}

interface

uses {$IFNDEF LINUX}
     Windows, Messages,
     {$ENDIF}
     SysUtils, Classes,
     {$IFDEF CLX}
     QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls,
     {$ELSE}
     Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
     {$ENDIF}
     TeeTools, TeCanvas, TeEngine, Chart, TeePenDlg;

type
  TPieToolStyle=(ptFocus,ptExplode);

  TPieTool=class(TTeeCustomToolSeries)
  private
    FStyle : TPieToolStyle;

    ISlice : Integer;
  protected
    Procedure ChartMouseEvent( AEvent: TChartMouseEvent;
                               Button:TMouseButton;
                               Shift: TShiftState; X, Y: Integer); override;
    Procedure FocusSlice(ValueIndex:Integer; Focused:Boolean);
    class Function GetEditorClass:String; override;
  public
    Constructor Create(AOwner:TComponent); override;
    class Function Description:String; override;
    property Slice:Integer read ISlice;
  published
    property Active;
    property Pen;
    property Series;
    property Style:TPieToolStyle read FStyle write FStyle default ptFocus;
  end;

  TPieToolEditor = class(TForm)
    Label1: TLabel;
    CBPieSeries: TComboBox;
    RGStyle: TRadioGroup;
    BPen: TButtonPen;
    procedure FormShow(Sender: TObject);
    procedure CBPieSeriesChange(Sender: TObject);
    procedure RGStyleClick(Sender: TObject);
  private
    { Private declarations }
    Tool : TPieTool;
  public
    { Public declarations }
  end;

implementation

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

Uses TeeConst, TeeProCo, Series;

{ TPieTool }
Constructor TPieTool.Create(AOwner: TComponent);
begin
  inherited;
  FStyle:=ptFocus;
  ISlice:=-1;
  Pen.Width:=4;
  Pen.Style:=psSolid;
end;

type TPieSeriesAccess=class(TPieSeries);

Procedure TPieTool.FocusSlice(ValueIndex:Integer; Focused:Boolean);
var PreviousSlice : Integer;
    t             : Integer;
    Delta         : Integer;
    tmpColor      : TColor;
begin
  if Style=ptExplode then
  begin
    if Focused then Delta:=1
               else Delta:=-1;
    for t:=1 to 20 do
    begin
      TPieSeries(Series).ExplodedSlice[ValueIndex]:=2*t*Delta;
      ParentChart.Repaint;
    end;
  end
  else
  begin
    if not Focused then ParentChart.Repaint
    else
    begin
      with Series.ParentChart.Canvas do
      begin
        Brush.Style:=bsClear;

        tmpColor:=Self.Pen.Color;
        if Series.ValueColor[ValueIndex]=Self.Pen.Color then
           if Self.Pen.Color=clBlack then tmpColor:=clWhite
                                     else tmpColor:=clBlack;

        AssignVisiblePenColor(Self.Pen,tmpColor);
      end;
      if ValueIndex=0 then PreviousSlice:=Series.Count-1
                      else PreviousSlice:=Pred(ValueIndex);

      with TPieSeriesAccess(Series) do
      begin
        AngleToPos(Angles[PreviousSlice].EndAngle,XRadius,YRadius,IniX,IniY);
        {$IFDEF LCL}TPieSeriesAccess(Series).{$ENDIF}DrawPie(ValueIndex);
      end;
    end;
  end;
end;

procedure TPieTool.ChartMouseEvent(AEvent: TChartMouseEvent;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var tmp2 : Integer;
begin
  if (AEvent=cmeMove) and Assigned(Series) then
  begin
    tmp2:=Series.Clicked(X,Y);
    if ISlice<>tmp2 then
    begin
      if ISlice<>-1 then FocusSlice(ISlice,False);
      ISlice:=tmp2;
      if ISlice<>-1 then FocusSlice(ISlice,True);
    end;
  end;
end;

class function TPieTool.Description: String;
begin
  result:=TeeMsg_PieTool;
end;

class function TPieTool.GetEditorClass: String;
begin
  result:='TPieToolEditor';
end;

procedure TPieToolEditor.FormShow(Sender: TObject);

  Procedure FillPieSeries(AItems:TStrings);
  var t : Integer;
  begin
    With Tool.ParentChart do
    for t:=0 to SeriesCount-1 do
    if Series[t] is TPieSeries then
        AItems.AddObject(SeriesTitleOrName(Series[t]),Series[t]);
  end;

begin
  Tool:=TPieTool({$IFDEF CLR}TObject{$ENDIF}(Tag));

  if Assigned(Tool) then
  begin
    FillPieSeries(CBPieSeries.Items);
    CBPieSeries.Enabled:=Tool.ParentChart.SeriesCount>0;
    CBPieSeries.ItemIndex:=CBPieSeries.Items.IndexOfObject(Tool.Series);
    RGStyle.ItemIndex:=Ord(Tool.Style);
    BPen.LinkPen(Tool.Pen);
  end;

  Label1.Caption:=TeeMsg_GalleryPie;
end;

procedure TPieToolEditor.CBPieSeriesChange(Sender: TObject);
begin
  With CBPieSeries do
       Tool.Series:=TPieSeries(Items.Objects[ItemIndex]);
end;

procedure TPieToolEditor.RGStyleClick(Sender: TObject);
begin
  Tool.Style:=TPieToolStyle(RGStyle.ItemIndex);
end;

initialization
  RegisterClass(TPieToolEditor);
  RegisterTeeTools([TPieTool]);
finalization
  UnRegisterTeeTools([TPieTool]);
end.

⌨️ 快捷键说明

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