diff --git a/components/tachart/demo/dragdrop/main.lfm b/components/tachart/demo/dragdrop/main.lfm index 3dacb38d0b..005d83a369 100644 --- a/components/tachart/demo/dragdrop/main.lfm +++ b/components/tachart/demo/dragdrop/main.lfm @@ -41,6 +41,7 @@ object Form1: TForm1 OnMouseMove = Chart1MouseMove OnMouseUp = Chart1MouseUp object Chart1LineSeries1: TLineSeries + Marks.Clipped = False Marks.Format = '%0:g' Marks.Style = smsValue OnGetMark = Chart1LineSeries1GetMark diff --git a/components/tachart/demo/dragdrop/main.lrs b/components/tachart/demo/dragdrop/main.lrs index fd4291dcf8..3cef752afd 100644 --- a/components/tachart/demo/dragdrop/main.lrs +++ b/components/tachart/demo/dragdrop/main.lrs @@ -14,8 +14,9 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'ft key'#0#13'Title.Visible'#9#5'Align'#7#8'alClient'#14'DoubleBuffered'#9#11 +'ParentColor'#8#11'OnMouseDown'#7#15'Chart1MouseDown'#11'OnMouseMove'#7#15'C' +'hart1MouseMove'#9'OnMouseUp'#7#13'Chart1MouseUp'#0#11'TLineSeries'#17'Chart' - +'1LineSeries1'#12'Marks.Format'#6#4'%0:g'#11'Marks.Style'#7#8'smsValue'#9'On' - +'GetMark'#7#24'Chart1LineSeries1GetMark'#19'Pointer.Brush.Color'#7#8'clPurpl' - +'e'#17'Pointer.HorizSize'#2#6#13'Pointer.Style'#7#9'psDiamond'#16'Pointer.Ve' - +'rtSize'#2#6#11'SeriesColor'#7#7'clBlack'#10'ShowPoints'#9#0#0#0#0 + +'1LineSeries1'#13'Marks.Clipped'#8#12'Marks.Format'#6#4'%0:g'#11'Marks.Style' + +#7#8'smsValue'#9'OnGetMark'#7#24'Chart1LineSeries1GetMark'#19'Pointer.Brush.' + +'Color'#7#8'clPurple'#17'Pointer.HorizSize'#2#6#13'Pointer.Style'#7#9'psDiam' + +'ond'#16'Pointer.VertSize'#2#6#11'SeriesColor'#7#7'clBlack'#10'ShowPoints'#9 + +#0#0#0#0 ]); diff --git a/components/tachart/demo/dragdrop/main.pas b/components/tachart/demo/dragdrop/main.pas index b8f9a3efe7..6cc86fbeb3 100644 --- a/components/tachart/demo/dragdrop/main.pas +++ b/components/tachart/demo/dragdrop/main.pas @@ -70,17 +70,14 @@ begin Unused(Shift); pt := Point(X, Y); if - TLineSeriesAccess(Chart1LineSeries1). - GetNearestPoint(@PointDist, pt, newNearest, img, val) - then begin - if PointDist(pt, img) <= Sqr(Chart1LineSeries1.Pointer.HorizSize) then begin - if newNearest <> FNearestIndex then begin - FNearestIndex := newNearest; - Chart1.Invalidate; - end; - end - else - FNearestIndex := -1; + not TLineSeriesAccess(Chart1LineSeries1). + GetNearestPoint(@PointDist, pt, newNearest, img, val) or + (PointDist(pt, img) > Sqr(Chart1LineSeries1.Pointer.HorizSize)) + then + newNearest := -1; + if newNearest <> FNearestIndex then begin + FNearestIndex := newNearest; + Chart1.Invalidate; end; if FDragIndex < 0 then exit; Chart1LineSeries1.SetXValue(FDragIndex, Chart1.XImageToGraph(X)); diff --git a/components/tachart/tatypes.pas b/components/tachart/tatypes.pas index 526a105eee..d1b9e72e02 100644 --- a/components/tachart/tatypes.pas +++ b/components/tachart/tatypes.pas @@ -270,6 +270,7 @@ type TChartMarks = class(TChartElement) private + FClipped: Boolean; FDistance: Integer; FFormat: String; FFrame: TChartPen; @@ -278,6 +279,7 @@ type FLinkPen: TChartLinkPen; FStyle: TSeriesMarksStyle; + procedure SetClipped(const AValue: Boolean); procedure SetDistance(const AValue: Integer); procedure SetFormat(const AValue: String); procedure SetFrame(const AValue: TChartPen); @@ -294,6 +296,8 @@ type ACanvas: TCanvas; const ALabelRect: TRect; const AText: String); function IsMarkLabelsVisible: Boolean; published + // If false, labels may overlap axises and legend. + property Clipped: Boolean read FClipped write SetClipped default true; // Distance between series point and label. property Distance: Integer read FDistance write SetDistance default DEF_MARKS_DISTANCE; @@ -988,6 +992,7 @@ end; constructor TChartMarks.Create(AOwner: TCustomChart); begin inherited Create(AOwner); + FClipped := true; FDistance := DEF_MARKS_DISTANCE; InitHelper(TFPCanvasHelper(FFrame), TChartPen); InitHelper(TFPCanvasHelper(FLabelBrush), TChartLabelBrush); @@ -1010,13 +1015,21 @@ end; procedure TChartMarks.DrawLabel( ACanvas: TCanvas; const ALabelRect: TRect; const AText: String); +var + wasClipping: Boolean = false; begin + if not Clipped and ACanvas.Clipping then begin + ACanvas.Clipping := false; + wasClipping := true; + end; ACanvas.Brush.Assign(LabelBrush); ACanvas.Pen.Assign(Frame); ACanvas.Rectangle(ALabelRect); ACanvas.Font.Assign(LabelFont); ACanvas.TextOut( ALabelRect.Left + MARKS_MARGIN_X, ALabelRect.Top + MARKS_MARGIN_Y, AText); + if wasClipping then + ACanvas.Clipping := true; end; function TChartMarks.IsMarkLabelsVisible: Boolean; @@ -1024,6 +1037,13 @@ begin Result := Visible and (Style <> smsNone) and (Format <> ''); end; +procedure TChartMarks.SetClipped(const AValue: Boolean); +begin + if FClipped = AValue then exit; + FClipped := AValue; + StyleChanged(Self); +end; + procedure TChartMarks.SetDistance(const AValue: Integer); begin if FDistance = AValue then exit;