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

📄 teenumericgauge.pas

📁 BCB第三方组件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
{**********************************************}
{   TeeChart Numeric Gauge style               }
{   Copyright (c) 2007 by Steema Software      }
{**********************************************}
unit TeeNumericGauge;
{$I TeeDefs.inc}

interface

uses
  {$IFNDEF LINUX}
  Windows, Messages,
  {$ENDIF}
  SysUtils, Classes, Math,
  {$IFDEF CLX}
  QGraphics, QControls, QForms, QDialogs, QStdCtrls, QExtCtrls, QComCtrls,
  QButtons,
  {$ELSE}
  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons,
  {$ENDIF}
  {$IFDEF CLR}
  Types, Variants,
  {$ENDIF}
  TeeProcs, TeEngine, TeeEdiFont, Chart, TeCanvas, TeeEditTools, TeePenDlg,
  TeeTools;

type
  TNumericGauge=class; // forward

  TNumericMarker=class(TAnnotationTool)
  private
    FGauge : TNumericGauge;

    //INotUsePalette : Boolean;
  public
    Destructor Destroy; override;

    property Gauge:TNumericGauge read FGauge;
  end;

  TNumericMarkers=class(TChartTools)
  private
    FGauge : TNumericGauge;

    function Get(Index: Integer): TNumericMarker;
    procedure Put(Index: Integer; const Value: TNumericMarker);
    procedure SetParentChart(const Value:TCustomTeePanel);
  public
    function Add(const AText:String):TNumericMarker; overload;
    function Add(const AText:String; FontSize:Integer; APosition:TAnnotationPosition;
                 FontColor,ShapeColor:Integer):TNumericMarker; overload;
    procedure Assign(Source:TNumericMarkers); overload;

    property Items[Index:Integer]:TNumericMarker read Get write Put; default;
  end;

  TFramedBorder=class(TPersistent)
  private
    FBrush   : TChartBrush;
    FCircled : Boolean;
    FInner   : TChartBrush;
    FMiddle  : TChartBrush;
    FOuter   : TChartBrush;
    FShadow  : TTeeShadow;
    FVisible : Boolean;
    FWidth   : Integer;

    IOwner   : TChartSeries;

    procedure GetPalette;
    function IsCircledStored:Boolean;
    procedure SetCircled(const Value: Boolean);
    procedure SetInner(const Value: TChartBrush);
    procedure SetMiddle(const Value: TChartBrush);
    procedure SetOuter(const Value: TChartBrush);
    procedure SetShadow(const Value: TTeeShadow);
    procedure SetVisible(const Value: Boolean);
    procedure SetWidth(const Value: Integer);
  protected
    DefaultCircled : Boolean;

    function CalcWidth(const R:TRect):Integer;
    procedure Draw(R:TRect);
  public
    Constructor Create(AOwner:TChartSeries);
    Destructor Destroy; override;

    procedure Assign(Source:TPersistent); override;
  published
    property Circled:Boolean read FCircled write SetCircled
                             stored IsCircledStored;
    property InnerBrush:TChartBrush read FInner write SetInner;
    property MiddleBrush:TChartBrush read FMiddle write SetMiddle;
    property OuterBrush:TChartBrush read FOuter write SetOuter;
    property Shadow:TTeeShadow read FShadow write SetShadow;
    property Visible:Boolean read FVisible write SetVisible default True;
    property Width:Integer read FWidth write SetWidth default 10;
  end;

  TCustomGauge=class(TChartSeries)
  private
    FFace     : TTeeShape;
    FFrame    : TFramedBorder;
    FOnChange : TNotifyEvent;

    function GetValue: TChartValue;
    procedure SetFace(const Value: TTeeShape);
    procedure SetFrame(const Value: TFramedBorder);
  protected
    ICircled  : Boolean;
    INewRect  : TRect;
    IOrigRect : TRect;

    procedure CalcOrigRect; virtual;
    procedure DrawAllValues; override;
    procedure DrawFace; virtual;
    procedure SetGaugePalette(const Palette:Array of TColor); virtual;
    Procedure SetParentChart(Const Value:TCustomAxisPanel); override;
    procedure SetValue(const AValue: TChartValue); virtual;
    procedure SetValues; virtual;
  public
    GaugeColorPalette : TColorArray;

    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;

    procedure Assign(Source:TPersistent); override;
    function Clicked(x,y:Integer):Integer; override;
    function GetPaletteColor(Index:Integer):TColor;

    // To be published:
    property Face:TTeeShape read FFace write SetFace;
    property Frame:TFramedBorder read FFrame write SetFrame;
    property Value:TChartValue read GetValue write SetValue;

    // Event to be published:
    property OnChange:TNotifyEvent read FOnChange write FOnChange;
  end;

  TDigitalFont=(dfBar, dfDot, dfCustom);

  TNumericGauge=class(TCustomGauge)
  private
    FFont    : TDigitalFont;
    FMarkers : TNumericMarkers;

    procedure ChangeValueMarker;
    function GetTextMarker: TNumericMarker;
    function GetUnitsMarker: TNumericMarker;
    function GetValueMarker: TNumericMarker;
    procedure SetFont(const Value: TDigitalFont);
    procedure SetMarkers(const Value: TNumericMarkers);
  protected
    Procedure AddSampleValues(NumValues:Integer; Sequential:Boolean=False); override;
    class Procedure CreateSubGallery(AddSubChart:TChartSubGalleryProc); override;
    procedure DefineProperties(Filer: TFiler); override;
    procedure DrawAllValues; override;
    class Function GetEditorClass:String; override;
    Procedure PrepareForGallery(IsEnabled:Boolean); override;
    procedure ReadMarkers(Stream: TStream);
    procedure SetGaugePalette(const Palette:Array of TColor); override;
    Procedure SetParentChart(Const Value:TCustomAxisPanel); override;
    class Procedure SetSubGallery(ASeries:TChartSeries; Index:Integer); override;
    procedure SetValue(const Value:TChartValue); override;
    Procedure SetValueFormat(Const Value:String); override;
    procedure WriteMarkers(Stream: TStream);
  public
    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;

    procedure Assign(Source:TPersistent); override;
    function Clicked(x,y:Integer):Integer; override;
    Function NumSampleValues:Integer; override;
    function UseAxis:Boolean; override;

    property Markers:TNumericMarkers read FMarkers write SetMarkers;
    property TextMarker:TNumericMarker read GetTextMarker;
    property UnitsMarker:TNumericMarker read GetUnitsMarker;
    property ValueMarker:TNumericMarker read GetValueMarker;
  published
    property Active;
    property Cursor;
    property ParentChart;
    property DataSource;  { after parentchart }
    property PercentFormat;
    property ShowInLegend;
    property Title;
    property ValueFormat;

    { events }
    property AfterDrawValues;
    property BeforeDrawValues;
    property OnAfterAdd;
    property OnBeforeAdd;
    property OnChange;
    property OnClearValues;
    property OnClick;
    property OnDblClick;
    property OnMouseEnter;
    property OnMouseLeave;

    property XValues;
    property YValues;

    property DigitalFont:TDigitalFont read FFont write SetFont default dfBar;
    property Face;
    property Frame;
    property Value;
  end;

  TMarkersEditor=class(TFormTeeTools)
  protected
    function CloneTool(Tool:TTeeCustomTool):TTeeCustomTool; override;
    function GetNewTool:TTeeCustomTool; override;
  end;

  TNumericGaugeEditor = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Label1: TLabel;
    EValue: TEdit;
    Label2: TLabel;
    CBPalette: TComboFlat;
    RGFont: TRadioGroup;
    TabSheet3: TTabSheet;
    PageControl2: TPageControl;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    TabSheet6: TTabSheet;
    TabFace: TTabSheet;
    TabSheet8: TTabSheet;
    Label3: TLabel;
    CBFrameVisible: TCheckBox;
    EWidth: TEdit;
    UDWidth: TUpDown;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    TabShadow: TTabSheet;
    procedure FormShow(Sender: TObject);
    procedure RGFontClick(Sender: TObject);
    procedure CBPaletteChange(Sender: TObject);
    procedure CBFrameVisibleClick(Sender: TObject);
    procedure EWidthChange(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure EValueChange(Sender: TObject);
  private
    { Private declarations }
    Tools : TMarkersEditor;
    procedure IncValue(Delta:Integer);
  protected
    Gauge : TCustomGauge;
  public
    { Public declarations }
    class procedure AddBrushDialog(ABrush:TChartBrush; AParent:TWinControl);
  end;

implementation

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

{$R TeeFonts.res}

uses
  {$IFDEF CLR}
  System.Runtime.InteropServices,
  WinUtils,
  {$ENDIF}
  TeeProCo, TeeBrushDlg, TeeCustomShapeEditor, TeeShadowEditor;

const
  TeeFontElektra='Elektra';
  TeeFontDigital='DS-Digital';

procedure TeeGaugeAddFontNames(Items:TStrings);
begin
  Items.Add(TeeFontElektra);
  Items.Add(TeeFontDigital);
end;

var
  TeeFontLCD : Integer=0;
  TeeFontLED : Integer=0;

procedure AddCustomFonts;

  {$IFDEF CLR}
  {$UNSAFECODE ON}
  {$ENDIF}

  function AddFontFromResource(const ResName:String):Integer; {$IFDEF CLR}unsafe;{$ENDIF}

    function ResourceHandle(const AName:String):THandle;
    begin
      if FindResource(MainInstance, {$IFNDEF CLR}PAnsiChar{$ENDIF}(AName),
                      RT_RCDATA) <> 0 then
         result:=MainInstance
      else
         result:=HInstance;
    end;

  var
    tmp     : TResourceStream;
    MemSize : Int64;
    Buffer  : {$IFDEF CLR}TBytes{$ELSE}Pointer{$ENDIF};

    {$IFDEF CLR}
    tmpPtr  : IntPtr;
    {$ENDIF}

    tmpC    : DWORD;
  begin
    tmp:=TResourceStream.Create(ResourceHandle(resName), resName, RT_RCDATA);
    try
      MemSize:=tmp.Size;  // Windows 2003 "+1" ??

      {$IFDEF CLR}
      SetLength(Buffer, MemSize);
      {$ELSE}
      GetMem(Buffer, MemSize);
      {$ENDIF}

      try
        {$IFDEF CLR}
        tmp.ReadBuffer(Buffer,MemSize);
        {$ELSE}
        tmp.Read(Buffer^,MemSize);
        {$ENDIF}

        tmpC:=1;

        {$IFDEF CLR}
        Marshal.StructureToPtr(TObject(Buffer),tmpPtr,False);
        result:=AddFontMemResourceEx(tmpPtr,MemSize,nil,tmpC);
        {$ELSE}
        result:=AddFontMemResourceEx(Buffer,MemSize,nil,@tmpC);
        {$ENDIF}

        //SendMessage(Application.Handle,WM_FONTCHANGE,0,0);
      finally
        {$IFDEF CLR}
        SetLength(Buffer, 0);
        {$ELSE}
        FreeMem(Buffer);
        {$ENDIF}
      end;
    finally
      tmp.Free;
    end;
  end;

  {$IFDEF CLR}
  {$UNSAFECODE OFF}
  {$ENDIF}

const
  resFile1='TEELCDFONT';
  resFile2='TEELEDFONT';
begin
  TeeFontLCD:=AddFontFromResource(resFile1);
  TeeFontLED:=AddFontFromResource(resFile2);

  // Screen.ResetFonts;  <-- EnumFonts does not recognize newly added fonts,
  // so we use here a "hook" TeeAddFontNames pseudo-event called from TeeEdiFont
  TeeAddFontNames:=TeeGaugeAddFontNames;
end;

procedure RemoveCustomFonts;
begin
  TeeAddFontNames:=nil;

  if TeeFontLCD<>0 then
     RemoveFontMemResourceEx(TeeFontLCD);

  if TeeFontLED<>0 then
     RemoveFontMemResourceEx(TeeFontLED);
end;

const
  LCDPalette : Array[0..23] of TColor=
  (
    $282828,
    $323232,
    $646464,
    $82AAAA,
    $C8DBDB,
    $82AAAA,
    $282864,
    $000000,
    $646464,
    $646464,
    $000000,
    $1EC81E,
    $3C73C8,
    $3C73C8,
    $3C73C8,
    $0A3296,
    $828282,
    $828282,
    $000000,
    $1E1E1E,
    $282828,
    $646464,
    $646464,
    $646464
    );


  LEDPalette : Array[0..23] of TColor=
  (
    $7D3705,
    $C8780A,
    $A05A05,
    $0A0A0A,
    $0A0A0A,
    $0A0A0A,
    $282864,
    $000000,
    $646464,
    $646464,
    $000000,
    $1EC81E,
    $3C73C8,
    $3C73C8,
    $3C73C8,
    $0A3296,
    $828282,
    $828282,
    $000000,
    $1E1E1E,
    $1E1EFF,
    $646464,
    $646464,

⌨️ 快捷键说明

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