📄 teenumericgauge.pas
字号:
$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 + -