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

📄 teenumericgauge.pas

📁 BCB第三方组件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    $646464
    );

{ TNumericGauge }
Constructor TNumericGauge.Create(AOwner: TComponent);
begin
  inherited;

  FMarkers:=TNumericMarkers.Create;
  FMarkers.FGauge:=Self;

  SetGaugePalette(LCDPalette);

  if (not Assigned(Owner)) or (not (csLoading in Owner.ComponentState)) then
  begin
    FMarkers.Add(FormatFloat(ValueFormat,Value),36,ppCenter,20,4);
    FMarkers.Add('MHz',18,ppLeftBottom,20,4);
    FMarkers.Add('FREQ',11,ppLeftTop,4,20).Shape.Transparent:=False;
  end;
end;

Destructor TNumericGauge.Destroy;
begin
  FMarkers.Free;
  inherited;
end;

class function TNumericGauge.GetEditorClass: String;
begin
  result:='TNumericGaugeEditor';
end;

class procedure TNumericGaugeEditor.AddBrushDialog(ABrush:TChartBrush; AParent:TWinControl);
var tmp : TBrushDialog;
begin
  tmp:=TBrushDialog.Create(AParent.Owner);
  tmp.Align:=alClient;
  tmp.TheBrush:=ABrush;
  tmp.PanelOk.Visible:=False;
  AddFormTo(tmp,AParent);
end;

procedure TNumericGaugeEditor.FormShow(Sender: TObject);
begin
  Gauge:=TCustomGauge(Tag);

  if Assigned(Gauge) then
  begin

    if Gauge is TNumericGauge then
    begin
      Tools:=TMarkersEditor.Create(Self);
      Tools.Tools:=(Gauge as TNumericGauge).Markers;
      Tools.Align:=alClient;
      AddFormTo(Tools,TabSheet2);

      RGFont.ItemIndex:=Ord((Gauge as TNumericGauge).DigitalFont);
    end
    else
    begin
      TabSheet2.TabVisible:=False;
      RGFont.Visible:=False;
    end;

    EValue.Text:=FloatToStr(Gauge.Value);

    AddBrushDialog(Gauge.Frame.OuterBrush,TabSheet4);
    AddBrushDialog(Gauge.Frame.MiddleBrush,TabSheet5);
    AddBrushDialog(Gauge.Frame.InnerBrush,TabSheet6);

    TFormTeeShape.CreateForm(Self,Gauge.Face,TabFace);

    InsertTeeShadowEditor(TabShadow).RefreshControls(Gauge.Frame.Shadow);

    CBFrameVisible.Checked:=Gauge.Frame.Visible;
    UDWidth.Position:=Gauge.Frame.Width;
  end;

  ColorPalettes.AddTo(CBPalette.Items);
end;

function TNumericGauge.UseAxis: Boolean;
begin
  result:=False;
end;

procedure TNumericGauge.SetFont(const Value: TDigitalFont);
begin
  if FFont<>Value then
  begin
    FFont:=Value;
    Repaint;
  end;
end;

class procedure TNumericGauge.CreateSubGallery(
  AddSubChart: TChartSubGalleryProc);
begin
  inherited;
  AddSubChart(TeeMsg_LEDGauge);
end;

procedure TNumericGauge.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineBinaryProperty('InternalMarkers',ReadMarkers,WriteMarkers,Markers.Count>0);
end;

procedure TNumericGauge.SetGaugePalette(const Palette:Array of TColor);

  procedure GetPalette(Marker:TNumericMarker; FontColor,ShapeColor:Integer);
  begin
    if Assigned(Marker) then
    with Marker.Shape do
    begin
      Font.Color:=GetPaletteColor(FontColor);
      Color:=GetPaletteColor(ShapeColor);
    end;
  end;

begin
  inherited;

  if Markers.Count>0 then
     GetPalette(ValueMarker,20,4);

  if Markers.Count>1 then
     GetPalette(UnitsMarker,20,4);

  if Markers.Count>2 then
     GetPalette(TextMarker,4,20);

  (*
  for t:=0 to Markers.Count-1 do
  with Markers[t] do
  if not INotUsePalette then
  begin
    ??
  end;
  *)
