diff --git a/components/tachart/tacustomseries.pas b/components/tachart/tacustomseries.pas index d64c15ad99..18c7b3c917 100644 --- a/components/tachart/tacustomseries.pas +++ b/components/tachart/tacustomseries.pas @@ -136,7 +136,7 @@ type protected property Styles: TChartStyles read FStyles write SetStyles; public - procedure Assign(Source: TPersistent); override; + procedure Assign(ASource: TPersistent); override; constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -190,15 +190,20 @@ type FMarkPositions: TLinearMarkPositions; function GetLabelDirection(AIndex: Integer): TLabelDirection; procedure SetMarkPositions(AValue: TLinearMarkPositions); + procedure SetPointer(AValue: TSeriesPointer); procedure SetUseReticule(AValue: Boolean); protected FGraphPoints: array of TDoublePoint; FLoBound: Integer; FMinXRange: Double; + FPointer: TSeriesPointer; FUpBound: Integer; FUseReticule: Boolean; + procedure AfterDrawPointer( + ADrawer: IChartDrawer; AIndex: Integer; const APos: TPoint); virtual; procedure DrawLabels(ADrawer: IChartDrawer); + procedure DrawPointers(ADrawer: IChartDrawer); procedure GetLegendItemsRect(AItems: TChartLegendItems; ABrush: TBrush); function GetXRange(AX: Double; AIndex: Integer): Double; function GetZeroLevel: Double; virtual; @@ -209,7 +214,12 @@ type procedure UpdateMinXRange; property UseReticule: Boolean read FUseReticule write SetUseReticule default false; + protected + property Pointer: TSeriesPointer read FPointer write SetPointer; public + destructor Destroy; override; + public + procedure Assign(ASource: TPersistent); override; function GetNearestPoint( ADistFunc: TPointDistFunc; const APoint: TPoint; out AIndex: Integer; out AImg: TPoint; out AValue: TDoublePoint): Boolean; @@ -486,10 +496,10 @@ begin Source.AfterDraw; end; -procedure TChartSeries.Assign(Source: TPersistent); +procedure TChartSeries.Assign(ASource: TPersistent); begin - if Source is TChartSeries then - with TChartSeries(Source) do begin + if ASource is TChartSeries then + with TChartSeries(ASource) do begin Self.Marks := FMarks; Self.FOnGetMark := FOnGetMark; Self.Source := FSource; @@ -740,6 +750,29 @@ end; { TBasicPointSeries } +procedure TBasicPointSeries.AfterDrawPointer( + ADrawer: IChartDrawer; AIndex: Integer; const APos: TPoint); +begin + Unused(ADrawer); + Unused(AIndex, APos); +end; + +procedure TBasicPointSeries.Assign(ASource: TPersistent); +begin + if ASource is TBasicPointSeries then + with TBasicPointSeries(ASource) do begin + Self.FPointer := Pointer; + Self.FUseReticule := UseReticule; + end; + inherited Assign(ASource); +end; + +destructor TBasicPointSeries.Destroy; +begin + FreeAndNil(FPointer); + inherited; +end; + procedure TBasicPointSeries.DrawLabels(ADrawer: IChartDrawer); var prevLabelPoly: TPointArray; @@ -782,6 +815,23 @@ begin end; end; +procedure TBasicPointSeries.DrawPointers(ADrawer: IChartDrawer); +var + i: Integer; + p: TDoublePoint; + ai: TPoint; +begin + Assert(Pointer <> nil, 'Series pointer'); + if not Pointer.Visible then exit; + for i := FLoBound to FUpBound do begin + p := FGraphPoints[i - FLoBound]; + if not ParentChart.IsPointInViewPort(p) then continue; + ai := ParentChart.GraphToImage(p); + Pointer.Draw(ADrawer, ai, Source[i]^.Color); + AfterDrawPointer(ADrawer, i, ai); + end; +end; + function TBasicPointSeries.GetLabelDirection(AIndex: Integer): TLabelDirection; const DIR: array [Boolean, Boolean] of TLabelDirection = @@ -910,6 +960,12 @@ begin UpdateParentChart; end; +procedure TBasicPointSeries.SetPointer(AValue: TSeriesPointer); +begin + FPointer.Assign(AValue); + UpdateParentChart; +end; + procedure TBasicPointSeries.SetUseReticule(AValue: Boolean); begin if FUseReticule = AValue then exit; diff --git a/components/tachart/taseries.pas b/components/tachart/taseries.pas index 13042a0b26..1fbef0cfa1 100644 --- a/components/tachart/taseries.pas +++ b/components/tachart/taseries.pas @@ -185,25 +185,25 @@ type FLinePen: TPen; FLineType: TLineType; FOnDrawPointer: TSeriesPointerDrawEvent; - FPointer: TSeriesPointer; FShowPoints: Boolean; procedure DrawSingleLineInStack(ADrawer: IChartDrawer; AIndex: Integer); function GetShowLines: Boolean; procedure SetLinePen(AValue: TPen); procedure SetLineType(AValue: TLineType); - procedure SetPointer(Value: TSeriesPointer); procedure SetSeriesColor(AValue: TColor); procedure SetShowLines(Value: Boolean); procedure SetShowPoints(Value: Boolean); protected procedure AfterAdd; override; + procedure AfterDrawPointer( + ADrawer: IChartDrawer; AIndex: Integer; const APos: TPoint); override; procedure GetLegendItems(AItems: TChartLegendItems); override; function GetSeriesColor: TColor; override; public procedure Assign(ASource: TPersistent); override; constructor Create(AOwner: TComponent); override; - destructor Destroy; override; + destructor Destroy; override; procedure Draw(ADrawer: IChartDrawer); override; public @@ -219,7 +219,7 @@ type property MarkPositions; property OnDrawPointer: TSeriesPointerDrawEvent read FOnDrawPointer write FOnDrawPointer; - property Pointer: TSeriesPointer read FPointer write SetPointer; + property Pointer; property SeriesColor: TColor read GetSeriesColor write SetSeriesColor stored false default clBlack; property ShowLines: Boolean @@ -324,7 +324,16 @@ uses procedure TLineSeries.AfterAdd; begin inherited AfterAdd; - FPointer.SetOwner(FChart); + Pointer.SetOwner(FChart); +end; + +procedure TLineSeries.AfterDrawPointer( + ADrawer: IChartDrawer; AIndex: Integer; const APos: TPoint); +var + ic: IChartTCanvasDrawer; +begin + if Supports(ADrawer, IChartTCanvasDrawer, ic) and Assigned(FOnDrawPointer) then + FOnDrawPointer(Self, ic.Canvas, AIndex, APos); end; procedure TLineSeries.Assign(ASource: TPersistent); @@ -334,7 +343,6 @@ begin Self.LinePen := FLinePen; Self.FLineType := FLineType; Self.FOnDrawPointer := FOnDrawPointer; - Self.Pointer := FPointer; Self.FShowPoints := FShowPoints; end; inherited Assign(ASource); @@ -359,7 +367,6 @@ end; destructor TLineSeries.Destroy; begin FreeAndNil(FLinePen); - FreeAndNil(FPointer); inherited; end; @@ -491,24 +498,11 @@ var end; end; -var - i: Integer; - ai: TPoint; - p: TDoublePoint; - ic: IChartTCanvasDrawer; begin DrawLines; DrawLabels(ADrawer); - - if ShowPoints and Pointer.Visible then - for i := FLoBound to FUpBound do begin - p := FGraphPoints[i - FLoBound]; - if not ParentChart.IsPointInViewPort(p) then continue; - ai := ParentChart.GraphToImage(p); - Pointer.Draw(ADrawer, ai, Source[i]^.Color); - if Supports(ADrawer, IChartTCanvasDrawer, ic) and Assigned(FOnDrawPointer) then - FOnDrawPointer(Self, ic.Canvas, i, ai); - end; + if ShowPoints then + DrawPointers(ADrawer); end; procedure TLineSeries.EndUpdate; @@ -567,12 +561,6 @@ begin UpdateParentChart; end; -procedure TLineSeries.SetPointer(Value: TSeriesPointer); -begin - FPointer.Assign(Value); - UpdateParentChart; -end; - procedure TLineSeries.SetSeriesColor(AValue: TColor); begin FLinePen.Color := AValue;