end;

class procedure TNumericGauge.SetSubGallery(ASeries: TChartSeries;
  Index: Integer);
begin
  inherited;

  if Index=1 then
  with ASeries as TNumericGauge do
  begin
    DigitalFont:=dfDot;
    SetGaugePalette(LEDPalette);
  end;
end;

procedure TNumericGauge.DrawAllValues;

  procedure DrawMarkers;
  var t    : Integer;
      tmpR : TRect;
      tmpN,
      tmpX,
      tmpY : Integer;
  begin
    for t:=0 to Markers.Count-1 do
    with Markers[t] do
    if Active then
    begin
      case DigitalFont of
        dfBar: Shape.Font.Name:=TeeFontDigital;
        dfDot: Shape.Font.Name:=TeeFontElektra;
      end;

    {  if valueMarker.Text='' then
          valueMarker.Text:='NaN'; } // ??

      tmpR:=GetTextBounds(Self.ParentChart,INewRect,tmpN,tmpX,tmpY);
      Shape.DrawText(Self.ParentChart,tmpR,0,tmpN);
    end;
  end;

begin
  inherited;
  DrawMarkers;
end;

procedure TCustomGauge.CalcOrigRect;
var maxHeight,
    height, width, x, y,
    tmpCount,
    seriesIndex,
    t,
    step : Integer;
begin
  IOrigRect:=ParentChart.ChartRect;

  with Frame.Shadow do
  if Visible then
  begin
    if HorizSize>0 then
       Dec(IOrigRect.Right,HorizSize)
    else
       Inc(IOrigRect.Left,HorizSize);

    if VertSize>0 then
       Dec(IOrigRect.Bottom,VertSize)
    else
       Inc(IOrigRect.Top,VertSize);
  end;

  maxHeight:= (IOrigRect.Bottom-IOrigRect.Top);

  tmpCount:=0;
  seriesIndex:=0;

  with ParentChart do
  for t:=0 to SeriesCount-1 do
    if (Series[t] is TCustomGauge) and Series[t].Visible then
    begin
      Inc(tmpCount);

      if Series[t]=Self then
         seriesIndex:=tmpCount-1;
    end;

  if tmpCount=0 then
     Exit;

  step:= (IOrigRect.Bottom-IOrigRect.Top) div tmpCount;

  height := Math.Min(maxHeight, step) -3;
  width := (IOrigRect.Right-IOrigRect.Left);

  x := IOrigRect.Left;
  y := IOrigRect.Top;

  if tmpCount = 1 then
     Inc(y, 0)
  else
     Inc(y, step * seriesIndex);

  IOrigRect:=TeeRect(x,y, x+width,y+height);
end;

function TCustomGauge.GetPaletteColor(Index: Integer): TColor;
var tmp : Integer;
begin
  tmp:=Length(GaugeColorPalette);

  if tmp=0 then
     if Assigned(ParentChart) then
        result:=ParentChart.GetDefaultColor(Index)
     else
        result:=clBlack
  else
  begin
    if Index>=tmp then
       Index:=tmp-1;

    result:=GaugeColorPalette[Index];
  end;
end;

procedure TNumericGauge.Assign(Source: TPersistent);
begin
  if Source is TNumericGauge then
  with TNumericGauge(Source) do
  begin
    Self.FFont:=FFont;
    Self.Markers:=FMarkers;
  end;

  inherited;
end;

procedure TNumericGauge.SetMarkers(const Value: TNumericMarkers);
begin
  FMarkers.Assign(Value);
end;

procedure TNumericGauge.SetParentChart(const Value: TCustomAxisPanel);
begin
  inherited;

  if not (csDestroying in ComponentState) then
     FMarkers.SetParentChart(ParentChart);
end;

procedure TNumericGauge.AddSampleValues(NumValues: Integer;
  Sequential: Boolean);
begin
  inherited;
  Value:=Value; // force reset text of ValueMarker annotation
end;

procedure TNumericGauge.PrepareForGallery(IsEnabled: Boolean);
begin
  inherited;

  Value:=Random(30);
  ValueMarker.Position:=ppRightBottom;

  ValueMarker.Shape.Font.Size:=18;
  UnitsMarker.Shape.Font.Size:=16;
  TextMarker.Shape.Font.Size:=12;
end;

procedure TNumericGauge.ReadMarkers(Stream: TStream);
var t   : Integer;
    Num : Integer;
    tmp : TNumericMarker;
begin
  Markers.Clear;

  Stream.Read(Num,SizeOf(Num));

  for t:=0 to Num-1 do
  begin
    tmp:=Stream.ReadComponent(nil) as TNumericMarker;
    tmp.FGauge:=Self;
    Markers.Add(tmp);
  end;

  FMarkers.SetParentChart(ParentChart);
end;

procedure TNumericGauge.WriteMarkers(Stream: TStream);
var t : Integer;
begin
  Stream.WriteBuffer(Markers.Count,SizeOf(Markers.Count));

  for t:=0 to Markers.Count-1 do
      Stream.WriteComponent(Markers[t]);
end;

function TNumericGauge.GetTextMarker: TNumericMarker;
begin
  while Markers.Count<3 do
        Markers.Add('');
        
  result:=Markers[2];
end;

function TNumericGauge.GetUnitsMarker: TNumericMarker;
begin
  while Markers.Count<2 do
        Markers.Add('');

  result:=Markers[1];
end;

function TNumericGauge.GetValueMarker: TNumericMarker;
begin
  if Markers.Count=0 then
     Markers.Add('');

  result:=Markers[0];
end;

function TNumericGauge.Clicked(x, y: Integer): Integer;
begin
  result:=inherited Clicked(x,y);

  // Improve: Loop all Markers and return index under mouse,
  // what about back area?
end;

procedure TNumericGauge.ChangeValueMarker;
begin
  if Markers.Count>0 then
     ValueMarker.Text:=FormatFloat(ValueFormat,Value);
end;

procedure TNumericGauge.SetValue(const Value: TChartValue);
begin
  inherited;
  ChangeValueMarker;
end;

function TNumericGauge.NumSampleValues: Integer;
begin
  result:=1;
end;

procedure TNumericGauge.SetValueFormat(const Value: String);
begin
  inherited;
  ChangeValueMarker;
end;

{ TMarkersEditor }

function TMarkersEditor.CloneTool(Tool: TTeeCustomTool): TTeeCustomTool;
begin
  result:=CloneChartTool(Tool,Tool.Owner);
  Tools.Add(result);
  (result as TNumericMarker).FGauge:=(Tools as TNumericMarkers).FGauge;
end;

function TMarkersEditor.GetNewTool: TTeeCustomTool;
begin
  result:=(Tools as TNumericMarkers).Add('Marker');
end;

{ TNumericMarker }
Destructor TNumericMarker.Destroy;
begin
  if Assigned(FGauge) then
  with FGauge.Markers do
       Delete(IndexOf(Self));

  inherited;
end;

{ TNumericMarkers }

function TNumericMarkers.Add(const AText: String): TNumericMarker;
begin
  result:=inherited Add(TNumericMarker) as TNumericMarker;

  with result.Shape do
  begin
    Transparent:=True;
    Font.Name:=TeeFontDigital;
    Pen.Visible:=False;
    Shadow.Visible:=False;
    ParentChart:=Self.FGauge.ParentChart;
  end;

  result.FGauge:=FGauge;
  result.Text:=AText;
end;

function TNumericMarkers.Add(const AText:String; FontSize:Integer; APosition:TAnnotationPosition;
                 FontColor,ShapeColor:Integer):TNumericMarker;
begin
  result:=Add(AText);

  result.Position:=APosition;

⌨️ 快捷键说明

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